历史上的今天
返回首页

历史上的今天

今天是:2024年10月16日(星期三)

正在发生

2019年10月16日 | 基于AVR单片机的汽车空调控制系统设计

2019-10-16 来源:51hei

 

基于AVR单片机的汽车空调控制系统

摘要: AVR单片机功能强大,用AVR单片机开发各种控制系统只需很少的外部器件就可以实现强大的功能。本文介绍的就是利用Atmega16、CodeVisionAVR C开发环境、Proteus仿真软件开发汽车空调自动控制系统。


  • 前言

Atmega16是美国ATMEL公司的高档8位单片机,采用Flash存储器,可以擦写10000次以上、内部集成、四通道PWM、集成8路10位精度ADC、片内经过标定的RC振荡器、采用精简指令集,具有32个通用工作寄存器,具有只需两个时钟周期的硬件乘法器,运算速度快等。由于其集成度高、处理速度快,使得利用AVR单片机进行系统开发只需很少(甚至没有)的外部器件即可实现强大的功能,逐渐在各种场合得到广泛应用,取代其它8位单片机。利用它来开发汽车空调控制系统,只需热电阻、液晶显示模块和一些继电器及其驱动芯片即可实现。

  • 工作原理

本系统可以分为五大部分:热电阻温度采集、运行状态显示、继电器控制、键盘输入、风向步进电机控制。




    • 热电阻温度采集

热电阻传感器以其温度特性稳定、测量精

图1  Pt1000热电阻温度测量电路

度高的特点,在大型中央空调得到了广泛的应用。

采用Pt1000热电阻作为温度传感器的测量电路原理图如图1 所示。热电阻Rt与三个电阻接成电桥。当温度变化时,使得运算放大器的同相输入端的电位发生变化,经过运算放大器放大之后输入到Atmega16单片机进行AD转换。由于单片机采用5V电压作为ADC的参考电源,而电桥在温度变化为0~100°C时,输出电压范围为0~0.7V,所以确定运算放大电路的放大倍数为7,以获得最佳的测量结果。运算放大电路的电阻按以下公式确定:

   

        

。输出电压变化范围大致是0~5V。

由于ADC的转换精度为10,故当输入电压为5V时,其采样值为1023,根据电桥平衡原理,可得到以下公式:

      (1)

其中,N——ADC数据寄存器的值,

U——电桥电源电压,

——Pt1000在0°C时的电阻1000

    Pt1000热电阻的阻值按以下公式计算::

      (2)
Rt——温度为t时铂热电阻的电阻值,Ω;

t——温度,℃;

——Pt1000在0°C时的电阻1000

A——分度常数,A=0.0038623139728

B——分度常数,B=-0.00000065314932626

用Visual Basic.Net根据以上公式(1)、(2)生成用N来查找温度t的程序表格,其代码如下:

Private Sub Pt1000()

Me.Cursor = Cursors.WaitCursor

txtTab.Clear()

Dim U As Integer = 9 '电桥电源电压

'热电阻0度时的电阻值

Dim Pt1000_R0 As Integer = 1000

Dim n As Integer

Dim sngT As Single

Dim sngRt As Single

txtTab.AppendText("const float Pt1000Tab[]={" & Chr(13) & Chr(10))

For n = 0 To 1023

    sngRt = (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 Then                txtTab.AppendText(Format(Abs(sngT), "0.0") & ", /* " & n & " */")

   Else                txtTab.AppendText(Format(Abs(sngT), "0.0") & "  /* " & n & " */" & Chr(13) & Chr(10) & "};")

   End If

   If n Mod 5 = 0 Then

      txtTab.AppendText(Chr(13) & Chr(10))

   End If

Next

txtTab.SelectAll()

txtTab.Copy()

Me.Cursor = Cursors.Default

End 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板上而成。字符型液晶显示模块目前在国际上已经规范化,无论显示屏规格如何变化,其电特性和接口形式都是统一的。因此只要设计出一种型号的接口电路,在指令设置上稍加改动即可使用各种规格的字符型液晶显示模块。odeVisionAVR集成开发环境集成这种类型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

/*使用PORTB连接LCD模块*/

#asm

   .equ __lcd_port=0x18 ;PORTB

#endasm

void main(void){

//定义字符数组

uchar arr[5];

//初始化,指定列数为16

lcd_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);

}




    • 继电器控制

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(使能内部上拉电阻)控制,而列则由PC3、PC4、PC5控制,如图4所示。采用程序扫描的方式识别键码,其工作过程如下:




    • 判断键盘中有无键按下。通过以下代码实现:

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矩阵式键盘




    • ,消除抖动。当发现有键按下时,延时一段时间再判断键盘状态,若仍有键保持按下状态,则可以确定有键按下,否则认为是抖动。通过以下代码实现:

   delay();

if((PIND&0x07)!=0x07) {//……}




    • 判断键码。以下是识别为“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,编程简单,精度高。编程让定时器2工作于相位可调模式,产生高精度的PWM波形输出,调节占空比,以达到控制步进电机不同转角的目的。初始化设置如下:

ASSR=0x00;

/*  相位可调PWM模式,比较匹配时清零OC2,计数为0xff时置位OC2   */

TCCR2=0x64;

TCNT2=0x00;

OCR2=0x00;

TIMSK=0x80;      //使能匹配中断

图5  相位可调PWM 模式的时序图

图6 水平送风模式下的PWM波形

图6 倾斜送风模式下的PWM波形

3  仿真

    Proteus是目前最好的模拟单片机及外围器件的仿真软件,可以仿真51系列、AVR,PIC等常用的MCU及其外围电路,如LED、LCD、RAM、ROM、键盘、马达、继电器、AD/DA、部分SPI器件、部分器件、74系列、

COMS 4000系列芯片等。利用Proteus可以大大提高开发效率、降低投资,在没有硬件的情况下让开发人员能像Pspice仿真模拟/数字电路那样仿真MCU及外围电路。

              Proteus提供的可调电阻是“十级可调”而不是“无级可调”,所以本系统采用三个可调电阻模拟Pt1000热电阻,以实现“粗调”、“中调”、“细调”,更真实反映热电阻阻值的细微变化。

图7 换气风机、压缩机、蒸发器风机处于工作状态

图8 LCD显示结果



4. 结语

本系统采用AVR单片机实现汽车空调的自动控制(双位控制),具有电路结构简单、分立元件少、系统界面友好、操作简单等优点,能满足一般精度要求的公交车空调的自动控制。


/*****************************************************

Project : 汽车空调控制系统

Author  : Benny                        

Company : 509                             

Comments: 



Chip type           : ATmega16L

Program type        : Application

Clock frequency     : 8.000000 MHz

Memory model        : Small

External SRAM size  : 0

Data Stack size     : 256

*****************************************************/


#include  

#include  

#include "Pt1000Tab.h"

#include "inc.h"


#asm

   .equ __lcd_port=0x18 ;PORTB

#endasm

#include


bit boolean;   


uchar ventilator_state; 

uchar fan;  

uchar blow; 

uchar run_mode;

uchar temp;

uchar setting_value;

interrupt [TIM2_COMP] void timer2_comp_isr(void)

{

//产生PWM,控制步进电机

if (fan==1)

{

   OCR2=64;

}

else if(fan==2)

{

   OCR2=128;

}

}


#define FIRST_ADC_INPUT 0   //第一通道

#define LAST_ADC_INPUT 1    //最后一通道 ,最大值为7,共8个通道

unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];

#define ADC_VREF_TYPE 0x40

// ADC中断服务程序

// 自动扫描模拟量输入端口,

interrupt [ADC_INT] void adc_isr(void)

{

register static unsigned char input_index=0;

// 读取转换结果

adc_data[input_index]=ADCW;

// 选择转换通道

if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))

   input_index=0;

ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;

//启动AD转换

ADCSRA|=0x40;

}



void main(void)

{

float current_temp;//保存当前温度

// Port A 初始化

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 

PORTA=0x00;

DDRA=0x00;


// Port B 初始化

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 

PORTB=0x00;

DDRB=0x00;


// Port C 初始化

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 

PORTC=0x38;

DDRC=0x38;


// Port D 初始化

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 

PORTD=0x1f;

DDRD=0xF8;



//用T2产生PWM,控制风向步进电机

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x64;

TCNT2=0x00;

OCR2=0x00;



// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x80;


// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;


// ADC initialization

// ADC Clock frequency: 125.000 kHz

推荐阅读

史海拾趣

Active-Semi公司的发展小趣事

Active-Semi是一家专注于功率管理芯片和解决方案的领先企业。以下是该公司发展的五个相关故事:

  1. 公司成立与初期发展: Active-Semi成立于2004年,总部位于美国德克萨斯州达拉斯。公司的创始人致力于研发创新的功率管理解决方案,以满足日益增长的电子设备对于高效能耗、高性能和低成本的需求。初期,公司聚焦于LED照明、消费电子和工业应用等领域。

  2. 技术创新与产品推出: Active-Semi在功率管理领域取得了多项技术创新,不断推出具有高性能和高集成度的芯片产品。公司的产品涵盖了DC-DC转换器、AC-DC转换器、LED驱动器、电池管理器等多个子领域,并通过不断创新提高了产品性能和稳定性。

  3. 市场拓展与国际化发展: 随着产品线的扩展和市场认可度的提高,Active-Semi逐步拓展了国内外市场。公司在美国、中国、日本等地设立了销售和技术支持中心,与全球各地的客户建立了合作关系。通过与国际渠道商合作,Active-Semi的产品远销至全球各地,赢得了广泛的市场认可。

  4. 并购与战略合作: 为了加强自身的技术实力和市场地位,Active-Semi进行了一系列的并购和战略合作。其中最重要的是2018年,Active-Semi被斯图尔特半导体(Stewart Semiconductor)收购。这一并购进一步扩大了Active-Semi在功率管理领域的影响力和市场份额。

  5. 持续创新与未来展望: Active-Semi致力于持续创新,不断推出符合市场需求的新产品和解决方案。公司将继续加强技术研发投入,提升产品性能和稳定性,以满足客户在不断变化的市场需求。未来,Active-Semi将继续致力于成为功率管理领域的领先企业,并在全球范围内提供优质的产品和服务。

GE Sensing ( Amphenol Advanced Sensors )公司的发展小趣事

对于4h的交流电源定时器(555,BH4024)电路,网友可能会提出一系列问题。以下是一些常见问题及其详细回答:

1. 电路的基本工作原理是什么?

回答:该电路结合了555定时器(作为时基电路)和BH4024(7级二进制串行计数器/分频器)来实现4小时的定时功能。555定时器用于产生定时信号,而BH4024则负责将定时信号转换成所需的时间间隔。每当按下AN(定时触动按钮)时,电路开始计时,并在4小时后自动切断交流电源。

2. 如何调整定时时间?

回答:直接调整4小时的定时时间可能不直接通过电路中的元件实现,因为定时时间主要由BH4024的分频特性和555定时器的振荡频率决定。然而,可以通过改变555定时器的外部电阻和电容值来调整其振荡频率,但这通常会影响整个电路的定时精度和稳定性。对于精确调整至4小时,可能需要使用微控制器或其他可编程逻辑设备来替代或辅助BH4024和555定时器。

3. 电路中的555定时器具体起到什么作用?

回答:在这个电路中,555定时器作为时基电路,负责产生稳定的振荡信号。这个振荡信号的频率和占空比可以通过调整与555定时器相连的电阻和电容值来改变。然而,在这个特定的应用中,555定时器的输出信号通常被用作BH4024的输入信号,以便控制BH4024的计数和分频过程。

4. BH4024是如何实现定时功能的?

回答:BH4024是一个7级二进制串行计数器/分频器,它能够根据输入的时钟信号进行计数,并在达到预定次数后输出一个翻转信号。在这个电路中,BH4024的计数频率由555定时器的输出信号决定。当计数器达到某个预设值时(这个值决定了4小时的定时长度),BH4024会输出一个信号来切断交流电源。

5. 电路中的电源要求是什么?

回答:电路中的电源要求取决于所使用的555定时器和BH4024的具体型号以及电路中的其他元件。通常情况下,555定时器可以在较宽的电源电压范围内工作(如4.5V至16V),但具体值应参考器件的数据手册。对于BH4024和其他元件,也应遵循类似的电源要求。此外,由于该电路涉及交流电源的控制,因此还需要注意电路的安全性和稳定性问题。

6. 如何确保电路的可靠性和安全性?

回答:为了确保电路的可靠性和安全性,需要采取以下措施:

  • 选择质量可靠的元件和器件,并按照正确的规格和参数进行连接。
  • 在电路设计中考虑适当的保护措施,如过流保护、过压保护等。
  • 在实际使用中,注意避免电路受到外部干扰和损坏。
  • 定期对电路进行检查和维护,以确保其正常运行和延长使用寿命。

7. 电路有哪些潜在的应用场景?

回答:该电路具有广泛的应用场景,包括但不限于:

  • 家庭自动化系统中的定时开关功能。
  • 工业生产线上的自动断电和重启功能。
  • 实验室和测试设备中的定时控制功能。
  • 公共场所的自动照明和节能控制功能等。

总之,对于4h的交流电源定时器(555,BH4024)电路,网友可能会关注其工作原理、定时时间调整、元件作用、电源要求、可靠性和安全性以及潜在应用场景等方面的问题。以上回答旨在提供全面的信息和指导。

Fukushima Futaba Electric Co Ltd公司的发展小趣事

Fukushima Futaba Electric Co., Ltd.(以下简称“Futaba Electric”)的创立可以追溯到1948年,由熊本县出身的卫藤五郎和北海道出身的细矢礼二在千叶县共同创立。公司名“Futaba”取自两人故乡的首字,寓意着双叶的结合与协作。初期,Futaba Electric专注于电气设备的制造与研发,凭借创始人的远见卓识和不懈努力,逐渐在电子行业崭露头角。这一时期,公司主要生产基础的电气元件,如电阻器、电容器等,为后续的发展奠定了坚实的基础。

启英泰伦(Chiplntelli)公司的发展小趣事

近期,启英泰伦完成了数千万元的B++轮融资,由水木春锦资本、盛裕资本和自觉资本共同投资。这笔资金将主要用于产品的大规模量产和新产品的研发,以进一步加速启英泰伦在智能语音芯片市场的布局。资本的注入不仅为公司的发展提供了强有力的支持,也反映了市场对启英泰伦技术和市场前景的认可。

Gardner Denver公司的发展小趣事

启英泰伦(Chiplntelli)公司成立于2015年,专注于人工智能语音芯片及配套应用解决方案的研发。在公司创立初期,团队面临了众多技术挑战和市场竞争。然而,他们凭借对技术的深刻理解和不懈追求,成功推出了第一代深度神经网络语音AI芯片CI1006,这款芯片在行业内被认定为首创。这一重要里程碑为启英泰伦的发展奠定了坚实的基础,也标志着公司在人工智能语音芯片领域的正式起步。

汇科公司的发展小趣事

随着市场的不断发展和变化,汇科公司始终将技术创新作为发展的核心驱动力。2012年,汇科第一台球磨机节电柜研发成功,并成功申请国家专利,这标志着公司在节能环保技术领域取得了重要突破。随后,公司又成功研发了柱塞泵节电柜、新一代全智能球磨机节电柜等产品,这些产品不仅提升了公司的市场竞争力,也推动了整个电子行业的发展。

问答坊 | AI 解惑

请教高手电路中的难点

请教高手电路图中的难点D13,D41,D42三个二极管再电路中是什么用处? 如果LM324的1脚输出增加,那么D13,D41,D42三个二极管输出全部拉低,这对电路整体有什么影响呢?…

查看全部问答>

地址D的寄存

各位大哥在另一个工程中又遇到了一个棘手的问题;请大家帮忙看看。谢谢! 通过一台FX2N系列的PLC及4AD-TC模块来检测一蒸汽管道的温度,将检测的值经过运算后;传人触摸屏。但实际运算后地址D得到的结果成了整数(实际结果应该是带小数的)。之后我 ...…

查看全部问答>

一种新型螺旋滤波器

一种新型螺旋滤波器…

查看全部问答>

松下摄像机交流适配器电路图

松下摄像机交流适配器电路图…

查看全部问答>

应用层发送数据到驱动程序的问题

IIC驱动中的结构如下: typedef struct _I2C_IO_DESC {     DWORD   SlaveAddr;      // Target Slave Address     UCHAR   WordAddr;       // Starting Sla ...…

查看全部问答>

求stm8s105输出2KHz的方波

求用C语言写一个stm8s105输出2KHz的方波的程序。 刚接触STM8单片机,不知从何入手,希望有STM8单片机经验的人提供点建议。非常感谢!…

查看全部问答>

51单片机定时器工作在方式2的一些疑问

定时器工作在方式2时TH向TL自动重装时要多久,需要为此延时吗?…

查看全部问答>

有用过AD9364的请帮忙看下?

一个项目计划使用AD9364这个器件,在阅读文档时候发现文档说明中,模拟地和数字地直接相连?神马个情况? Analog Ground. Tie these pins directly to the VSSD digital ground on the printed circuit board (one ground plane). …

查看全部问答>

温度单位换算公式

温度单位换算公式温度单位换算公式:· 摄氏温度与华氏温度的换算公式F=(C×9/5)+32 ;C=(F-32)×5/9 ;式中F--华氏温度,C--摄氏温度· 摄氏温度与开尔文温度(绝对温度)的换算公式K=C+273.16 ; 式中K--开尔文温度,C--摄氏温度· 华氏 ...…

查看全部问答>