基于A VR单片机的汽车空调控制系统摘要:A VR单片机功能强大,用A VR单片机开发各种控制系统只需很少的外部器件就可以实现强大的功能。
本文介绍的就是利用Atmega16、CodeVisionA VR C开发环境、Proteus仿真软件开发汽车空调自动控制系统。
关键字:A VR单片机、空调自动控制、CodeVisionA VR C、Proteus仿真1前言Atmega16是美国A TMEL公司的高档8位单片机,采用Flash存储器,可以擦写10000次以上、内部集成PROME2、四通道PWM、集成8路10位精度ADC、片内经过标定的RC振荡器、采用精简指令集,具有32个通用工作寄存器,具有只需两个时钟周期的硬件乘法器,运算速度快等。
由于其集成度高、处理速度快,使得利用A VR 单片机进行系统开发只需很少(甚至没有)的外部器件即可实现强大的功能,逐渐在各种场合得到广泛应用,取代其它8位单片机。
利用它来开发汽车空调控制系统,只需热电阻、液晶显示模块和一些继电器及其驱动芯片即可实现。
2工作原理本系统可以分为五大部分:热电阻温度采集、运行状态显示、继电器控制、键盘输入、风向步进电机控制。
2.1热电阻温度采集热电阻传感器以其温度特性稳定、测量精图1 Pt1000热电阻温度测量电路度高的特点,在大型中央空调得到了广泛的应用。
采用Pt1000热电阻作为温度传感器的测量电路原理图如图1 所示。
热电阻Rt与三个电阻接成电桥。
当温度变化时,使得运算放大器的同相输入端的电位发生变化,经过运算放大器放大之后输入到Atmega16单片机进行AD转换。
由于单片机采用5V电压作为ADC的参考电源,而电桥在温度变化为0~100°C时,输出电压范围为0~0.7V,所以确定运算放大电路的放大倍数为7,以获得最佳的测量结果。
运算放大电路的电阻按以下公式确定:71045==iuuRR+456//RRR=取Ω===860,1,6645RkRkR。
输出电压变化范围大致是0~5V。
由于ADC的转换精度为10,故当输入电压为5V时,其采样值为1023,根据电桥平衡原理,可得到以下公式:)21(102375-+∙=∙ttRRRUNV(1)其中,N——ADC数据寄存器的值,U——电桥电源电压,R——Pt1000在0°C时的电阻1000Ω。
Pt1000热电阻的阻值按以下公式计算::2Rt——温度为t时铂热电阻的电阻值,Ω;t——温度,℃;R——Pt1000在0°C时的电阻1000 。
A——分度常数,A=0.0038623139728 B——分度常数,B=-0.00000065314932626 用Visual 根据以上公式(1)、(2)生成用N来查找温度t的程序表格,其代码如下:Private Sub Pt1000()Me.Cursor = Cursors.WaitCursortxtTab.Clear()Dim U As Integer = 9 '电桥电源电压'热电阻0度时的电阻值Dim Pt1000_R0 As Integer = 1000Dim n As IntegerDim sngT As SingleDim sngRt As SingletxtTab.AppendText("const float Pt1000Tab[]={" & Chr(13) & Chr(10))For n = 0 To 1023sngRt = (10000 * n + 7161000 * U) / (7161 * U - 10 * n)sngT = (-const_A + Sqrt(const_A ^ 2 - 4 * const_B * (1 - sngRt / Pt1000_R0))) / (2 * const_B) If n < 1023 ThentxtTab.AppendText(Format(Abs(sngT), "0.0")& ", /* " & n & " */")ElsetxtTab.AppendText(Format(Abs(sngT), "0.0")& " /* " & n & " */" & Chr(13) & Chr(10) &"};")End IfIf n Mod 5 = 0 ThentxtTab.AppendText(Chr(13) & Chr(10)) End IfNexttxtTab.SelectAll()txtTab.Copy()Me.Cursor = Cursors.DefaultEnd Sub生成的程序常数表格(1024个值)部分如下:const float Pt1000Tab[]={0.0, /* 0 */ 0.1, /* 1 */0.2, /* 2 */0.2,……63.4, /* 696 */63.5, /* 697 */……99.3, /* 1022 */99.4 /* 1023 */};2.2 运行状态显示本系统采用一块16×4的字符型液晶模块,这种类型的LCD应用很广泛,其控制驱动主芯片为HD44780及其扩展驱动芯片HD44100(或兼容芯片),少量阻、容元件,结构件等装配在PCB 板上而成。
字符型液晶显示模块目前在国际上已经规范化,无论显示屏规格如何变化,其电特性和接口形式都是统一的。
因此只要设计出一种型号的接口电路,在指令设置上稍加改动即可使用各种规格的字符型液晶显示模块。
odeVisionA VR 集成开发环境集成这种类型LCD的函数,可方便实现LCD的读写,其部分函数及功能简单介绍如下,更详细的资料可查阅各种文献。
函数原型:void lcd_init(unsigned char lcd_columns)功能:初始化LCD模块,清屏并把显示坐标设定在0 列0 行。
LCD模块的列必须指定(例如:16)。
这时不显示光标。
在使用其它高级LCD函数前,必须先调用此函数。
函数原型:void lcd_clear(void)功能:清屏并把显示坐标设定在0 列0 行。
函数原型:void lcd_gotoxy(unsigned char x, unsigned char y)功能:设定显示坐标在x 列y行。
列、行。
函数原型:void lcd_putchar(char c)功能:在当前坐标显示字符c 。
函数原型:void lcd_puts(char *str)功能:在当前坐标显示SRAM 中的字符串str 。
函数原型:void lcd_putsf(char flash *str)功能:在当前坐标显示FLASH 中的字符串str 。
在对LCD进行写入显示数据之前,需要对它进行初始化,设定显示参数。
#include <lcd.h>/*使用PORTB连接LCD模块*/#asm.equ __lcd_port=0x18 ;PORTB#endasmvoid main(void){//定义字符数组uchar arr[5];//初始化,指定列数为16lcd_init(16);//设定显示坐标为(0,1)lcd_gotoxy(0,1);/*在(0,1)显示字符串,注意:此字符串存储在Flash只读存储器中*/lcd_putsf("Run Mode:");/*调用“浮点数转换成字符串”函数,函数原型:void ftoa(float n, unsigned char decimals, char *str) data为浮点数*/ftoa(data,1,arr);//设定显示坐标为(0,2)lcd_gotoxy(0,2);//显示RAM中字符串数组arr的内容lcd_puts(arr);while(1);}2.3继电器控制Atmega16输出缓冲器具有对称的驱动特性,可以输出和吸收大电流,直接驱动LED,但是仍然不能直接驱动更大电流的器件,如继电器,所以必须接入较大功率的驱动器。
常用的驱动方法有74系列功率集成电路驱动、MOC系列光耦合过零触发双向晶闸管驱动、固态继电器驱动等。
本系统采用ULN2003芯片来驱动继电器。
其内部结构如图2所示。
ULN2003是达林顿阵列,是专门用来驱动继电器的芯片,甚至在芯片内部做了一个消线圈图2 ULN2003内部结构图反电动势的二极管。
ULN2003的输出端允许通过IC 电流200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。
采用集电极开路输出,输出电流大,故可以直接驱动继电器或固体继电器(SSR)等外接控制器件,也可直接驱动低压灯泡,共可以驱动7路,减少了电路板的连线数量,成本较低,广泛应用于各种工控板,其驱动原理如图3所示。
图3 驱动原理压缩机离合器继电器采用RS触发器和ULN2003一起控制,这样做的好处是:当单片机受到外界干扰而不断复位或看门狗超时复位时,保证压缩机始终处于开启或关闭状态,有助于延长压缩机的寿命。
2.4 键盘输入本系统采用3×3矩阵式键盘。
通过键盘可以控制系统工作方式(关闭、送风、制冷)、风向步进电机(水平送风、倾斜送风、扫风)、温度设定等。
键盘的行由PD0、PD1、PD2(使能内部上如图4所示。
采用程序扫描的方式识别键码,其工作过程如下:(1)判断键盘中有无键按下。
通过以下代码实现:PORTC&=~0x20;if((PIND&0x07)!=0x07) {//……}首先置PC5为“0”,再判断PD0、PD1、PD2是否都为“1”。
如果全为“1”,则表明第3列无键按下,否则有键按下,进入消除抖动程序;再置PC4为“0”,再判断PD0、PD1、PD2是否都为“1”。
如果全为“1”,则表明第2列无键按下,否则有键按下,进入消除抖动程序;再置PC3为“0”,再判断PD0、PD1、PD2是否都为“1”。
如果全为“1”,则表明第1列无键按下,否则有键按下,进入消除抖动程序。
图4 3×3矩阵式键盘(2),消除抖动。
当发现有键按下时,延时一段时间再判断键盘状态,若仍有键保持按下状态,则可以确定有键按下,否则认为是抖动。
通过以下代码实现:delay();if((PIND&0x07)!=0x07) {//……}(3)判断键码。
以下是识别为“Key2-3”(第2行第3列)的程序代码,其它按健类似。
if((PIND&0x07)==0x05){ // Key 2-3// uchar key_num[]="K23";// 等待按键释放while((PIND&0x07)==0x05);//判断换气风机是否在运行if(ventilator_state==1){ventilator_state=0;//关闭换气风机stop_ventilator();//在LCD上的(12,3)显示“OFF”lcd_gotoxy(12,3);lcd_putsf("OFF");}else{ventilator_state=1;//开启换气风机start_ventilator();//在LCD上的(12,3)显示“Run”lcd_gotoxy(12,3);lcd_putsf("Run");}return;//识别完毕,返回主程序}2.5 风向步进电机控制Atmega16的定时器能够输出PWM,编程简单,精度高。