1、第4章 系统硬件结构设计4.1 系统总体结构汽车空调控制系统以主控芯片为中心,以CAN总线构建网络,传感器传递的信号以及主控制器发出的控制信号通过CAN总线接收或者发送。图4-1为该控制系统总体结构示意图。图4-1 空调控制系统硬件总体结构示CAN总线上挂接的节点有信号采集节点和控制执行机构节点两类,其结构如下: 图4-2 空调控制系统CAN节点示意图CAN节点包括控制器、传感器、CAN收发节点,节点的控制器采样的是MPS430单片机,CAN节点用于向主控制器的发送传感器的采样结果。每个节点的CAN网络节点地址分配如下:表 4-1 节点地址分配车外温度节点90车内温度节点91车外光照节点92发
2、动机水温节点93蒸发器温度节点94压缩机控制节点95混合风门控制节点96内外风门控制节点97鼓风机控制节点98由于本系统中主控制器和温度采集节点的控制器都没有带CAN总线接口,因此本设计采用CAN总线控制器SJA1000和一个CAN收发器PCA82C250组成CAN收发模块,总共需要9个这样的收发模块,分别用于主控制电路以及每一个信号采集节点。4.2 主控制器电路结构4.2.1基于ARM9的S3C2440微处理器ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点
3、。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的都是一套独一无二的ARM相关技术及服务。利用这种合伙关系,ARM很快成为许多全球性RISC标准的缔造者。同时ARM也表示由ARM公司设计的RISC处理器,包括ARM7、ARM9、ARM10、ARM11、Crotex 系列等等。其中 ARM7 系列、ARM9 系列、ARM9E 系列和 ARM10E 系列为四个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的要求。本设计中采用的基于ARM920T 核心核的微处理器S3C2440。其
4、结构图如下:图 4.3 S3C2440A 处理器结构S3C2440A具有低功耗,简单,精致的特点,且全静态设计特别适合于对成本和功率敏感型的应用。它采用了新的总线架构如先进微控制总线构架(AMBA)。S3C2440A 的突出特点是其处理器核心,是一个由Advanced RISC Machines(ARM)公司设计的16/32 位ARM920T 的RISC 处理器。ARM920T 实现了MMU,AMBA 总线和哈佛结构高速缓冲体系结构。这一结构具有独立的16KB 指令高速缓存和16KB 数据高速缓存。每个都是由具有8 字长的行(line)组成。通过提供一套完整的通用系统外设S3C2440A 减少
5、整体系统成本和无需配置额外的组件。S3C2440A集成了以下片上功能:(1)1.2V 内核供电, 1.8V/2.5V/3.3V 储存器供电, 3.3V 外部I/O 供电,具备16KB 的指令缓存和16KB 的数据缓存和MMU的微处理器。(2)外部存储控制器(SDRAM 控制和片选逻辑)。(3)LCD 控制器(最大支持4K 色STN 和256K 色TFT)提供1通道LCD专用DMA。(4) 4 通道DMA 并有外部请求引脚。(5) 3 通道UART(IrDA1.0, 64 字节发送FIFO 和64 字节接收FIFO)。(6) 2 通道SPI。(7)1 通道IIC 总线接口(支持多主机)。(8)
6、1 通道IIS 总线音频编码器接口。(9) AC97 编解码器接口。(10) 兼容SD 主接口协议1.0 版和MMC 卡协议2.11 兼容版。(11) 2 通道USB 主机/1 通道USB 设备(1.1 版)。(12)4 通道PWM 定时器和1 通道内部定时器/看门狗定时器。(13)8 通道10 位ADC 和触摸屏接口。(14)具有日历功能的RTC。(14)摄像头接口(最大支持40964096 像素输入;20482048 像素输入支持缩放)。(15) 130 个通用I/O 口和24 通道外部中断源。(16) 具有普通,慢速,空闲和掉电模式。(17) 具有PLL 片上时钟发生器。图 4.4 S3
7、C2440A 部分电路引脚图4.2.2 电源电路 汽车的电池一般为24V的电压输出,在本系统中需要用到5V和3.3V的电压,因此采用比较常见的三端稳压集成电路芯片7805将24V转换为5V。7805的实物图如下所示:图 4.4三端稳压集成电路芯片78057805只有三条引脚输出,分别是输入端、接地端和输出端。它的样子类似是普通的三极管,TO- 220 的标准封装,也有9013样子的TO-92封装。7805输出电压典型值为5.0V,误差不超过0.2V,最大输出电流1.5A。在实际使用时,当稳压管温度过高时,稳压性能将变差,甚至损坏,因此需要安装足够大的散热器(功率较小时也可不需要)。得到5V电压
8、后,可以用LM1117-3.3芯片输出3.3V的稳定电压。LM1117是一个低压差电压调节器系列。其压差在1.2V输出,负载电流为800mA时为1.2V。它与国家半导体的工业标准器件LM317有相同的管脚排列。LM1117有可调电压的版本,通过2个外部电阻可实现1.2513.8V输出电压范围。另外还有5个固定电压输出(1.8V、2.5V、2.85V、3.3V和5V)的型号。 LM1117提供电流限制和热保护。电路包含1个齐纳调节的带隙参考电压以确保输出电压的精度在1%以内。LM1117系列具有LLP、TO-263、SOT-223、TO-220和TO-252 D-PAK封装。输出端需要一个至少1
9、0uF的钽电容来改善瞬态响应和稳定性。本系统中用到的3.3V固定输出版本输出电压波动范围在0.2%以内,输出电流能达到800mA。电源模块电路如下:图 4.5电源电路模块4.2.3 外部存储器电路 本系统由于加入了Linux操作系统,因而要求有较大的存储容量,这里采用的是64M的SDRAM加上128M的NAND FLASH的双存储结构。SDRAM具备高速访问和随机读写的特性,用于作为系统的内存单元,NAND FLASH具有接口简单,存储容量大,擦写速度快等特点,用于作为数据和程序的存储设备。本系统采用两片K4S561632C组成32位宽的SDRAM。每片K4S561632C有12根地址线,这样
10、其总共的寻址空间就是4K*4k=16M,其数据线宽位16bit,因而每一片的存储空间大小就是16M*16bit=32MB。NAND FLASH则是采用的三星公司的KF91208F芯片。NAND FLASH采用特有的块与页的形式来存储数据,一片KF91208F有4096个块,每一个块有32个页,而每一页有512B,因而其总共存储空间有4096*32*512B=512MB,其电路图如下所示:图 4.6 SDRAM连接电路4.2.4 显示模块电路本系统的显示单元采用TFT LCD模块,LCD是基于液晶光电效应的显示设备,它的分子晶体以液固态形势存在,基本工作原理就是通过给不同的液晶单元供电,从而让光
11、线通过或者不通过某些液晶单元,以达到显示的目的。也就是说每个液晶单元都对应着一个电极,LCD 的驱动电路就是对每个液晶单元的不通电或通电的控制,对其电极不通电时,排列变得混乱,阻止光线通过,而当对其通电时液晶排列变得有秩序,使光线容易通过。液晶屏可以显示图形、文字等大量丰富的信息,在液晶屏上可以实时显示温度信息等。与单色图形点阵式 LCD 和 RCT 显示器相比,TFT 液晶屏在空间占用、色彩鲜艳度、清晰度、显示速度等方面具有非常大的优势,选用 TFT 液晶屏作为显示单元符合数字化、智能化的发展趋势。图 4.5 是 S3C2440A 内部的 LCD 控制器逻辑示意图。 图 4.6 S3C244
12、0A 内部LCD 控制器图 4.6 显示模块连接图4.2.5 按键输入电路 本系统中需要4个按键,分别为功能键、确认键以及“+”、“-”按键。由于按键数量较少,直接接在S3C2440的通用输入输出口GPF0、GPF1、GPF2、GPF3上,这四个GPIO口都具有中断功能,在驱动程序中,这四个按键被实现为一个简单字符设备,在读操作中等待按键端口的下降沿电平跳变到来。具体的电路图如下所示:图 4.7 按键输入电路图4.3 CAN收发模块 CAN总线模块由一个CAN总线控制器SJA1000和一个CAN收发器PCA82C250组成,它们共同构成一个CAN节点的收发模块。 SJA1000是Philips
13、公司推出的一种独立CAN控制器,用于移动目标和工业环境中的区域网络控制。它全面兼容CAN2.0B协议,同时支持11位和29位标识码,位速率可达1Mbits/S。SJA1000有两种工作模式,分别为BasicCAN模式和PeliCAN、模式。 SJA1000芯片的原理图如下所示:图 4.8 SJA1000芯片原理图SJA1000有自己的数据、地址总线,并且是分时复用的,ALE是地址锁存信号。PCA82C250 是CAN 协议控制器和物理总线间的接口,它主要是为汽车中高速通讯(高达1Mbps)应用而设计。此器件对总线提供差动发送能力,对CAN 控制器提供差动接收能力,完全符合“ISO11898”标
14、准。其引脚图如下所示:图 4.9 PCA82C250引脚图SJA1000和PCA82C250的连接图如下所示:图 4.10 CAN收发接口电路1. CAN接口与控制器的连接。SJA1000的AD0AD7作为地址数据复用线接在控制器的IO端口上,控制器控制ALE信号来表明AD0AD7是作为地址线还是作为数据线。当AD0AD7作为数据线时,控制器通过RD和WR信号来表明是读数据或者写数据的操作。2. CAN接口与总线的连接。CAN收发器82C250的CANH、CANHL直接连接到CAN总线的CANH、CANL数据线。4.4 CAN节点电路本系统的 CAN 节点分为两类:采集信号的采集节点和发出控制
15、信号的执行节点。采集节点与控制节点都包含MSP430控制器和CAN收发模块,而采集节点还包括传感器模块,控制节点则包括执行机构。4.4.1 MSP430单片机控制器 MSP430系列单片机是由TI公司开发的功能强大的16位低功耗微型控制器,抗干扰能力强,适应温度范围宽,在各种恶劣的环境下都能可靠的工作,同时该系列单片机将大量外围设备整合到片内,非常适合嵌入式智能仪器仪表和检测模块开发,同时MSP430有丰富的不同类型器件可供选择,给设计者带来了很大的灵活性,本设计采用的是该系列中的MSPF149A单机。MSPF149A单片机有60K的片内FLASH和1KB的片内RAM,并带有6个8位输入输出可
16、配置且带中断的IO口和12位的高速多通道积分型模数转换电路。其最小系统电路如下:图 4.11 MSP430最小系统电路单片机的P0口接CAN收发模块控制器SJA1000的AD0AD7,用于和CAN通信的IO端口,P2.1、P2.2、P2.3、P2.4分别接CAN收发控制器SJA1000的、ALE信号。4.4.2 信号采集节点4.4.2.1 温度采集本系统需要四个温度采集节点,分别采样车内外温度,蒸发器表面温度和发动机水温。温度的正确测量对本系统的正确运行至关重要,它的精度直接决定了整个系统的控制精度,因此要求选取高精度的温度传感器。温度传感器的种类众多,在应用与高精度、高可靠性的场合时DALL
17、AS(达拉斯)公司生产的DS18B20温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,与单片机的线路连接简单,附加功能强,使得DS18B20成为开发温度相关的小产品的不二选择。DS18B20的主要特征如下:(1)全数字温度转换及输出。(2)先进的单总线数据通信。(3)最高12位分辨率,精度可达0.5摄氏度。(4)12位分辨率时的最大工作周期为750毫秒。(5)可选择寄生工作方式。(6)检测温度范围为55C +125C (67F +257F)(7)内置EEPROM,限温报警功能。(8) 64位光刻ROM,内置产品序列号,方便多机挂接。(9)多样封装形式,适应不同硬件系统。
18、DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。18B20共有三种形态的存储器资源,它们分别是:ROM 只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20共64位ROM。RAM 数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPR
19、OM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。控制器对18B20操作流程如下: 1, 复位:首先我们必须对DS18B20芯片进行复位,复位就是由控制器(单片机)给DS18B20单总线至少480uS的低电平信号。当18B20接到此复位信号
20、后则会在1560uS后向MSP430单片机回发一个芯片的存在脉冲。 2, 存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在1560uS后接收存在脉冲,存在脉冲为一个60240uS的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20间的数据通信。如果复位低电平的时间不足或是单总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。 3, 控制器发送ROM指令:双方打完了招呼之后最要将进行交流了,ROM指令共有5条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。ROM指令为8位长度,功
21、能是对片内的64位光刻ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并作处理。诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的ID号来区别,一般只挂接单个18B20芯片时可以跳过ROM指令(注意:此处指的跳过ROM指令并非不发送ROM指令,而是用特有的一条“跳过指令”)。 4, 控制器发送存储器操作指令:在ROM指令发送给18B20之后,紧接着(不间断)就是发送存储器操作指令了。操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。存储器操作指令的功能是
22、命令18B20作什么样的工作,是芯片控制的关键。 5, 执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。如执行温度转换指令则控制器(单片机)必须等待18B20执行其指令,一般转换时间为500uS。如执行数据读写指令则需要严格遵循18B20的读写时序来操作。若要读出当前的温度数据我们需要执行两次工作周期,第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间。紧接着执行第二个周期为复位、跳过ROM指令、执行读RAM的存储器操作指令、读数据(最多为9个字节,中途可停止,只读简单温度值则读前2个字节即可)。 DS
23、18B20只需要接到控制器(单片机)的一个I/O口上,由于单总线为开漏所以需要外接一个4.7K的上拉电阻,它的运行依靠接受控制器的指令,指令表如下:表 4.3 DS18B20的ROM指令指令名称指令值含义Read ROM33H读DS18B20的64位ROM值,在只挂一个DS18B20时使用Match ROM55H当多个DS18B20挂接在同一总线用于寻址芯片Skip ROMCCH使芯片不对ROM编码做出反应Search ROMF0H搜索总线上挂接的所有DS18B20Alarm SearchECH搜索高于最高温度或低于最低温度的芯片Write Scratchpad4EH向芯片RAM中写数据Rea
24、d ScratchpadBEH从芯片RAM中读数据Copy Scratchpad48H将RAM数据复制到EEPROM中Convert T44H使芯片将进行一次温度转换Recall EEPROMB8H将EEPROM中的报警值复制到RAMRead Power SupplyB4H读芯片的电源状态字 由于采用的是单总线的方式通讯,DS18B20与单片机的连接非常简单,具体电路图如图4-10所示:图 4.12 温度采集电路4.4.2.1 太阳辐射强度采集太阳辐射强度的测量是利用光敏元件在不同光照强度下,输出电信号也相应不同。太阳辐射传感器包括光敏电阻、光敏二极管或者光敏三极管等类型。光敏电阻的原理是其受
25、到光照后阻值会变小,光敏二极管和三极管的原理是基于硅PN结光照后产生的光电效应,当光敏二极管工作于反向偏压下,其光谱响应特性主要受半导体材料中所掺的杂质的影响,使用光敏三极管时,通常其基极开路,基极-集电极产生的光感生电流直接注入基极,由于光敏三极管也是三极管中的一种,因而自身具有放大作用,因此光敏三极管与光敏二极管相比其灵敏度明显要大得多。因此本设计采用光敏三极管 3DU55 作为光照强度传感器,其工作电压为 15V,体积小且灵敏度高。因为光敏三极管产生的光电压值比较小,在送入单片机的AD接口前需要经过放大电路的放大,具体电路如图 4-11 所示。图 4.13 太阳辐射强度检测电路4.4.3
26、 控制节点4.4.3.1 电机启停控制电路当蒸发器中的温度足够低时,则系统需要停止压缩机的运行,相反,则需要控制压缩机的运行。由于控制节点上的微控制器MSP430的I/O口的输出电流较小,不能直接驱动继电器电路,需要加驱动电路。考虑到继电器可能会出现反向电压的现象,采用能耐高反向电压的三极管作为驱动元件,继电器选用12V的JZX-18F小型电磁继电器,最大工作电流为3A,具有体积小、动作迅速等特点。电路设计如图4-11所示。图 4.14 电机启停控制电路CTRL1信号接在MSP430单片机的P3.0口,这里为了加强抗干扰能力和增加驱动能力,单片机的控制信号输出通过光电耦合电路和NPN型三极管电
27、路送给继电器。当P3.0口输入高电平时,光耦输入端有电流产生,光耦内部的发光二极管开始发光,输出端的光敏三极管导通,最终继电器线圈通电,触点得以闭合。当P3.0口为低电平时,光耦输入端无电流产生,继电器线圈没有通电,因此触点断开,与继电器相连的二极管可以释放继电器线圈中的反电势电流,起到了续流的作用,保护继电器安全工作。4.4.3.2风门开度控制电路风门开度控制电路用于控制冷热风混合风门、出风口风门的挡板开度,从而控制出风的温度和风向。而挡板开度的控制其本质就是控制电机的转动角度,这种控制方式非常适合使用步进电机来进行控制。步进电机是一种能够将电脉冲信号转换成角位移或线位移的机电元件,它 实际
28、上是一种单相或多相同步电动机。单相步进电动机有单路电脉冲驱动,输 出功率一般很小,其用途为微小功率驱动。多相步进电动机有多相方波脉冲驱 动,用途很广。 使用多相步进电动机时,单路电脉冲信号可先通过脉冲分配器转换为多相脉冲 信号,在经功率放大后分别送入步进电动机各相绕组。每输入一个脉冲到脉冲 分配器,电动机各相的通电状态就发生变化,转子会转过一定的角度(称为步距 角)。 正常情况下,步进电机转动总的角度和输入的脉冲个数成正比;连续输入一定频率的脉冲时,电动机的转速与输入脉冲的频率保持严格的对应关系,不受 电压波动和负载变化的影响。由于步进电动机能直接接收数字量的输入,所以 特别适合于微机控制。总
29、体上说,步进电机有如下优点: 1不需要反馈,控制简单。 2与微机的连接、速度控制(启动、停止和反转)及驱动电路的设计比较简单。 3没有角累积误差。 4停止时也可保持转距。 5没有转向器等机械部分,不需要保养,故造价较低。 6即使没有传感器,也能精确定位。 7根椐给定的脉冲周期,能够以任意速度转动。 综合以上考虑,本设计采用一个两相四线步进电机作为风门开度控制电机,为了电路必须保证步进电机的绕组有足够的电压、电流和正确的波形,同时也要保证驱动电路功率放大器件的安全运行,这里选用集成芯片 L298N 作为步进电机的驱动芯片。L298N 是 SGS 公司为控制和驱动电机而设计的双通道推挽式功率放大专
30、用集成电路器件,将分立电路集成在单片 IC 之中,使外围器件成本降低,整机可靠性提高。其具体的电路连接如下图所示:图 4.15 风门开度控制电路4.4.3.3 鼓风机控制电路由于鼓风机节点需要实现的是风速的调节,也就是控制直流电机的转速。而MSP430单片机的内部定时器可以实现PWM波的输出,因此,可以利用这一特性,对直流电机进行脉宽调制(PWM)的方式来实现转速的调节。由于内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。因此,这
31、里还是采用L298N作为直流电机调速的驱动芯片,其电路连接图如下所示:图 4.16 鼓风机控制电路 这里,由于只需要控制电机的转速,无需控制电机的正反转,因而IN1、IN2不再连接到单片机的IO口,而是直接固定接高电平或低电平,从而是电机始终保持一种转向。ENA则与单片机的PWM输出口相连,单片机通过输出不同占空比的PWM波来调节电机的转速。 第5章 系统软件结构设计5.1 系统软件的整体分析和设计 本设计中CAN主节点要接收多个子CAN节点的信息,并做复杂的模糊PID运算,并根据运算结果向控制CAN子节点发出控制指令,而CAN子节点仅仅只需采集传感器的数据并通过CAN总线发送,或者接受CAN
32、主节点的控制。由此可见,主节点与子节点的任务规模和复杂度相差很大,因而,本设计中主节点采用Linux操作系统的来实现,而子节点只需要采用传统的大循环加中断的裸机程序结构。 主节点采用的基于ARM920T核的S3C2440芯片搭配64M的SDRAM和256M的NAND FLASH,再加上ARM9内带的内存管理单元(MMU)的支持,可以实现Linux的移植。其程序的开发在PC端的虚拟Linux系统完成,并通过多种接口将编译完成的可执行代码下载到ARM端的Linux系统运行。 子节点的程序开发也是在PC端的IAR集成开发环境中完成,并通过JTAG接口将程序下载到MSP430的FLASH中运行。5.2
33、 主节点程序设计主节点的工作主要包括接收信息采集子节点通过CAN网络传输的传感器采用信息、接收按键输入的设定温度、根据用户设定温度以及传感器的采样信息进行模糊PID运算、向控制子节点发出控制信息、在TFT液晶屏上实时显示当前的温度和光照等状态信息。由于S3C2440芯片在正常工作前必须对系统进行正确的配置和代码搬运等一些前期的工作,而Linux系统的启动也同样需要一小段代码去引导,因而,首先必须完成启动代码的移植,接着还需移植操作系统内核和根文件,完成这些,应用程序的运行平台才算建立。整个程序开发的过程如下图所示:图 5.1 主节点程序开发流程由于Linux的代码开源特性以及其在网络上的广泛传
34、播 ,因此流程的前几步基本可以通过网络或其他途径来实现,其方法也已经形成统一的模式,因此在这里对于这几步就不多做介绍,而把重点放在最后两步:驱动程序和应用程序。由于Linux操作系统的特性,应用程序不能直接访问底层硬件模块,而只能通过驱动来提供读写访问接口,为了读写CAN总线的信息,必须为CAN收发模块实现驱动程序;而应用程序的设计是主节点的核心,主节点的大部分工作由应用程序来完成。5.2.1 主节点CAN收发模块驱动程序设计 Linux的驱动程序主要分为字符设备驱动、块设备驱动、网络设备驱动等几大类。字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。块设备可以用任
35、意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。网络设备面向数据包的接收和发送而设计,它并不对应于文件系统的节点。内核与网络设备的通信和内核与字符设备、块设备的通信方式完全不同。显然,本设计中CAN收发模块更符合字符设备的定义,且字符设备驱动实现方式简单明了,因此,这里我们打算以字符设备的方式来实现CAN模块的驱动。 在Linux系统中应用程序对字符设备的访问都是以文件的形式存在,因此驱动程序需为该设备创建一个文件节点并实现文件访问函数open()、read()、write()、ioctl()等。Linux驱动程序与应用程序以mai
36、n函数作为入口函数不同,它的入口函数以内核函数module_init来指明,通常入口函数都以设备名称命名为xxxx_init的形式,因此在这里我们可以将驱动程序的入口函数声明为如下形式:static _init can_init(void);在入口函数中,要实现的工作包括字符设备号的申请、字符设备结构体的初始化、设备注册、文件节点的创建。在Linux 2.6.32版本内核中,该实现过程如下:(1)首先调用register_chrdev_region或者alloc_chrdev_region函数申请设备号的使用,两者的区别在于前一个函数申请的设备号由用户,后一个函数则由内核分配一个未使用的设备号
37、。 (2)初始化字符设备描述结构体cdev,主要是为其成员变量赋值,从而使该结构体与申请到的设备号关联,并且和用户指明的文件操作结构体指针关联。 (3)调用cedv_add函数向内核注册设备。 (4)使用class_create和device_create函数在文件系统的dev目录下创建对应该设备的文件节点。完成以上过程之后,还需要实现文件操作结构体file_operations中的文件操作函数,这里主要实现open、read、wrie函数,对于设备的打开和读写操作。在打开设备的操作open函数中,首先将与S3C2440与CAN模块连接的IO进行地址映射,然后完成CAN收发器SJ1000的初始
38、化工作,其流程如下: 图 5.2 CAN收发控制器初始化程序完成初始化之后,便可用read和write函数读写CAN模块,考虑到数据的传输可靠性,这里读写函数都以阻塞的方式实现。在读函数read中,只需读SJA1000的状态寄存器,若没有,则等待一段时间后重新读状态寄存器,若有数据接收,则将接收的数据读出并通过调用从内核向用户空间拷贝的函数copy_to_user把接收的数据返回给用户程序。具体的流程如下图所示:图 5.2 CAN主节点接收程序发送过程只需要把数据写到CAN控制器的发送缓存区,启动发送数据命令后CAN控制器会自动完成向CAN总线的数据发送,其程序流程图如下所示:图 5.3 CA
39、N主节点发送程序5.2.2 主节点应用程序设计5.2.2.1 主节点标定程序设计在汽车行驶当中,车外空气和太阳辐射都会向汽车乘用仓传递热量,由于这部分热量较小,在本设计中简单地以模糊控制的思想对这部分热量利用内外风门开度进行补偿 。在这里将车外温度分为寒冷、凉快、舒适、暖和、炎热五个等级,将太阳辐射也分为微弱、适度、强烈三个等级。标定程序开始后,车外温度测量节点采集车外空气的温度并将数据传递给主节点。此时标定程序在显示屏上提示用户选择当前车外温度的等级,根据用户的选择,确定每个温度等级对应的温度范围。同样,太阳辐射节点将太阳辐射对应的电压值F传递给主节点后,主节点也会要求用户选择当前的辐射等级
40、,若用户选择的是微弱级,则电压0-2F对应的太阳辐射是微弱,2F-4F是适度,大于4F则是强烈;若用户的选择是适度,则将0-0.5F定义为微弱,0.5F-2F定义为适度,大于2F定义为强烈;若用户选择的是强烈,则0-0.25F定义为微弱,0.25F-0.5F定义为适度,大于0.5F定义为强烈。车外温度以及太阳辐射决定了内外循环风门的开度,如下表所示:开度微弱适度强烈寒冷0%10%20%凉快30%40%50%舒适60%70%60%暖和50%40%30%炎热20%10%0%5.2.2.2 主节点其他程序设计 主节点应用程序要同时运行人机交换、CAN节点通信和运算等多个任务。因此在这里采用Linux
41、的多线程编程首先运行主线程,在主线程成创建执行其他任务的子线程。主线程的运行过程如下:(1)打开CAN模块的设备文件节点来完成CAN模块的初始化。(2)打开配置文件,根据配置文件设置设定温度、风速、各风门开度等信息,若打开失败,则开始标定工作,确定车外温度和太阳辐射的补偿数,并创建配置文件。(3) 创建用于保存接收信息的全局缓存区,分别保存车内温度、车外温度、发动机水温、冷凝器温度、太阳辐射强度。(4)创建子线程,完成恒温控制的主要工作。(5)等待子线程退出。主线程创建的第一个线程为人机交换线程,用于接收用户的按键。主要有功能键、确认键和“+”键、“-”键。功能键用于用户选择要执行的操作,当用
42、户按下功能键之后,在液晶屏上会弹出一个列出用户所以可以执行的操作的菜单。包括温度设定、内外循环风设定、空调开关、出风口风向设定、风速设定。用户通过“+”和“-”来选择,并用确认键来确认选择。选择某一菜单之后,可以通过“+”和“-”以及确认键来进行具体的设定。例如需要调节风速,则在选择风速设定菜单后使用“+”来增大风速,使用“-”来减小风速,这里将风速分为5级,调节到不同的等级后,会调用控制传输子函数,控制传输子函数向鼓风机控制节点发送控制信息,鼓风机节点则调整电机的转速,从而实现风速的调节。当调节完毕,按下确认键就会返回到显示主界面。主线程创建的第二个线程为信息采集子线程,用于读取CAN控制器
43、的接收数据缓存区,由于CAN驱动的读操作是阻塞读的方式,因此,当没有数据可读时,该线程也会睡眠,直到有数据到来,则解析出节点地址,并保存数据到相应的全局缓存区中去。最后一个创建的线程实现PID运算,并根据运算结果调用控制传输子函数发出控制信息。整个主节点应用程序的流程图如下所示:图 5.4 主节点应用程序流程图5.3 温度采集节点程序设计温度采集节点程序首先初始化CAN节点和DS18B20芯片并开启定时中断,初始化完成后开始一个大循环,在循环中查询定时中断标志是否置位,如果已经置位,表示要开始温度转换,则MSP430单片机通过与DS18B20的单总线相连的P2.0端口向DS18B20芯片发出温
44、度转换命令,接收到单片机的测温命令后芯片自动完成温度测量的工作并将测量结果转换成数字信号,在接收到读RAM命令后将数字结果发送给单片机。单片机在每向DS18B20发出温度转换的命令,并等待一段时间后读出转换结果并发送给主节点。具体的软件流程图如下:图 5.5 温度采集节点程序发送数据部分的实现基本与主节点类似,把数据和地址按照固定的帧格式发送到CAN收发控制器SJA1000芯片,由芯片自动完成发送。5.4 太阳辐射采集节点程序设计太阳辐射节点的程序设计大致与温度采集相同,区别在于:这里单片机直接与传感器相连,因而需要实现数模转换程序。MSP430单片机内部集成了12位的模数转换电路,在程序中只
45、需初始化AD模块的时钟和转换模式,就可以开启转换,在转换完成后会把相应的标志位置位。此外,考虑到采样的精度,这里采用了滑动数字滤波方式来提高精度。滑动滤波就是每次采样后将采样结果放入一个固定长度的队列中,当队列满时,将最先入列的数据出列,然后将队列中除最大最小值外的其他值取平均值,将这个平均值作为采样结果发给主节点。整个节点的程序具体的流程图如下:图 5.5 太阳辐射采集节点程序5.5 压缩机控制节点程序设计 压缩机的状态只有运转和停止两种,因此其控制节点的程序设计比较简单,在接收到主节点的停机命令后,只需要把相应的IO端口置为低电平,继电器失电就会弹开,压缩机就会断电停机。而收到启动命令时,
46、则只需把相应端口变为高电平即可。5.6 风门开度控制节点程序设计 风门开度控制节点在接收到主节点的信息后,解析出地址信息并判断是否等于本节点地址,如果是相等,则继续解析出风门转动的方向(正转或者反转)和角度;否则丢弃接收的信息。确定了风门需要转到的方向和角度后,MSP430单片机通过IO接口驱动步进电机做出相应的动作。本系统中的两相四线制步进电机的转动按照通电的绕组数有三种驱动方式:半拍方式,单拍方式,双拍方式。双拍方式的输出扭矩是最大的,因而本系统中采用这种方式来驱动,它的每个步进角为度,由以下四个步序构成(若需要电机做相反的转动,只需将以下步序反过来就可以):表5-1 两相步进电机双拍方式控制序列步序通电方式二进制编码10110210103100140101 风门控制节点的具体程序流程图如下所示:图 5.6 风门开度控制节点程序5.7 鼓风机控制节点程序设计鼓风机控制节点的程序设计主要是根据主控节点的指令调节鼓风机的转速。转速的调节以PWM的方式实现。MSP430F149内部的16位定时器模块TimerA可以实现PWM输出的功能,且可以实现频率和占空比的调节。要实现PWM输出,必须首先写TimerA的寄存器TACTL来配置时钟和模式。时钟设置为8M的子系统时钟SMCLK8分频,模式设置为增计数模式。并且还需要