洗衣机洗涤控制电路设计实例.docx
《洗衣机洗涤控制电路设计实例.docx》由会员分享,可在线阅读,更多相关《洗衣机洗涤控制电路设计实例.docx(27页珍藏版)》请在冰豆网上搜索。
![洗衣机洗涤控制电路设计实例.docx](https://file1.bdocx.com/fileroot1/2023-6/12/8bc763db-e6b9-43a4-abc8-809adef7f4b4/8bc763db-e6b9-43a4-abc8-809adef7f4b41.gif)
洗衣机洗涤控制电路设计实例
洗衣机洗涤控制电路设计实例
一、洗衣机洗涤控制电路的性能要求
1.强洗、标准、轻柔三种洗涤模式
强洗周期水流控制:
正向电机接通5秒后,停2秒;再反向电机接通5秒,停2秒;然后又正向电机接通5秒。
如此循环控制电机,直到洗涤定时结束。
标准洗周期水流控制:
其过程与强洗周期水流控制相同,不同的是正向接通时间为3.5秒,停止时间为1.5秒,反向接通时间为3.5秒。
轻柔洗周期水流控制:
正向接通时间为2.5秒,停止时间为1.5秒,反向接通时间为2.5秒。
2.三种洗涤定时
洗衣机洗涤定时可有三种选择:
5分钟、10分钟、15分钟。
3.上电复位后的初始设定
初始设定为标准模式,定时时间为15分钟。
如需修改可按模式选择按键和定时选择按键。
每按一次按键转换一次,可多次进行循环选择。
当某一次洗涤过程结束后,自动返回初始状态,等待下一次洗涤过程开始。
4.启/停控制
洗涤过程由启/停键控制。
每按一次启/停键,状态转换一次。
5.洗涤定时精度
洗涤定时误差要求不大于0.1秒。
为简化设计洗衣机洗涤控制电路,只要求输出正向和反向的电机控制信号。
二、洗衣机洗涤控制电路的结构
根据上述对洗衣机洗涤控制电路的性能要求,可以画出如图10-17所示的结构框图。
该控制器由四大部分组成:
主分频器、主控制器、洗涤定时器和水流控制器。
洗衣机洗涤控制电路的结构框图
1.主分频器
主分频器用来产生0.1秒的时钟供主控制器使用。
本方案使用民用的石英晶体,其振荡频率为76.8kHz。
这样,主分频器的分频系数为7680。
现采用3个分频器构成主分频器的分频电路。
3个分频器是256分频器、3分频器和10分频器。
主分频器的结构如图10-18所示。
主分频器的结构
2.主控制器
主控制器的输入信号和输出信号如图10-17所示,分别叙述如下。
(1)输入信号:
reset:
上电复位;
start_stop:
启/停按键输入;
modesel:
洗涤模式选择按键输入;
系统时钟输入(sysclk):
76800Hz主时钟;
time_sel:
洗涤定时选择按键输入;
timer_down:
定时到输入。
(2)输出信号:
5min_out:
5分钟定时控制;
10min_out:
10分钟定时控制;
15min_out:
15分钟定时控制;
start_out:
启/停控制;
j_out:
强水流控制;
b_out:
标准水流控制;
z_out:
轻柔水流控制。
3.洗涤定时器
洗涤定时器的功能是根据主控制器送来的有关控制信号,实现5分钟、10分钟和15分钟的洗涤时间控制。
其输入和输出信号分别如下。
(1)输入信号:
s5min_ins10min_in
s15min_instart_in
resetsysclk
(2)输出信号:
timer_on_ou:
定时有效;
timer_down_out:
定时到。
4.水流控制器
水流控制器根据主控制器输出的强、标准、轻柔控制信号产生不同的水流控制周期,去控制洗衣机电机的工作,其输入和输出信号分别如下。
(1)输入信号:
j_inb_in
z_insysclk
clk_01timer_down
resettimer_on
(2)输出信号:
off_out:
电机断开控制信号输出;
on_out:
电机接通控制信号输出。
三、洗衣机洗涤控制电路的算法状态机图描述
1.主控制器算法状态机图描述
根据主控制器的工作要求,洗衣机洗涤时的工作状态共有以下9种:
标准——15分钟标准——10分钟
标准——5分钟轻柔——15分钟
轻柔——10分钟轻柔——5分钟
强洗——15分钟强洗——10分钟
强洗——5分钟
1)模式选择控制状态机图
主控制器算法状态机图
(a)模式选择控制状态机图;(b)定时选择控制状态机图
复位后进入标准洗涤模式,并输出set_b标准模式状态信号。
接着判断定时结束timer_down是否有效。
如果有效,则表明洗涤结束,set_b置“0”回到标准模式状态;如果无效,则判别模式选择按键是否按下。
如果未按下,则仍处于标准状态;如果已按下,则进入轻柔状态。
通过类同的操作和判别,该状态机图可在标准、轻柔、强洗三种模式下循环选择和工作,并送出相应的状态信号。
2)定时选择控制状态机图
定时选择控制状态机图如10-19(b)所示。
其结构与模式选择控制状态机图一致,所不同的仅仅是状态名、状态输出信号及引起状态转换的按键信号。
图中的3个状态分别为
s_5min、s_10min、s_15min。
3个状态输出信号分别为set_5min、set_10min、set_15min。
按键输入信号为timer_sel。
3)启/停控制算法状态机图描述
主控制器还要产生启/停控制信号,启/停控制算法状态机图如下图所示。
上图中只有2种状态:
停止状态和启动状态。
系统复位时进入停止状态s_stop,当start_stop按键按下时,则状态转移至启动状态s_start,并送出启动控制信号start(start='1')。
再按一下start_stop键,状态又能回停止状态,start控制信号置“0”,暂停洗涤工作。
再按一次start_stop按键,系统又回到启动状态。
这样,根据需要可人为地暂停或启动洗衣机工作。
2.洗涤定时器算法状态机图描述
洗涤定时器算法状态机图如图10-21所示。
洗涤定时器有3种状态:
停止状态(IDLE)、计时状态(INCCOUNT)和暂停状态(TMP_STOP)。
系统复位后就进入停止状态(IDLE)。
在停止状态下不断判别启动信号start是否为“1”。
如果为“1”,表明启动键已按下,定时器开始工作,timer_on标志置“1”,转移的下一个状态为计数状态;否则仍留在停止状态。
在计时状态下(INCCOUNT),先要判别启动信号是否仍为“1”。
前面已经提到,启/停按键是一个乒乓按键,按一次启/停按键使start输出状态转换一次。
如果复位后按一下启/停按键,使start=“1”,则定时器开始进行定时计数。
如果再按一次启/停按键就会使start=“0”,定时器就处于暂时停止状态,定时计数值将被保留。
如再按一次启/停键,洗涤定时器继续启动,在原有计时值上进行计时。
如果在计时状态下发现start=“0”,定时器就进入暂停状态(temp_stop),同时timer_on置“0”,定时器停止计数。
在暂停状态下,继续判别start信号。
如果start=“0”,则仍留在暂停状态;如果start=“1”表明定时器再启动,timer_on=“1”,状态将转移至计时状态。
在计时状态下,如果start=“1”,接着就判别分时钟上升沿是否到来s1min。
如果未到来,则仍停留在计时状态;若分时钟的上升沿到来了,分计数器就进行加1操作。
接着判断是否到了指定的定时计时值(定时计数值只有3种:
5分钟、10分钟和15分钟)。
如果未到计时值,仍停留在计时状态;如果到了计时值,则停止计时,Timer_on=“0”,timer_down=“1”,count=“0000”,start=“0”,状态转移至停止状态。
3.水流控制器算法状态机图描述
该状态机图有3种状态:
停止状态(STOP)、电机接通定时计数状态(ON_TIME)和电机断开定时计数状态(OFF_TIME)。
系统复位后进入停止状态,接着判断洗涤定时器是否启动(timer_on='1')。
如果未启动,则仍停留在停止状态;如果已启动,则判别当前是处在电机接通定时计数状态,还是电机处在断开定时计数状态。
根据设置不同,转入相应的状态:
ON_TIME或OFF_TIME。
在ON_TIME状态下,判别timer_on是否继续为“1”(因为洗涤过程有可能暂停)。
如果为“1”,再判别0.1秒时钟clk_01的上升沿是否到来。
如果未到来,则停留在on_timer状态;如果已到来,则电机接通定时计数器加1(count_on=count_on+1)。
下面要判别定时计数值是否到规定时间值:
强 洗counton_u=5秒
标准洗counton_u=3.5秒
轻柔洗counton_u=2.5秒
在未到规定计数值时,返回on_time状态继续进行定时计数;当计数到规定的定时值时,就使cnton_clk、clron、cntoff_inc、setoff置“1”,接着状态转移至电机断开定时计数状态off_timer。
在on_time状态下,如果发现timer_on为“0”,表明洗涤定时过程结束,对水流控制器进行初始化,然后进入停止状态。
电机断开的定时计数状态的工作过程与电机接通定时计数工作过程类同,请读者自行阅读。
下面对标志量的含义作一说明:
seton='1'→on_out='1';
clron='1' →on_out='0';
setoff='1'→off_out='1';
cnton_inc='1'→count_on+1;
cntoff_inc='1'→count_off+1;
四、洗衣机洗涤控制电路的VHDL语言描述
1.主分频器timectr_clkdiv模块
主分频器的功能是将76800Hz的主频分频为10Hz的时钟。
该模块由3个进程组成,其VHDL语言描述的程序清单如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtimectr_clkdivIS
PORT(
sysclk:
INSTD_LOGIC;
clk_01:
OUTSTD_LOGIC);
ENDtimectr_clkdiv;
ARCHITECTURErtlOFtimectr_clkdivIS
SIGNALdiv1:
STD_LOGIC_VECTOR(3DOWNTO0):
="0000";
--divideby256counter
SIGNALdiv2:
STD_LOGIC_VECTOR(7DOWNTO0):
="00000000";
--divideby10counter
SIGNALdiv3:
STD_LOGIC_VECTOR(1DOWNTO0):
="00";
--divideby3counter
SIGNALclk1,clk2:
STD_LOGIC;
BEGIN
div_10:
PROCESS(clk1)
BEGIN
IF(clk1'EVENTANDclk1='1')THEN
IF(div1="1001")THENdiv1<="0000";
ELSEdiv1<=div1+1;
ENDIF;
ENDIF;
ENDPROCESS;
clk2<=div1(3);
div_256:
PROCESS(sysclk)
BEGIN
IF(sysclk'EVENTANDsysclk='1')THEN
div2<=div2+1;
ENDIF;
ENDPROCESS;
clk1<=div2(7);--selectbaudrate
div_3:
PROCESS(clk2)
BEGIN
IF(clk2'EVENTANDclk2='1')THEN
IF(div3="10")THENdiv3<="00";
ELSEdiv3<=div3+1;
ENDIF;
ENDIF;
ENDPROCESS;
clk_01<=div3
(1);
ENDrtl;
Div_10进程为10分频进程,div_256进程为256分频进程,div_3是3分频进程。
76800Hz主频经该3个进程串行分频就得到10Hz的时钟clk_01。
2.定时器控制timer_ctr模块
如前所述,定时器控制timer_ctr模块的功能是根据启/停按键(start_stop)、模式选择按键(mode_sel)和定时选择按键(time_sel)的不同输入状态,产生对应的控制信号输出,其VHDL语言描述的程序清单如下。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYtimer_ctrIS
PORT(reset,sysclk,start_stop,mode_sel,time_sel,timer_down:
INSTD_LOGIC;
s5min_out,s10min_out,s15min_out,start_out:
OUTSTD_LOGIC;
b_out,j_out,z_out:
OUTSTD_LOGIC);
ENDtimer_ctr;
ARCHITECTURErtlOFtimer_ctrIS
TYPEstate1TYPEIS(s_b,s_z,s_j);
TYPEstate2TYPEIS(s_15min,s_10min,s_5min);
TYPEstate3TYPEIS(s_start,s_stop);
SIGNALstate1,nextstate1:
state1TYPE;
SIGNALstate2,nextstate2:
state2TYPE;
SIGNALstate3,nextstate3:
state3TYPE;
SIGNALstart_stop_rising,start_stop_dlayed,setstart,clrstart:
STD_LOGIC;
SIGNALmode_sel_dlayed,modesel_rising,time_sel_dlayed,timesel_rising,
timer_down_rising:
STD_LOGIC;
SIGNALset_5min,set_10min,set_15min,start,set_b,set_j,set_z,
timer_down_dlayed:
STD_LOGIC;
BEGIN
modesel_rising<=mode_selAND(NOTmode_sel_dlayed);
timesel_rising<=time_selAND(NOTtime_sel_dlayed);
start_stop_rising<=start_stopAND(NOTstart_stop_dlayed);
mode_ctr:
PROCESS(modesel_rising,state1,timer_down)
BEGIN
set_b<='0';set_j<='0';set_z<='0';
CASEstate1IS
WHENs_b=>set_b<='1';
IF(timer_down='1')THENset_b<='0';nextstate1<=s_b;
ELSIF(modesel_rising='0')THENnextstate1<=s_b;
ELSE
set_b<='0';nextstate1<=s_z;
ENDIF;
WHENs_z=>set_z<='1';
IF(timer_down='1')THENset_z<='0';nextstate1<=s_b;
ELSIF(modesel_rising='0')THENnextstate1<=s_z;
ELSE
set_z<='0';nextstate1<=s_j;
ENDIF;
WHENs_j=>set_j<='1';
IF(timer_down='1')THENset_j<='0';nextstate1<=s_b;
ELSIF(modesel_rising='0')THENnextstate1<=s_j;
ELSE
set_j<='0';nextstate1<=s_b;
ENDIF;
ENDCASE;
ENDPROCESS;
time_ctr:
PROCESS(timesel_rising,state2,timer_down)
BEGIN
set_15min<='0';set_10min<='0';set_5min<='0';
CASEstate2IS
WHENs_15min=>set_15min<='1';
IF(timer_down='1')THENset_15min<='0';nextstate2<=s_15min;
ELSIF(timesel_rising='0')THENnextstate2<=s_15min;
ELSE
nextstate2<=s_10min;
ENDIF;
WHENs_10min=>set_10min<='1';
IF(timer_down='1')THENset_10min<='0';nextstate2<=s_15min;
ELSIF(timesel_rising='0')THENnextstate2<=s_10min;
ELSE
nextstate2<=s_5min;
ENDIF;
WHENs_5min=>set_5min<='1';
IF(timer_down='1')THENset_5min<='0';nextstate2<=s_15min;
ELSIF(timesel_rising='0')THENnextstate2<=s_5min;
ELSE
nextstate2<=s_15min;
ENDIF;
ENDCASE;
ENDPROCESS;
timer_down_rising<=timer_downAND(NOTtimer_down_dlayed);
start_ctr:
PROCESS(start_stop_rising,state3,timer_down)
BEGIN
setstart<='0';clrstart<='0';
CASEstate3IS
WHENs_stop=>
IF(start_stop_rising='1')THENnextstate3<=s_start;setstart<='1';
ELSE
nextstate3<=s_stop;clrstart<='1';
ENDIF;
WHENs_start=>
IF(timer_down_rising='1')THENclrstart<='1';nextstate3<=s_stop;
ELSIF(start_stop_rising='1')THENnextstate3<=s_stop;clrstart<='1';
ELSE
nextstate3<=s_start;
ENDIF;
ENDCASE;
ENDPROCESS;
time_ctr_update:
PROCESS(reset,sysclk,timer_down_rising)
BEGIN
IF(reset='0')THEN
state1<=s_b;state2<=s_15min;state3<=s_stop;start_stop_dlayed<='0';
ELSIF(sysclk'EVENTANDsysclk='1')THEN
state1<=nextstate1;state2<=nextstate2;state3<=nextstate3;
IF(set_b='1')THENb_out<='1';ELSEb_out<='0';ENDIF;
IF(set_z='1')THENz_out<='1';ELSEz_out<='0';ENDIF;
IF(set_j='1')THENj_out<='1';ELSEj_out<='0';ENDIF;
IF(set_15min='1')THENs15min_out<='1';ELSEs15min_out<='0';ENDIF;
IF(set_10min='1')THENs10min_out<='1';ELSEs10min_out<='0';ENDIF;
IF(set_5min='1')THENs5min_out<='1';ELSEs5min_out<='0';ENDIF;
IF(timer_down_rising='1')THENstart_out<='0';
ELSIF(clrstart='1')THENstart_out<='0';
ELSIF(setstart='1')THENstart_out<='1';
ENDIF;
mode_sel_dlayed<=mode_sel;
time_sel_dlayed<=time_sel;
start_stop_dlayed<=start_stop;
timer_down_dlayed<=timer_down;
ENDIF;
ENDPROCESS;
ENDrtl;
该模块由4个进程组成。
mode_ctr进程是模式选择控制进程,对应图10-19(a)的模式选择控制状态机图;timer_cnt进程是定时选择控制进程,对应图10-19(b)的定时选择控制状态机图;start_ctr进程是启/停控制进程,对应图10-20的启/停控制算法状态机图;最后一个进程是time_ctr_update进程,它的功能是根据上述3个进程中不同的控制标志输出,在该进程中对输出控制信号进行刷新,其刷新频率为系统主时钟频率(76800Hz),这样就可确保控制的精度。
3.定时器timer_count模块
定时器timer_count模块的功能是根据定时控制输出,对洗衣机的洗涤时间进行定时控制。
它由3个进程构成,其VHDL语言描述的程序清单如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYtimer_countIS
PORT(reset,sysclk,clk_01,time_sel:
INSTD_LOGIC;
s5min_in,s10min_in,s15min_in,start_in:
INSTD_LOGIC;
timer_down_out,timer_on_out:
OUTSTD_LOGIC);
ENDtimer_count;
ARCHITECTURErtlOFtimer_countIS
COMPONENTcnt10a1
PORT(reset,clk:
INSTD_LOGIC;
carry:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTcnt60a
PORT(reset,clk:
INSTD_LOGIC;
ca60:
OUTSTD_LOGIC);
ENDCOMPONENT;
TYPEstateTYPEIS(IDLE,INCOUNT,TM