基于STM32的电动摩托车温度智能检测系统设计
摘 要:介绍了以STM32CPU作为控制核心,基于CAN总线协议的电动摩托车温度采集系统的设计,从硬件与软件两方面介绍了其温度采集节点与中心信息显示的实现过程。其硬件设计部分主要包括节点设计、主控芯片的选型、温度传感器的选型与外围电路设计、CAN外围驱动电路设计、LCD外围电路设计等。其软件设计部分就是对硬件电路的控制,使系统能够达到预期的目标。
关键词:STM32 CAN总线协议 温度传感器
Abstract: This paper introduces a electric motorcycle temperature acquisition system model based on the CAN and using STM32 as its controller, and describes the process of temperature acquisition in node module and information display in central module from the perspectives of hardware and software. The hardware design part mainly includes node design, the main control chip selection, the temperature sensor selection and peripheral circuit design, CAN periphery drive circuit design, LCD peripheral circuit design, etc. The software design part is to the control of the hardware circuit, make the system to achieve the desired objectives. Key words: STM32 CAN bus agreement temperature sensor
1 引言
社会的快速发展使电动摩托车成为了较为普及的交通工具,温度是检测电动摩托车运行状况的一项重要指标,在实际应用中,常在无刷直流电机等处设置温度传感器以检测行驶情况。在电动摩托车通讯系统中,控制器局部网(Controller Area Network,CAN)是BOSCH公司领先推出的一种多主机局部网,由于其卓越性能现已广泛应用于电磁辐射强、工作环境恶劣的工业场所,CAN的直接通信距离最远可达10 km;通信速率最高可达1Mbps。在众多32位微处理器中,STM32系列基于专为嵌入式应用设计的ARM Cortex-M3内核,性能出众,功能创新,外设丰富,广泛应用于工业及消费类电子产品。使用STM32作为主控芯片,构建高性能的CAN总线网络化温度传感系统,将更有利于电动摩托车的稳定行驶。
2 系统设计及关键技术
本文设计的温度采集系统可以采集电动摩托车不同位置的温度,并通过CAN总线准确地传回控制中心,同时系统也可以在温度异常时做出报警提示。该系统由主控节点、采集节点和传感器组成。传感器设置在需要监控温度的电动摩托车部件中,将温度转化为数字信号。采集节点用来收集相近的两个传感器信号,然后通过 CAN总线将温度信息发送
1
至主控节点。主控节点接收到总线上的信息后,进行数据处理,并在LCD显示器上显示出各监控部件的温度信息。系统结构模型如下图1所示。
传感器 传感器 传感器 传感器
图1 系统结构图
传感器 传感器 采集节点1 采集节点2 采集节点3 CAN总线 主控节点 基于STM32的CAN智能温度检测系统采用的关键技术有以下几个方面:a. CAN总线协议;b.基于ARM7的STM32微处理器;c. DS18B20温度传感器单总线通信;d. TFT LCD显示器控制驱动。
3 硬件实现
3.1 节点设计
温度采集系统中的节点包含主控节点与采集节点两种类型,在硬件上的实现过程较为相似,其系统结构框图如下图2所示。其中*号标注的为主控节点特有外设,#号标注的为采集节点特有外设。
功能按键 LED指示灯 蜂鸣器 #温度传感器(1) #温度传感器(2) CPU STM32F103 JTAG接口 *LCD ILI9325 FSMC CAN Controller CAN总线 CAN 收发器TJA1050 图2 基于STM32温度检测节点系统结构框图
2
3.2 STM32核心
主控芯片采用STM32F103VET6,STM32系列32位微处理器采用ARM V7的Cortex-M3内核,接口丰富, 外设完整,主频高达72MHz,使用3.3V电压供电。内置有CAN控制器与FSMC控制器,简化了系统的实现过程[1]。
bxCAN (Baisc Extended CAN)是STM32内置的CAN控制器,支持2. 0A和2. 0B CAN协议,最高速率可达到1Mbit/s。其中包含3个发送邮箱,2组各包含3个接收邮箱的FIFO,14个可变位宽的过滤器组。报文的发送和接收由CAN内核自动实现。
FSMC (Flexible Static Memory Controller)是STM32内置的静态存储控制器,FSMC映射管理的1GB空间被分为4个BANK, LCD控制芯片中的Flash可以被映射到BANK1,在之后的显示使用中,只需更改映射后FSMC中BANK1的值即可对LCD的FLASH进行操作[2]。 3. 3 温度传感器
本系统采用的温度传感器是DS18B20“单总线”接口的温度传感器,与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。该传感器测量温度范围为-55~+125°C,精度为±0.5°C。DS18B20数据端与STM32的GPIO 口连接,因为要求上拉输出模式,所以可以直接使用GPIO 口的IPU (上拉输入)模式,传感器的VDD端接5V DC。 3.4 CAN外围收发电路
TJA1050是CAN控制器和物理总线之间的接口,是一种标准的高速CAN收发器。输入级可与STM32的3.3V输出电压兼容,可以至少连接110个节点。本系统的CAN外围电路如下图3所示,其中在芯片的S 端口设置切换开关,用来选择正常/静默模式,发送接收端口直接与STM32的CAN控制器映射端口相连。
图3 CAN外围驱动电路
3.5 LCD显示器
本系统采用了分辨率为320×240的26万像素TFT显示器,LCD控制器为ILI9325,其数据总线为16位,为了简化程序,使用STM32中的FSMC与数据总线连接。
3
4 软件设计
4.1 节点程序操作过程
主控节点用来接收采集节点发出的温度信息,处理数据并显示。主控节点的主程序包括:(1) 初始化配置;(2) CAN接收中断服务;(3) 转换温度信息程序;(4) 显示程序;(5) 报警程序。采集节点的主程序分为三部分:(1) 初始化配置;(2) 与传感器通讯,获取温度数据;(3) 处理数据并发送至主控节点。采集节点每隔一秒重复2、3两个步骤,实时发送更新温度数据。主控节点的程序流程,如下图4所示。
图4 主控节点程序流程图 是否按键确认报警 是 否 系统初始化 开启接收中断服务 有效接收中断 是 关闭接收中断 转换温度信息程序 显示程序 否 是否超过预设温度 是 报警程序 否 4.2 初始化配置
硬件通电后,各个节点需要初始化配置以激活各项功能,采集节点需要进行RCC (时钟)、GPIO (通用外围输入输出口)、CAN控制寄存器的初始化配置,主控节点除以上三种配置外,还需进行NVIC (中断)、FSMC和 LCD的初始化。下面简要介绍CAN控制器、LCD以及STM32时钟的初始化配置。
4
CAN控制器的初始化分为工作方式配置和过滤器配置,在本系统的初始化流程中只需要对CAN工作方式进行配置。其中,波特率的设定是通过配置发送过程中各个环节的时间量子数和CAN的时钟关系实现的。发送1个bit 的时间 NormalBitTime = Tq+TBS1+TBS2,这三个时间段的单位由设置CAN的Prescaler参数和系统时钟相联系。本系统设定Tq = 1,TBS1 =3,TBS2 =5, Prescaler = 4,由公式(1)可知:
错误!未找到引用源。 BaudaRt=e(1)
其中CAN CLOCK为AHB1 =36MHz,可以算得波特率为1Mbit/s,设置程序如下:
CAN_InitStructure. CAN_SJW = CAN_SJW_1tq; //设置重新同步跳转的时间量子 CAN_InitStructure. CAN_BS1=CAN_BS1_8tq; //设置字段1的时间量子数 CAN_InitStructure. CAN_BS2=CAN_BS2_7tq; //设置字段2的时间量子数 CAN_InitStructure. CAN_Prescaler=1; //配置时间量子长度为1周期
CANCLOCK
PrescalerNormalBitTimeLCD在使用显示命令之前,需要进行一系列初始化配置,根据需求调节显示器的对比度、Gamma和显示区域等。初始化完毕,在之后的显示程序中,只需调用显示函数,写入显示区域与颜色数据,即可完成目标。
下面函数的主要功能就是初始化STM32的时钟,其中还包括对向量表的配置以及相关外设的复位及配置。代码如下: Void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;
MYRCC_DeInit(); //复位并配置向量表 RCC﹣﹥CR∣=0x00010000; //外部高速时钟使能HSEON While(!(RCC﹣﹥CR﹥﹥17)); //等待外部时钟就绪
RCC﹣﹥CFGR=0x00000400; //APB1/2=DIV2;AHB=DIV1; PLL﹣=2; //抵消2个单位 RCC﹣﹥CFGR∣=PLL﹤﹤18; //设置PLL值2~16 RCC﹣﹥CFGR∣=1﹤﹤16; //PLLSRC ON FLASH﹣﹥ACR∣=0x32; //FLASH 2个延时周期 RCC﹣﹥CR∣=0x01000000; //PLLON While(!(RCC﹣﹥CR﹥﹥25)); //等待PLL锁定 RCC﹣﹥CFGR∣=0x00000002; //PLL作为系统时钟
While(temp!=0x02); //等待PLL作为系统时钟设置成功 {
temp=RCC﹣﹥CFGR﹥﹥2;
temp&=0x03;
}
5
}
4.3 温度传感器通讯程序
DS18B20采用单总线模式,与其相连的GPIO口需要分时作为输入或输出端口。单总线的通信以初始化序列开始,首先GPIO口输出500S错误!未找到引用源。的低电平,产生复位脉冲,然后释放总线,使总线被拉高1560S错误!未找到引用源。,并将GPIO口置为上拉输入模式,等待60~错误!未找到引用源。240S错误!未找到引用源。的应答低电平。成功接收传感器应答脉冲后,进行温度读取操作。DS18B20输出的温度数据占2个字节,高字节数据中前4位为符号位,当温度为负数时,符号位为1,此时温度的绝对值用补码表示。DS18B20温度读取程序流程如下图5所示。
4.4 CAN发送程序
采集节点与传感器通信后,将所获取的温度数据发送至主控节点。因为每个采集节点控制2个温度传感器,所以在CAN的通讯协议中,用标准标识符表示节点号,用扩展标识符表示传感器号,便于主控节点的辨别。然后将温度数据分两个字节发送至CAN总线。发送报文前,需要对发送规则进行一系列配置。以下是采集节点1传感器1温度数据的发送程序:
开始 初始化序列 否 应答电平 是 跳过读序列号 启动温度转化 等待转换完成 低 检测DQ端电平 高 读取寄存器数据 结束 图5 DS18B20温度读取流程图
6
TxMessage. StdId =0x01; //配置报文的标准标识符 TxMessage. ExtId =0x0001; //配置扩屏标识符
TxMessage.IDE=CAN_ID_EXT; //使用标准标识符+扩屏标识符方式 TxMessage.RTR= CAN_RTR_DATA; //报文为数据帧
TxMessage.DLC=2; //报文发送数据长度为2字节 TxMessage.Data(0)=k; //发送第一字节 TxMessage.Data(1)=(k﹥﹥8); //发送第二字节 CAN_Transmit(CAN1,& TxMessage); //CAN1报文发送
4.5 显示程序
为将转换为十进制的温度数据在指定位置显示,首先制作了含有英文与数字字符的1608简易字库, 编写了在指定位置显示字符的程序。显示过程中,首先显示欢迎界面,让采集节点的温度传感器完成初始化并稳定工作;然后显示传感器号码等固定内容;最后实时更新温度数据的符号位、整数位、小数位即可。LCD 字符显示程序流程图如下图6所示。
开 始 确定字符位置(X,Y),字符标记 根据字符标记判断对应的字库数组 行起始位置命令0x50,X 行结束位置命令0x51,X+7 列起始位置命令0x52,Y 列结束位置命令0x53,Y+15 写入16个字节的字库数据 结束 图6 LCD字符显示程序流程图
4.6 报警程序
7
程序中分别设定了每个温度传感器采集数据的最大标准值,当某传感器所采集温度超标时,使主控节点的LED灯闪烁并开启蜂鸣器,发出警报。用户需要按键接收警报才能返回正常测温程序。在实际应用中,可以连接报警器或制动系统,以及时排除故障。
5 结束语
本文使用STM32作为主控芯片配合DS18B20温度传感器、CAN外围电路和LCD显示器,实现基于CAN总线协议的实时温度传感网络,并介绍了其硬件与软件设计与实现过程。由于其硬件电路与软件设计都较为简洁,因而在电动摩托车温度传感网络上具有较好的应用前景。
参考文献
[1]李宁.基于MDK的STM32处理器开发应用[M].北京:北京航空航天大学出版社,2008. [2]潘辉.STM32—FSMC机制的NOR Flash存储器扩展技术[J].单片机与嵌入式系统应用,2009(10):31–34.
附 录
温度传感器通讯程序
#include \"ds18b20.h\" #include \"delay.h\"
//复位DS18B20
void DS18B20_Rst(void) { DS18B20_IO_OUT(); //SET PA0 OUTPUT DS18B20_DQ_OUT=0; //拉低DQ delay_us(750); //拉低750us DS18B20_DQ_OUT=1; //DQ=1 delay_us(15); //15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在 //返回0:存在
u8 DS18B20_Check(void) { u8 retry=0; DS18B20_IO_IN();//SET PA0 INPUT while (DS18B20_DQ_IN&&retry<200) { retry++; delay_us(1); }; if(retry>=200)return 1;
8
else retry=0;
while (!DS18B20_DQ_IN&&retry<240) { retry++; delay_us(1); }; if(retry>=240)return 1; return 0;
}
//从DS18B20读取一个位 //返回值:1/0
u8 DS18B20_Read_Bit(void) // read one bit {
u8 data; DS18B20_IO_OUT();//SET PA0 OUTPUT DS18B20_DQ_OUT=0; delay_us(2);
DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PA0 INPUT delay_us(12); if(DS18B20_DQ_IN)data=1; else data=0;
delay_us(50); return data;
}
//从DS18B20读取一个字节 //返回值:读到的数据
u8 DS18B20_Read_Byte(void) // read one byte { u8 i,j,dat; dat=0; for (i=1;i<=8;i++) {
j=DS18B20_Read_Bit(); dat=(j<<7)|(dat>>1); } return dat;
}
//写一个字节到DS18B20 //dat:要写入的字节
void DS18B20_Write_Byte(u8 dat) { u8 j; u8 testb; DS18B20_IO_OUT();//SET PA0 OUTPUT; for (j=1;j<=8;j++) {
testb=dat&0x01; dat=dat>>1; if (testb) {
DS18B20_DQ_OUT=0;// Write 1
delay_us(2);
9
DS18B20_DQ_OUT=1;
delay_us(60); } else {
DS18B20_DQ_OUT=0;// Write 0 delay_us(60); DS18B20_DQ_OUT=1;
delay_us(2); } }
}
//开始温度转换
void DS18B20_Start(void)// ds1820 start convert { DS18B20_Rst(); DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom DS18B20_Write_Byte(0x44);// convert
}
//初始化DS18B20的IO口 DQ 同时检测DS的存在 //返回1:不存在
//返回0:存在 u8 DS18B20_Init(void) { RCC->APB2ENR|=1<<2; //使能PORTA口时钟 GPIOA->CRL&=0XFFFFFFF0;//PORTA.0 推挽输出 GPIOA->CRL|=0X00000003; GPIOA->ODR|=1<<0; //输出1 DS18B20_Rst(); return DS18B20_Check();
}
//从ds18b20得到温度值; //精度:0.1C //返回值:温度值 (-550~1250) short DS18B20_Get_Temp(void) {
u8 temp; u8 TL,TH; short tem;
DS18B20_Start (); // ds1820 start convert DS18B20_Rst(); DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom DS18B20_Write_Byte(0xbe);// convert TL=DS18B20_Read_Byte(); // LSB TH=DS18B20_Read_Byte(); // MSB if(TH>7) {
TH=~TH; TL=~TL;
temp=0;//温度为负 }else temp=1;//温度为正
10
tem=TH; //获得高八位 tem<<=8;
tem+=TL;//获得底八位
tem=(float)tem*0.625;//转换 if(temp)return tem; //返回温度值 else return -tem;
}
11
因篇幅问题不能全部显示,请点此查看更多更全内容