基于MCU的智能家用热水器设计

描述

电热水器作为一种非常普及的家用电器,使用率非常高。市场上传统的电热水器控制精度低、可靠性差。随着人们生活质量的提高,人们对电热水器的要求越来越趋向于智能化和数字化。目前市场上出售的电热水器以贮水式为主,它具有自动恒温、安全可靠、操作简单等优点,深受广大用户的青睐。但是电热水器也普遍存在着这样一对矛盾:小容量电热水器的热水连续供应能力不足,难以满足用户沐浴等需求;大容量电热水器冷态使用时预热时间过长(往往要几个小时),而且当用户只要少量使用热水时,大量的冷水也被加热,能量浪费多。为此,我们提出一个新的设计思路:采用半分隔水箱,结合单片机智能控制技术利用对少量冷水优先快速局部加热,满足在首次使用时快速供应热水的要求;利用对冷水的预加热技术,满足正常使用后实现连续大量供应热水的要求,有效地解决传统电热水器存在的上述矛盾。

(一)水箱设计

储热式电热水器又分为敞开式和封闭式两类。早期的储热式电热水器多为敞开式或开口式的,其结构简单,体积不大,靠吊在高处的压力喷淋,水流量较小,但价格较低,适合于人口少,仅做洗浴使用的家庭购买。敞开式电热水器由于没有对内胆设计承压性能,故不能向其他管路多处供水,功能有限。封闭式电热水器的内胆是密封的,水箱内水压很大,其内胆可耐压,故可多路供水。储热式电热水器可自动恒温保温,停电时可照样供应热水。目前国内市场上的电热水器主要是封闭储热式电热水器,它不必分室安装,不产生有害气体,干净卫生,且可方便地调温。封闭储热式电热水器的工作原理非常简单,它们使用一根电加热管,通电之后给水提供热量。内胆储存热水并承载压力0.6MPa(约6kg/cm2),外壳保温。产品间的区别首先体现在加热管上,有浸没型的,即直接与要加热的水接触,也有隔离型的。加热管由一个温控器来控制,能设定所需温度并保持内胆中的水温恒定,且在50~70℃范围内可调。鉴于封闭式电热水器种种优点,我们决定选择封闭式的热水器。

我们设计的热水器原理图如图1所示。热水器由上下两个桶组成,容量各40L,总共80L,其中下桶为主桶,上桶为储水桶,两个桶外部填塞保温材料。当热水器加满水后,下桶的加热管对冷水进行加热,加热的温度由使用者通过外部的按钮控制,可设定的温度范围是40~80℃。储水桶加热的温度为固定值,当达到90℃后,自动切换到保温状态。整个热水器有四个水管,1号管为出水管,2号和4号管为进水管,3号管为主桶和储水桶的连接管。2、3、4号管均由电磁阀控制其打开和关闭。在热水器使用时,1号出水管和2号进水管打开,3号和4号管关闭。当温度传感器检测到主桶中的水温降到50℃的时候,由单片机控制2号进水管关闭,3号管和4号进水管打开,从而使储水桶中高温度的水进入主桶中,延长热水器可使用的时间。在夏天的时候,由于外界温度较高,不需要使用很多的热水,这时可以将储水桶的加热管电源断开,通过控制外部电路将主桶和储水桶隔离开。此时主桶成为一个独立的热水器,达到节能的效果。2号、3号和4号管的端部经过特殊设计,可使得冷水与热水充分混合。

热水器

图1 热水器原理图

热水器

图2 进水零件剖面图

(二)软硬件设计

首先,我们通过分析可知这个电路包括电源电路、加热控制电路、液位控制电路、电磁阀进水控制电路、按键输入电路、液晶显示电路、蜂鸣报警电路和单片机控制电路等。

热水器

图3 系统设计框图

1、电源电路

电源电路采用普通的220V交流电经过降压整流,然后经过集成稳压器(7824)稳压输出+24V电压。同时该系统还用到12V,5V的电压,通过分压即可得到。电路原理图C5、C6为输入稳定电容,其作用是减少纹波、消振、抑制高频和脉冲干扰。C7、C8为输出稳定电容,其作用是改善负载的瞬态响应。由于热水器周围环境温度过高,使用三端稳压器时要根据输出电流的大小选择散热器,否则会由于过热而无法工作到额定电流。

热水器图4 电源电路原理图

2、加热控制电路

加热丝的加热功率由双向晶闸管来控制,一开始我们选择的是MOC3023,单片机通过光耦合器给晶闸管触发信号,通过控制晶闸管的导通角来控制加热丝的有效加热功率。但是由于在电路中添加过零检测电路,来实现触发脉冲的相位延迟,同时在程序编程中加入中断控制程序,既增加了硬件的复杂性,也给软件编程带来了困难。

经过分析,我们选择用内部带有过零检测电路的光电耦合器MOC3041作为晶闸管的驱动器,同时能实现强、弱电的隔离。传统的加热电路都采用移相触发晶闸管,控制晶闸管的导通角来控制输出功率,不仅同步检测电路复杂,而且在晶闸管导通瞬间会产生高次谐波干扰,造成电网电压波形畸变,影响其他用电设备和通讯系统的正常工作,本系统中采用过零触发晶闸管导通与关断的时间比值来调节加热丝的功率,由于过零触发不改变电压的波形而只改变电压全波通过的次数,不会对电网造成污染。

同时,本系统采用过零触发方式,MOC3041内部含有过零检测电路,当输入引脚1输入15mA的电流,输出端6引脚、4引脚之间的电压稍过零时,内部双向晶闸管导通,触发外部晶闸管导通,当MOC3041输入引脚输入电流为0时,内部双向晶闸管关断,从而外部晶闸管也关断。另外R7、C2组成浪涌吸收电路,防止浪涌电压损坏双向可控硅。R6是双向可控硅的门极电阻,当可控硅灵敏度较高时,门极阻抗也高,并上R6可提高抗干扰的能力。R8是触发功率双向可控硅的限流电阻。

继电器接成常闭开关方式,开始处于加热状态,当温度过高时关掉加热电源,以达到过温保护的目的。继电器的两端必须反接二极管,因为断电瞬间会产生强大的反向电动势,损坏其他器件。继电器通过光耦电路(TLP521-1芯片)来驱动,因为继电器在开关迅速闭合断开的瞬间,会产生很大的电流,极有可能影响到驱动电路部分,从而进一步影响到主板上的其他电路。如果要使光耦系统隔离,就要保证光耦两侧电路的电源必须是各自独立的,从图5中可看到,光耦左侧是单片机系统,电源为5V,右侧为12V。如果右侧系统出现了问题,即使将光耦内部的三极管烧坏,光耦左侧的系统也不会受影响而能够继续正常工作,这就是光耦隔离系统的好处所在。光耦左侧用Q7、R13、R14三个元件来驱动光耦,用三极管的主要目的是提供给光耦开启所需的足够电流。

热水器

图5 加热控制电路原理图

3、电磁阀进水控制电路

在电磁阀进水控制电路中,光耦驱动电路部分和加热控制电路部分一样,不另加分析。P1插针两端接电磁阀,光耦右侧电路部分是MOS管来控制的,当P2.1输入低电平时,Q1导通,光耦右侧电路处于导通状态,这时稳压管的上端达到10V左右,Q2MOS管导通,漏极端为低电平,电磁阀工作,反之不工作。该电路用MOS管也达到弱电、强电分离的效果。因为电磁阀是大感抗器件,在断电瞬间产生很大的电流,影响到驱动电路正常工作。

热水器

图6 电磁阀进水控制电路原理图

4、液位控制电路

ADC0804的VIN+管脚接压力传感器的输出引脚,压力传感器将水位的高度转换成一定的压力,然后转化成模拟电压输出,通过AD转换成数字信号,输入到单片机中。单片机经过处理得到具体的液位,从而进一步控制电磁阀的通断。

热水器

图7 液位控制电路原理图

5、温度检测电路

温度传感器的选择:经比较,我们选择DS18B20温度传感器。它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。

DS18B20温度传感器的特性:

①适应电压范围宽,电压范围在3.0~5.5V。

②测温范围-55 ~ +125℃,在-10~+85℃时精度为±0.5℃。

③可编程分辨率为9~12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃和0.0625℃,可实现高精度测温.

④在9位分辨率时,最多在93.75ms内把温度转化成数字;12位分辨率时,最多在750ms内把温度值转化成数字。

⑤测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。

6、液晶显示电路

在该系统中将12864与单片机并行连接,将12864的第5引脚直接接低电平,第15引脚直接接高电平,以便节省单片机的I/O口。

热水器

图8 12864并行写操作时序图

7、充电电路

在热水器中使用过程中,我们为了充分利用水的动能,我们在阀门的地方安装一个叶轮,同时加一个小功率直流发电机,可以将水的动能转化成电能,储存在电池中。并且发电机电路要用稳压电路,将发出的电压恒定在某一个固定值。即使断电,单片机也可以使用电池的电能,使得一些功能仍然可以实现,比如日期,水位,温度的显示等。当然这个也可以通过单片机实现智能充电器的功能,要实现充电器的智能化,需要应用单片机的处理和控制功能。充电的实现,是在基本的充电电压的基础上,要控制充电过程。

实现的功能模块如下:

(a)实现充电器智能化控制的单片机模块;

(b)采用专用的电池充电芯片实现充电过程控制模块;

(c)采用电压转换芯片提供充电电压模块。

常用的充电电池有镍镉、镍氢及锂离子充电电池三种。镍镉、镍氢充电电池在没有完全放电之后就进行充电,几次之后电池的容量便会减少,这种现象称为记忆效应,锂电池则没有记忆效应,所以锂电池即使在没有放电完全之后就放电,也不会影响电池的容量。

为单片机选择一款合适的充电芯片是非常重要的,需要依照电池类型、电流值、充电方式等几个标准。

(1)MAX1898芯片

经过比较我们选择了MAX1898作为电池的芯片,实现锂离子的充电器,充电快速并且具有较强的电池保护能力。MAX1898配合外部PNP或PMOS三极管可以组成完整的单节电池的充电。MAX1898提供精确地恒流/恒压充电,电池电压调节精度为±0.75%,提高了电池性能,延长了使用寿命。

MAX1898的主要功能特性如下:

使用低成本的PNP或PMOS调整元件;简单、安全的线性充电方式;内置检流电阻,可编程的充电电流;LED充电状态指示;可编程的安全定时器;可选/可调节自动重启;4.5~12V的输入电压范围,输入电源自动监测。

(2)LM7805芯片

该芯片将电压转换成固定的+5V电压提供给相关电路。

(3)6N137芯片

为了降低电源的干扰,保持电路的稳定,完成电压转化之后,需要经过一次光耦模块的处理,通过单片机对光耦模块的控制,可以及时关断充电电源。这里采用的光耦模块为6N137光耦合器。

6N137光耦器工作时,信号从引脚2和引脚3输入,发光二极管发光,经片内光通道传到光敏二极管,反向偏置的光敏管光照后导通,经电流-电压转换后送到与门的一个输入端,与门的另外一个输入端为使能端,当使能端为高电平时与门输出高电平,经输出三极管反向后光电隔离器输出低电平。当输入电流小于触发阈值或使能端为低时,输出高电平,但这个逻辑高电平时集电极开路的,可针对接收电路加上拉电阻或电压调整电路。

8、多机通信电路

现在的问题是如何使用两个桶使得两个桶的效率大于两个单筒效率的总和。由于单个桶的功能已经很清楚,现在着手实现两个桶就比较简单。我们将两个桶上下放置,下桶记为1桶,上桶记为2桶。首先两个桶自动上水,1桶加接近满,然后关闭电磁阀b;2桶加满,然后关闭c;在加水的过程中,中间的电磁阀a一直处于关闭的状态。2桶的加热功率是1桶的两倍多,但是容量只有1桶的一半。当上水完毕后,1桶加热到50℃,2桶加热到70℃,然后处于保温的状态。当1桶水位下降,根据出水管流量的大小,调节中间电磁阀a的阀门大小,将2桶的热水源源不断注入1桶中,同时调节2桶的加热功率,而1桶的加热功率功率只要达到辅热的效果就可以了。当然要用两个单片机使得两个桶达到协和,这样既可以增加控制I/O口,使得控制方便,同时也可以使得运行效率提高,要实现这个功能就要用到单片机的多机通信。

单片机构成的多机系统常采用总线型主从式结构,所谓主从式,即在数个单片机中,有一个是主机,其余都是从机,从机要服从主机的调度、支配。51单片机的串行口方式2和方式3适合于这种主从式通信结构。当然,采用不同的通信标准时,还需要进行相应的电平转换,有时还要对信号进行光电隔离。在实际的多机应用系统中,常采用RS-485串行标准。

多机通信时,通信协议要遵守以下原则:

⑴ 所有从机的SM2位置1,处于接收地址帧状态。

⑵ 主机发送一地址帧,其中8位是地址,第9位为地址/数据分区标志,该位置1表示该帧为地址帧。所有从机收到地址帧后,都将接收的地址与本机的地址比较。对于地址相符的从机,使自己的SM2位置0(以接收主机随机后发来的数据帧),并把本机地址发回主机作为应答;对于地址不符的从机,仍保持SM2=1,对主机随后发来的数据帧不予理睬。

⑶ 从机发送数据结束后,要发送一帧效应和,并置第9为(TB8)为1,作为从机数据结束的标志。

⑷主机接收数据时先判断数据的接收标志(RB8),若RB8=1,表示数据传送结束,并比较此帧效应和,若正确则回送正确信号00H,命令该从机复位(即重新等待地址帧);若效应和出错,则发送信号0FFH,命令该从机重发数据。若接收帧的RB8=0,则将数据存到缓冲区,并准备接收下一帧信息。

⑸主机收到从机应答地址后,确认地址是否相符,如果地址不符,则发复位信号(数据帧中TB8=1);如果地址相符,则TB8清0,开始发送数据。从机收到复位命令后回到监听地址状态(SM2=1),否则开始接收数据和命令。

主要代码如下:

//////#include"BoardConfig.h"
/*液晶接口定义*/
/////#define RS    BIT1
/////#define RW    BIT2
/////#define LCDEN BIT3
/*温度传感器接口操作宏定义*/
#define DQ1 P2OUT |= BIT7
#define DQ0 P2OUT &= ~BIT7
#define DQ_in   P2DIR &= ~BIT7
#define DQ_out  P2DIR |= BIT7
#define DQ_val  (P2IN & BIT7)
/*按键定义*/
#define KEY_SEL  P1SEL
#define KEY_IN   P1IN
#define KEY_OUT  P1OUT
#define KEY_DIR  P1DIR
/***********/
#define beep_baojing   P6OUT^=BIT4
/*定义数组*/
unsigned char table0[]="当前水温:   度";
unsigned char     du[]="度";
unsigned char table1[]="设定水温:   度";
unsigned char table2[]="水位";
unsigned char nRes=30;
unsigned char temprature[2]={0x00,0x00};//用于暂时存放从温度传感器中读出的两个字节数据
/////unsigned char  dot_data[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,//存放小数位的编码
     /////                0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
unsigned char temprature_dis[3]={0,0,0};//最终温度处理结果
unsigned char temprature1[2]={0,0};
///////unsigned char  mytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};//显示温度单位的度(圈)


void  delay(unsigned int z)//普通延时
{
    unsigned int x,y;
    for(x=z;--x;)
     for(y=200;--y;);
}


void delay2(unsigned int a)
{
  while(a--);
}
/*下面是温度传感器的操作程序*/
unsigned char ds18b20_init(void)
{
    unsigned char flag;
   // DQ_out;
    _DINT();
    DQ0;
    delay2(500);
    DQ1;
    delay2(50);
   // DQ_in;
    _NOP();
    if(DQ_val)
    {
        flag = 1;          //初始化失败
    }
    else
    {
        flag = 0;          //初始化成功
    }
    //DQ_out;
    DQ1;
    _EINT();
    delay2(400);
    return flag;
}


unsigned char read8(void)
{
    unsigned char i;
    unsigned char temp = 0;


    _DINT();
    for(i = 0;i < 8;i++)
    {
        temp > >= 1;
        DQ0;
        delay2(5);;            //延时5us
        DQ1;
        delay2(10);            //延时10us
        DQ_in;
        _NOP();
        if(DQ_val)temp |= 0x80;
        delay2(45);;           //延时45us
        DQ_out;
        DQ1;
    }
    _EINT();


    return  temp;
}


void write8(unsigned char datt)
{
  char i,nBit;
  for (i=8; i >0; i--)
  {  
        // DQ_out;// 设定管脚为输出方向


         DQ0;// 将DQ管脚拉低    
    nBit = datt & 0x01;// 输出数据
    if (nBit)
    {
                  DQ1;
    }
    else
    {
       DQ0;
    }    
    delay2(50);// 延时50微妙
          DQ1;// 将DQ管脚拉高
    datt > >= 1;
  }


}


void read_temp()
{


      ds18b20_init();
      write8(0xcc);
      write8(0x44);
      //delay(500);
      ds18b20_init();
      write8(0xcc);
      write8(0xbe);
      temprature[0]=read8();
      temprature[1]=read8();


}
void deal_int()
{


  ///// temprature_dis[2]=(((temprature[1]&0x0f)< < 4)|((temprature[0]&0xf0) > >4))/100+0x30;
   temprature_dis[1]=(((temprature[1]&0x0f)< < 4)|((temprature[0]&0xf0) > >4))%100/10+0x30;
   temprature_dis[0]=(((temprature[1]&0x0f)< < 4)|((temprature[0]&0xf0) > >4))%100%10/1+0x30;
   /////if(temprature_dis[2]==0x30)temprature_dis[2]=0x20;
   if(temprature_dis[1]==0x30)temprature_dis[1]=0x20;


}
/*void deal_dot()
{
 temprature_dis[0]=dot_data[temprature[0]&0x0f]+0x30;
}*/


/*以下是12864液晶程序*/
void lcd12864_write(unsigned char flag,unsigned char dat)
{
      if(flag==1)
        {
         P3OUT |=BIT1;
        }
 else if(flag==0)
        {
         P3OUT&=~BIT1;
        }
         P3OUT&=~BIT2;
         P4OUT=dat;
         delay(2);
         P3OUT |=BIT3;
         delay(2);
         P3OUT&=~BIT3;
}                    
void lcd_init()  
{
    lcd12864_write(0,0x0f);
    delay(1);
    lcd12864_write(0,0x30);              
    delay(1);
    lcd12864_write(0,0x0c);              
    delay(1);
    lcd12864_write(0,0x01);              
    delay(1);
}


void keyPress(void)
{
        int nP10;
        KEY_SEL&=0Xf0;//设置P1.0-P1.3为普通IO
        KEY_DIR&=0Xf0;//P1.0到p1.3为输入
        KEY_OUT=0X0f;//P1.0到P1.3都输出高电平
  nP10 = KEY_IN & 0x0f ;//读入P1.0到P1.3的状态


  /////if (nP10 == 0x0e && nRes < 80) nRes=nRes+1;//P1.0口按键按下
  /////if (nP10 == 0x0d && nRes >40) nRes=nRes-1;//P1.1口按键按下
  /////if (nP10 == 0x0b) nRes = 3;//p1.2口按键按下
  /////if (nP10 == 0x07) nRes = 4;//p1.3口按键按下




        if(nP10 != 0x0f)       //如果有键被按下
        {
            delay(1200);            //延时消抖
            if(nP10 != 0x0f)   //再次检测按键状态
            {
              if (nP10 == 0x0e && nRes < 80) nRes=nRes+1;//P1.0口按键按下
        if (nP10 == 0x0d && nRes >20) nRes=nRes-1;//P1.1口按键按下
             }




                delay(2400);
            }


}


void lcd12864_dis()
{
   unsigned char tem;
   tem=nRes;
   temprature1[0]=tem/10+0x30;
   temprature1[1]=tem%10+0x30;
   lcd12864_write(0,0x95);


   lcd12864_write(1,temprature1[0]);
   lcd12864_write(1,temprature1[1]);


   lcd12864_write(0,0x85);
   /////lcd12864_write(1,temprature_dis[2]);
   lcd12864_write(1,temprature_dis[1]);
   lcd12864_write(1,temprature_dis[0]);
}


/*报警*/
void baojing()
{ unsigned int n=0;
  unsigned int t1;
  t1=(temprature_dis[1]-'0')*10+(temprature_dis[0]-'0');
  if(t1 >=nRes)
  {
     for(n=21;--n;)
     {
       beep_baojing;
       delay(22);
      }
  }
}
 
int main( void )
{
   WDTCTL = WDTPW + WDTHOLD;
//   BoardConfig(0xbe);


   //***********配置时钟*************//
   unsigned int i;
   BCSCTL1 &= ~XT2OFF;                  //打开XT2高频晶体振荡器
    do
    {
       IFG1 &= ~OFIFG;                  //清除晶振失败标志
        for (i = 0xff; i > 0; i--);     //等待8MHz晶体起振
    }
    while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
    BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振
    TACTL |= TASSEL_2 + ID_3;           //计数时钟选择SMLK=8MHz,1/8分频后为1MHz


    //***初始化液晶和温度传感器的端口***//
     P2DIR|=BIT7;/****************************/
                 /*初始化温度数据端输出低电平*/
     P2OUT|=BIT7;/****************************/


     P3DIR|= (BIT1+BIT2+BIT3);/****************************/
                              /*初始化液晶命令端输出低电平*/
     P3OUT&=~(BIT1+BIT2+BIT3);/****************************/


     P4DIR|=0XFF; /****************************/
                  /*初始化液晶数据端输出低电平*/
     P4OUT&=~0XFF;/****************************/


    P6DIR|=BIT4;//初始化蜂鸣器输出
    P6OUT|=BIT4;


     lcd_init();//初始化液晶


     read_temp();//第一次读取温度
     delay(5000);


    /*12864的第一行显示“Current Temp is:”*/
     lcd12864_write(0,0x80);
     i=0;
     while(table0[i]!='�')
     {
      lcd12864_write(1,table0[i]);
      i++;
     }
     lcd12864_write(0,0x90);
     i=0;
     while(table1[i]!='�')
     {
       lcd12864_write(1,table1[i]);
       i++;
     }
     lcd12864_write(0,0x89);
     i=0;
     while(table2[i]!='�')
     {
       lcd12864_write(1,table2[i]);
       i++;
     }
     while(1)
     {
           keyPress();
           read_temp();//read the temprature
           deal_int();//deal the integer
           /////deal_dot();//deal the dot
           baojing();
           lcd12864_dis();
           delay(200);
     }
}

(三)结论与展望

从原理样机来看,我们设计的产品性能更高,在相同的时间里能够产生更多热量,所以本产品更适用于集体住宿人群,比如高校学生公寓、公司职员宿舍以及公共洗浴场所等。

当然由于时间有限,设计过程中仍存在一些问题。比如,在上水时,需要排去桶内的空气,并且需要两个桶中的水一直处于满的状态,这就需要设计排气孔,另外还需要水位检测装置;对于两个桶的比例,需要建立数学模型或者通过实验,确定最佳比例,以此能获得最佳节能效果,后续我们将进一步完善。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分