微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 工业电子 > 用HT46X23设计微波炉控制器实例分析

用HT46X23设计微波炉控制器实例分析

时间:12-06 来源:互联网 点击:
硬件电路设计

在选择主芯片时,已经在考虑部分电路设计了,显示、按键检测、输出驱动等都考虑好了,由于篇幅有限,只简单介绍几个关键问题:

门检测电路:给单片机检测的门开关信号的同时,还要控制微波、烧烤、热风烘烤继电器的电源。

供电部分:考虑数码管显示内容较多,驱动电流大,变压器尽量选择继电器和单片机独立供电,一方面降低变压器功率,同时可以让单片机的电源不受继电器的工作状态影响。

过零检测和触发:选择合适的光耦和可控硅驱动电路,实现过零驱动,过零检测电路注意适当的滤波和隔离,减少通过电源耦合的干扰。

微波炉控制器电路原理图如图1。

另外,PCB设计时注意强弱电分开,注意电源与地的分布,注意生产的工艺性问题等。总之,合理的硬件设计和PCB布板对保证产品功能和性能十分重要。

软件规划及编写

芯片配置选项设定

根据硬件电路,将按键、编码开关及门检测部分的内部设置上拉电阻;盛群单片机的LVD功能很可靠,所以复位电路直接接到VCC,那么在设置配置选项时一定要开启低电压复位功能,不开启容易上电复位不良。下面将主要选项设定列举如下:

PA3/PFD: Enable PFD

Pull-High PB: Enable

Pull-High PC: Disable

Pull-High PD: Enable

OSC: Crystal

WDT clock source: WDTOSC

WDT: Enable

LVR: Enable

LVR voltage: 3.2V

CLRWDT: Two Instructions.

软件整体规划及模块化分解

将复杂的功能分解,通过变量传递各模块之间的关联内容,模块内部则尽量独立完成,这样让程序的可移植性提高,调试更快。把复杂的问题简单化是程序编写的重要原则。

1)主程序

通过调用各子程序,整合各模块的功能。数码管扫描显示对时间要求比较高,而且各个公共端要平均分配时间,所以主程序执行周期选择固定周期。另外编码开关也是扫描检测方式,当编码开关旋转很快时,脉冲频率较高,扫描周期也不能太长,综合整体,主程序选择4ms为执行周期,但显示和按键及编码开关则执行2次,相当于2ms的扫描周期。



图1 HT46X23微波炉原理图

如果用4MHz的晶振,4ms时间可以执行4000条指令,程序设计合理情况下完全可以运行完各子程序,不担心出现当处理事件多时显示闪烁等问题。

2)编码开关、按键及门状态检测

因编码开关、按键及门状态检测I/O都同显示驱动I/O复用,所以需统一处理。

先关闭显示COM,检测SEG上的状态,再关闭SEG,再检测COM上的状态。

此部分程序还要完成按键检测及消抖动处理、编码开关的检测、门状态去抖动检测,以有效按键变量、编码开关左右旋转标志、门状态等为输出。其它子程序根据按键、编码开关操作和门状态执行对应的操作和功能。

3)过零检测及过零触发

过零检测在外部中断程序中完成,中断后根据当前运行状态设置散热风扇半功率、全功率和关三种状态。开和关状态直接设置控制光耦状态,当需要半功率时,需要记录中断次数,调整导通和关闭周期,这里没有用调整可控硅导通移相的方法调功,可减少电磁辐射。

4)按键设置

按键操作设置程序的输入条件为有效的按键和编码开关左右旋转标志,再细分每个按键分别处理,在什么条件下设置对应的工作时间、输出模式、显示模式、蜂鸣器鸣叫等。

5)显示状态设置

设置4字节保存显示数字部分内容,另2字节保存四周图标变量,由于四周的图标有闪烁和不闪烁状态,另2字节设置图标的闪烁状态。

6)显示输出扫描

根据显示状态变量的8字节变量内容,设置数码管对应COM和SEG,扫描显示输出。

7)加热输出及功率控制设置

加热和功率控制程序通过统一的变量输入,设置当前的微波、烧烤、热风还是几种混合加热,以及设置内灯及散热风扇输出等。

8)温度检测及计算

设置A/D转换,检测热敏电阻的值,并滤波处理,以及开路短路保护检测。其输出为故障状态标志和当前炉腔温度。在热风烘烤输出程序中根据温度设置对应的加热状态。

9)时钟、定时及运行时间计算及对应输出模式切换

程序中关于时间的设置很多,大多都在这个子程序中完成,如时钟计算、预约比较、倒计时、自动功能的多段加热模式切换等。

10)蜂鸣器设置

两个变量buz_n,buz_long来设置蜂鸣器鸣叫次数和单声鸣叫长度。可单独设置buz_long值为单声的鸣叫,在上电和按键操作时设置单声鸣叫。当定时结束或定时启动或故障提示等情况时,需要设置鸣叫多时,设置buz_n值就可以了。

11)定时中断子程序

定时中断子程序相对很简单,只设置中断次数记录就可以了。由于蜂鸣器鸣叫频率为2KHz,所以定时中断时间为250us。

其中内容比较多的部分是:按键操作、显示状态设置、时钟、定时及运行时间计算及对应输出模式切换、加热输出及功率设置等部分。

在软件的编写中,变量规划很重要,下面还列出了几个典型的变量规划:

整个产品的主要工作模式用run_state来记录:

run_state equ [40h]

s_hotfan equ run_state.0 ;热风烘烤

s_micro equ run_state.1 ;微波

s_grill equ run_state.2 ;烧烤

s_mix equ run_state 3 ;混合模式

s_auto equ run_state.4 ;自动解冻

s_mu equ run_state.5 ;自动菜单工作模式

s_fast equ run_state.6 ;快速启动模式

显示模式用dsp_state来记录:

dsp_state equ [41h]

s_time equ dsp_state.0 ;显示时钟状态

s_timer equ dsp_state.1 ;显示定时时间状态

s_off_t equ dsp_state.2 ;显示倒计时状态

s_code equ dsp_state.3 ;显示菜单或工作模式状态

加热模式heat_mode变量来控制当前的输出,其具体数据说明如下:

0则关闭所有输出。

bit0_bit3(10_1)保存微波100% /90% /80% /70% /60% /50% /40% /30% /20% /10% /10档,即最后4bit来记录微波输出功率,在自动解冻、自动菜单、混合等非简单微波模式时,加热功率输出时只需要判断此变量,就直接设置微波输出。

bit4_bit5保存烧烤功率100%和50%。

bit7保存热风烘烤输出。

当有混合状态时,则同时设置对应的位就可以了。

合理设计变量对整个程序的编写很有用,同时也是对产品功能的规划和理解的具体化,找出主要的和关键的控制关系,设计合适的、适当通用的算法。而且对于经常编写同类产品时,移植程序变得很简单;比如将此产品数码管换为LCD显示时,基本上只需要将显示输出部分修改为驱动显示IC或显示RAM就可以了,其显示得内容还是显示时间、定时、倒计时时间、菜单或模式,只需要修改对应得显示表就可以了。

程序编写和程序调试

软件简单规划后,就需要具体的编写,将任务分解后,每部分已经比较简单了,调试时可以考虑各子程序单独调试,人为模拟输入各种情况下的数据及状态,检查输出是否正确。再将相关联的一起调试。除非很有把握,不要将程序全编写完了再调试,那样就不知道到底哪里有问题。

程序简单题纲如下:

;定义常量,某些固定的值,多次用到或经常修改的常量,单独定义后调用。

buz_l0 equ 50d ;50*4=200ms设置所有默认蜂鸣器鸣叫声音长度。

sw_t0 equ 70d ;有效按键响应时间,按键去抖动时间

......

;定义I/O,将各输入/输出单独按功能或原理图网络标号定义,当原理图修改时方便软件修改

buz_p equ pa.3

grill_p equ pc.0

micro_p equ pc.1

......

;定义变量,

run_state equ [40h] ;或则用自动变量定义

......

;程序开始

org 0h

jmp start_l

org 04H ;外部中断向量

jmp int_set ;跳转过零中断处理程序

org 08H ;定时中断向量,中断周期为250us

mov temp_a,a ;保存

mov a,status

mov temp_s,a

inc t_int0 ;每次中断0.25us

mov a,temp_s

mov status,a

mov a,temp_a

reti

;中断处理程序,注意先保存用到的ACC和标志寄存器status,返回前恢复

int_set:

......;中断处理程序,设置风扇输出

reti

;主程序开始

start_l:

;初始化RAM、I/O、timer、中断等,一般先将通用RAM全清零

;注意继电器等关键变量的初始化,否则上电时继电器可能会跳一下。

;初始化某些特殊变量

;主循环程序部分

main:

call sw_in_set ;注意按键设置会将显示关闭,则显示输出程序在后

call dsp_out_set ;显示扫描程序

call sw_out_set ;按键功能及状态设置

call ad_tem_set ;A/D转换及温度计算

call dsp_state_set ;显示状态计算

main_delay_2ms:

mov a,t_int0 ;0.25*8=2 等待2ms时间到

sub a,8

snz c

jmp main_delay_2ms

call sw_in_set ;注意按键设置会将显示关闭,则显示输出程序在后

call dsp_out_set ;调用显示扫描程序

call heat_out _set ;调用加热状态及功率设置

call buz_set ;调用蜂鸣器设置子程序

call time_set

main_delay_4ms:

mov a,t_int0 ;0.25ms*16=4ms 等待4ms时间到

sub a,16

snz c

jmp main_delay_2ms

clr t_int0

jmp main

;各子程序分列后面

sw_in_set: ;按键检测、编码开关检测、门状态检测

......

ret

dsp_out_set: ;显示扫描程序

......

ret

sw_out_set: ;按键功能及状态设置

......

ret

ad_tem_set: ;A/D转换及温度计算

......

ret

dsp_state_set: ;显示状态计算

......

ret

heat_out _set: ;调用加热状态及功率设置

......

ret

buz_set: ;蜂鸣器设置子程序

......

ret

time_set: ;时间及定时处理程序

......

ret

;程序中会用到很多表,为调用方便,则将其放到最后页面

org 0f00h

dsp_code_l0:

dc 10011111b;0

......

end ;程序结束

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top