家用风扇控制器设计Word格式.docx
《家用风扇控制器设计Word格式.docx》由会员分享,可在线阅读,更多相关《家用风扇控制器设计Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
4、风速:
风速的弱、中、强对应于电扇的转动由慢到快。
5、风速类型的不同选择分别为:
(1)正常电扇连续运转;
(2)自然电扇模拟自然风,即转4s,停8s;
(3)睡眠电扇慢转,产生轻柔的微风,运转8s,停转8s;
6、按照风速与类型的设置输出相应的控制信号。
三、总体设计
电扇模拟自然风,即本次课程设计任务主要基于8086以及各种接口芯片结合汇编语言实现对家用风扇的控制器的模拟。
我主要运用8086CPU结合汇编语言编写的软件来实现各种信号的处理与变换,以得到想要的控制信号,并用接口芯片8255A实现信号的输出与接收。
在模拟中通过开关来实现各种控制信号的输入,再通过8255的端口进行读取,再由8086通过软件的对采入的信号进行辨别进而转入到相应的功能子程序中以实现各种功能。
在各种功能的背后,通过8086驱动相应功能的硬件设备实现各种功能的切换。
具体设计设计,我想采用8255A来接收开关信号,驱动风扇的转动信号输出,输出LED灯的亮灭信号,并接收8253产生的控制信号。
8253主要来实现各种风种的控制信号,以得到自然、睡眠的类型风。
在风扇控制的停止后,当且仅当有风速键按下后,控制器可恢复继续控制风扇的运行,实现控制器的循环控制。
硬件设计框图如图1所示。
图1硬件整体设计框图
四、硬件设计
Ø
4.1硬件设计基本概要
根据设计要求和内容,用可编程并行接口芯片8255A低四位接收3个按键(分别表示风速、类型、停止)的状态以启动电扇或设置相应的工作状态。
这样就需要3个按键,因此可以用三个按钮接到8255口。
这样可以直接从8255的口读取按键的状态,从而执行相应的操作。
要通过一个按键来控制2个以上的状态,可以通过按键的次数来控制第几种状态,比如风速有三种状态(弱、中、强),可以用按键1次控制弱,按键2次控制中,按键3次控制强,这样就可以实现一键控制多钟状态了。
控制器的指示灯,我想使用六个LED灯进行显示,分别显示不同风速、类型等6个指示信号。
用四相步进电动机作为电风扇,其转速可通过改变其驱动电平的频率来改变步进电机的速度。
利用8255A的PC口低四位对步进电机进行四相四拍驱动。
风种时间控制可由可编程计数器/定时器8253来实现。
可选用由8253工作方式3,在这种方式下,当CPU输入控制字后,输出将为高,在写入计数值后计数器将立即自动对输入时钟CLK计数,计数器减为1时,输出将变低,方式2时8253不可用重新设置计数值就能连续工作,保证了定时的精确。
4.28255A设计
8255A的PA工作在方式0的基本输入方式作为控制信号的输入,接收8253的信号来控制步进电机的转动与停止。
PC低四位工作在方式0的基本输入方式,用来接收四个开关的开关信号,高四位工作在方式0的基本输出方式作为四相步进电机的四相线路输出电路用来驱动步进电机的转动。
PB口工作在方式0的基本输出方式,用低六位来控制六个LED灯的亮和灭。
4.38253设计
首先利用通道0对时钟进行分频,已获得可较好利用的时钟,得到周期为四秒的方波为后面能自然和睡眠的状态产生八秒高电平四秒低电平以及周期为十六秒的方波做准备。
使用通道2用来产生类型风的状态信号,在自然风类型时,让其工作在方式2产生八秒高电平四秒低电平,当高电平时驱动步进电机转动,低电平则返回继续检测,以实现自然风的模拟;
在睡眠的类型时,通道2工作在方式3产生周期为十六秒的方波,当高电平时驱动步进电机转动,低电平则返回继续检测,以实现睡眠风的模拟。
4.4步进电机设计
步进电机可接受数字控制信号(电脉冲信号)并转化成与之相对应的角位移或直线位移,因而本身就是一个完成数字模拟转化的执行元件。
而且它能进行开环位置控制,输入一个脉冲信号就得到一个规定的位置增量。
本次课程设计使用的电机为四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
步进电机的转速取决于脉冲频率、转子齿数和拍数。
其角速度与脉冲频率成正比,而且在时间上与脉冲同步。
因而在转子齿数和运行拍数一定的情况下,只要控制脉冲频率即可获得所需速度。
4.5风扇控制器系统硬件原理图
图2风扇控制器系统硬件原理图
五、软件设计
硬件的设计完成后,运用汇编语言编写软件部分通过8086CPU实现各种信号的输入/输出以及相关信号的处理,从而控制步进电机的各种转态的转换控制。
主程序流程图如图3所示:
图3:
主程序流程图
注:
该段流程图对应程序中main函数及check函数
5.1按键判断控制模块
三个按钮接在PC口的低三位,PC3接地,若风速键按下时,开关信号为1H,类型按下时,开关信号为2H,停止键按下时,开关信号为4H。
5.2风速模块切换流程
在风速切换中,在主函数中定义一个变量FLAGL,初始化为0并将其地址放入SI中,在弱风和中风模块中将[SI]加1,在强风模块置为零。
进入风速模块后判断其大小,若为零则转入弱风模块,否则进入中风模块,以此类推。
图4:
风速切换模块
在弱风模块中先点亮表示弱风的灯“弱”,[SI]加一,改变驱动电平频率即置DI为0FFFFH,调用run函数使步进电机弱速转一圈,然后检测开关信号,若开关无新信号,则循环弱风模块。
中风模块与强风模块类似,中风时,[SI]加一,置DI为0AFFFH,强风时,[SI]置0,置DI为05FFFH。
在类型控制中,切换流程与风速控制类似,在此不做赘述,下面进介绍类型控制子模块。
5.3类型控制子模块
图5:
类型控制子模块
进入类型控制子程序后,先判断PA的PA0是否为高电平,即8253输出是否为1,若为高电平,则执行执行点亮灯,变量加一或置一,调用电机run函数等操作,然后检测PA口此时是否为高电平,若为高电平则循环上述操作,若为低电平,则判断开关信号,开关无新信号,返回执行类型控制子模块。
所以,仅仅在PA口为低电平是才检测开关,即在自然风或睡眠风时,当电机停下来时,按开关才有效。
正常风需要电机一直转动,所以正常风模块不需检测PA口,程序类似风速转动子模块。
5.4停止控制模块
图6:
停止控制模块
停止状态主要实现风扇暂时性的停止运行,只有在风速键按下才能继续运行。
此模块结束后返回start,在start会对已运行的风扇停止后所有状态进行重新赋值,以保证再次运行后能按初始状态运行。
六、程序清单
;
8253端口地址
IO08253EQUIOY1+00H*4
IO18253EQUIOY1+01H*4
IO28253EQUIOY1+02H*4
IOCON8253EQUIOY1+03H*4
8255端口地址
IOA8255EQUIOY0+00H*4
IOB8255EQUIOY0+01H*4
IOC8255EQUIOY0+02H*4
IOCON8255EQUIOY0+03H*4
IOY0EQU0C400H
IOY1EQU0C440H
CHECKPROCNEAR
MOVDX,IOC8255
INAL,DX
ANDAL,0FH
CMPAL,1
JESPEED_R
JMPCHECK
RET
ENDP
SPEED_R:
CALLSPEED
JMPCHECK_R
STYPE_R:
CALLSTYPE
风速控制子程序
SPEEDPROCNEAR
PUSHAX
COM:
CMPBYTEPTR[SI],0
JEL0
CMPBYTEPTR[SI],1
JEL1
CMPBYTEPTR[SI],2
JEL2
L0:
MOVDX,IOB8255
MOVAL,01H
OUTDX,AL
L0亮LL0:
LOOPL0
MOVBX,[SI]
ADDBX,1
MOV[SI],BX
RUN_1:
MOV[DI],0FFFFH
CALLRUN;
电机弱转
CHECK_0:
JECOM
CMPAL,2
JESTYPE_R
CMPAL,4
JEZT
JMPRUN_1
ZT:
JMPTING
DATASEGMENT
FLAGLDB?
FLAGTDB?
FLAGDDB?
LEIXINGDB0
DATAENDS
CODESSEGMENT
MAINPROCNEAR
ASSUMECS:
CODES,DS:
DATA
START:
MOVAX,DATA
MOVDX,AX
MOVSI,OFFSETFLAGL
MOVBL,0
MOV[SI],BL
MOVDI,OFFSETFLAGT
MOV[DI],BL
MOVFLAGD,BL
8255初始化
MOVDX,IOCON8255
MOVAL,90H
OUTDX,AL
8253通道0初始化
LING8253:
MOVAL,00110111B
MOVDX,IOCON8253
MOVAL,00H
MOVDX,IO08253
MOVAL,04H
判断是否是风速按键按下
QD:
JECHECK_R
JMPQD
CHECK_R:
CALLCHECK
MAINENDP
STYPEPROCNEAR
类型控制子程序
PAR:
CMPFLAGD,0
JEL3
CMPFLAGD,1
JEL4
CMPFLAGD,2
JEZF
ZF:
JMPL5
L3:
MOVLEIXING,0
MOVAL,08H
OUTDX,AL;
L3亮
LL3:
LOOPL3
MOVAL,FLAGD
ADDAL,1
MOVFLAGD,AL
RUN_Z:
JEYRZ;
正常风
YRZ:
MOV[DI],0FFFFH
JEYZZ
YZZ:
MOV[DI],0AFFFH
CMPBYTEPTR[SI],2
JEYQZ
YQZ:
MOV[DI],05FFFH
CALLRUN
CHECK_3:
JEZ1
JEZB
JMPRUN_Z
Z1:
JMPSPEED_R
ZB:
JMPZT
L4:
MOVDX,IOB8255
MOVAL,10H;
L4亮
L1:
MOVAL,02H;
L1亮
LL1:
LOOPL1
RUN_2:
MOV[DI],0AFFFH
电机中转
CHECK_1:
MOVDX,IOC8255
JMPRUN_2
L2:
MOVAL,04H;
L2亮
LL2:
LOOPLL2
RUN_3:
MOV[DI],05FFFH
电机强转
CHECK_2:
JEZC
JEZS
JMPRUN_3
ZC:
JMPCOM
ZS:
JMPSTYPE_R
POPAX
SPEEDENDP
L5:
MOVDX,IOB8255;
自然风
MOVAL,20H;
L5亮
LL5:
LOOPLL5
MOVAL,0
MOVAL,10110101B
自然通道2初始化
MOVAL,02H
MOVDX,IO28253
RUN_I:
MOVDX,IOA8255
ANDAL,1
JERUN_R2
JMPCHECK_N2
RUN_R2:
CHECK_N2:
MOVDX,IOC8255;
检查有无新键
JEZ3
JEZ4
LL4:
LOOPLL4
MOVAL,10110111B
睡眠通道2初始化
RUN_S:
JERUN_R
JMPCHECK_N
UN_R:
CHECK_N:
JEL5
JEZU
JMPRUN_S
ZU:
Z4:
JEZD
JMPRUN_I
Z3:
JMPL3
ZD:
JMPZS
STYPEENDP
电机转动程序
RUNPROCNEAR
PUSHCX
MOVAL,30H
CALLDELAY
MOVAL,60H
MOVAL,0C0H
JMPLL
DELAY:
MOVCX,[DI]
DALA:
LOOPDALA
LL:
POPCX
RUNENDP
判断停止键是否按下
PCHECK:
JETING
TING:
MOVAX,0
OUTDX,AX
CALLRUNT
JMPSTART
RUNTPROCNEAR
;
电机停止子程序
PUSHDI
MOVAL,0H
JMPLLP
DELAYP:
DALAP:
LOOPDALAP
LLP:
POPDI
POPCX
RUNTENDP
CODESENDS
ENDSTART
七、遇到的问题及解决方法
在这次课程设计中,遇到了各种问题。
因为以前的基本太薄弱,刚开始设计写程序的两天,遇到问题后往往是瞪着屏幕毫无办法,常常在一个小问题上一卡就是三四个小时,到后来渐渐学会了一些解决问题的思路和办法,节奏才渐渐加快。
首先应该是步进电机的驱动问题,刚开始完全不懂电机的驱动原理,看了很多相关的资料却只知道一些理论性的东西,完全不知道如何使用,很多资料上面的驱动电路也是一大堆与非门构成的。
后来在proteus的SAMPLES里面找到了关于驱动的一个简单电路,研究了一下,对照着proteus和网上的步进电机芯片资料,终于弄明白的它的使用方法。
所以proteus里面附带的参考资料其实是很实用的,善于利用能比在其他地方漫无目的的搜资料学到更多东西。
其次逻辑问题。
写类型控制子模块的时候,已经根据流程图把程序写好,里面的子模块也以测试过没有问题,流程图逻辑也应该没问题,但每次运行在睡眠风状态下时,电机转八秒,停两秒后自动转到自然风模块。
想过很多种可能,开关问题,LED灯问题等等,最后一条一条照着程序写流程图的时候,终于发现可能是最后RET没起作用,导致程序执行完无法返回check,直接执行下一条指令。
还有就是刚刚开始写的时候,写一个灯亮,就直接置一,然后看不到任何效果,就很奇怪,后来才想出来CPU运行速度很快,也许亮一下肉眼根本看不出来,需要延迟一段时间,同理按钮开关也需要延时检测。
还有就是很多新手都会遇到的问题,我第一次写的时候,一开始就写了一大段程序,然后什么结果都出不来,调试的时候根本无从调起,经过同学指点才开始从一个小功能开始写程序,先写一个灯亮然后两个然后循环,再往进添加其他功能。
并且这样写会不停的给自己成就感,让自己坚持做完,否则很容易在遇到无从下手的问题时放弃。
所以再大的程序也是要脑子里先有个大框架然后一个个小功能实现的。
在后来遇到错误时,我一般都会先过一遍程序查一下有没有能看出来的错误,然后该段程序的开头开始检测,通过加LED检测程序运行到了哪一行,从哪一行开始出错,有些直接看不出错误的地方通过加DELAY使运行变慢,方便看到仿真结果,也可以使用proteus里面的帧进,一步一步看效果。
另外仿真出错的各种怪问题多半能在网上搜到答案,只要坚信一定有人比我先遇上这些问题就行了~~
八、心得体会
通过此次的课程设计任务,我加深理解了汇编语言以及各接口芯片的使用方法,在实践中体会到各芯片的工作的状态及使用方法。
以前学习过8255,8253芯片的相关内容,通过这次课程设计,通过设计,看书,终于有了比较深刻地了解,并且加深对汇编程序结构,指令,调用等基础知识的认识。
在实践中充分利用所学知识结合实际情况作出符合要求的设计。
在具体的调试过程中遇到了很多问题,自己通过查找各方面资料解决了这些问题。
在这我学到了部分proteus仿真中及硬件调试方面常出现的问题及解决方法。
而在软件设计方面我也学到常见逻辑错误及其解决方法。
能在实践中磨砺自己的意志以及锻炼自己的动手操作能力,提升自己独立完成小型系统的设计任务能力。
为以后在大型系统设计中能奠定一定的基础知识及实际操作能力,并为自己积累了许多宝贵的经验教训。
下面简要的介绍一下我在这次课程设计中主
通过这次短暂的课程设计,不仅使我加深了对接口程序设计的认识,对接口各部件的工作原理也有了进一步的了解,也增强了分析故障以及独立处理问题的能力.
八、元件清单.
元件
数量
8255A
1
8253
74LS138
7411
74LS32
ULN2003A
LED-RED
6
RES
3
74LS273
NOT
MOTOR-STEPPER
8086
九、参考文献