基于STM32的汽车仪表系统设计
1 方案设计
1.1 总体方案论证
本课题对于实现汽车仪表系统提出如下两套设计方案。
方案一:
本设计采用通过串口与按键的方式来进行汽车仪表的实现。该方式通过使用串口调试工具,在PC端向STM32芯片发送指令,经过STM32的识别后,输出到显示模块上。按键控制则是通过改变STM32芯片I/O口的高低电平,实现某个特定的仪表指示功能的点亮与熄灭。该方案分为硬件模块以及软件设计两个模块。其中硬件模块包括:主控芯片、按键控制电路、蜂鸣器报警电路、指针电机电路以及LED显示电路。软件方面采用了Keil5编程软件向STM32芯片烧写代码程序。
其中电源电路包括STM32的最小系统以及下载电路;按键电路主要负责系统的启动/关闭,以及相关指示灯的点亮/熄灭;蜂鸣器电路是根据STM32的输出信号,当某些报警条件触发时,蜂鸣器就会工作;电机电路采用伺服电机进行模块的控制,主要负责车速表的指针转动,转速表的指针转动等;LED显示电路则是根据STM32的输出信号,点亮对应的指示灯或熄灭对应的指示灯。
该方案的弊端主要为,机械式的仪表指针过于传统化,人机交互界面不够美观且智能化。同时,由于现代汽车仪表包含多种功能,需要大量的仪表指示灯与驾驶员进行交互。在本方案中采用的LED显示灯所呈现的信息不够生动、具体,而且需要大量的LED去表达对应的仪表指示灯,容易造成资源的浪费,且给项目的布线和通讯带来很大的麻烦。另一方面,由于项目存在大量的仪表模块,单一的点对点导线通讯很难完成高效的通讯实现,会对项目的实现造成干扰。
方案二:
本设计采用STM32芯片与CAN总线结合的方式实现汽车仪表。通过CAN分析仪发送报文,STM32处理输入输出报文信号,根据相应的条件控制显示模块与蜂鸣器模块。为了更直观的显示,在本设计中也增加了按键的硬线控制模块,通过按键控制某些特定的仪表灯。本设计主要分为硬件设计与软件设计。硬件模块包括:电源电路,蜂鸣器电路,按键电路以及LCD显示电路。软件设计主要由Keil5与Matlab来实现。
在本设计中,在LCD显示模块上,会采用软件烧写的方式,实现一款全液晶的仪表显示屏以取代电机模块与LED模块。相比于机械指针的方式,全液晶显示屏具有更美观,更直观的人机交互界面,同时节省了大量的LED以及布线需求。在通信的传递上,采用新兴的CAN总线传递方式,相比于传动的导线通信,CAN总线具有更高效,更稳定且更安全的通信方式。同时,在本次设计中,将会移植FreeRTOS实时操作系统到STM32芯片上。该方法可以实现多进程任务,可以在更好的处理不同情况下的仪表条件。
因此,采用方案二的汽车仪表系统更符合我们的实际需求,更贴切现代发展,该方案操作性高,维护性好,具有良好的安全性与实用性。因此,本设计采用方案二。
1.2 项目总体设计
本项目基于STM32F407设计的汽车仪表系统由:主控芯片,CAN通讯模块,按键模块,LCD显示模块和报警模块组成。STM32主控制芯片负责在接收到CAN通信传来的信号或者按键按下时的系统任务调度,经过主控芯片处理后,会输送到LCD显示模块和报警模块,执行点亮或熄灭相关指示灯,蜂鸣器警报,同步水温表,车速表等操作。系统功能框图如图1.1所示。

图1.1 系统功能框图
该项目分为两种控制方式:CAN总线通信以及按键硬线通信。通过使用CAN收发器实时发送CAN报文给STM32芯片,STM32芯片会判断是否满足相关条件,执行点亮/闪烁/熄灭相关仪表灯或报警。由于在STM32中移植FreeRTOS实时操作系统,会在一个循环周期内不停检测是否接收到CAN报文,执行多个任务调度,实现多个仪表灯的控制。按键控制则是通过定义好的I/O口与仪表灯,当按键按下或取消时,仪表灯和报警会有对应的显示。至此为该项目的流程与功能。
2 项目硬件设计
2.1 单片机
2.1.1 ARM Cortex-M4内核
ARM Cortex-M4内核处理器是由ARM公司开发的嵌入式处理器,用于满足数字信号控制市场的需求。该内核提供了高能效的数字信号控制,将32位控制与领先的数字信号处理技术集成来满足需要很高能效级别的市场[8]。
与Cortex-M3内核相比,Cortex-M4在数字信号处理方面具有更大的优势。所有DSP指令集都可以在一个周期内完成,Cortex-M3需要多个指令和周期才能完成等效功能。同时Cortex-M4具有专用于浮点任务的单元——FPU单元以及debug调试,可以使用JTAG或ST-Link这类简单、标准化的外部连接器进行调试。在功耗方面,Cortex-M4的性能也比Cortex-M3更好,具体如表2.1所示:
表2.1 Cortex-M4与Cortex-M3的功耗比较
Cortex-M3 Cortex-M4
流 程 台积电90nmG 65nm低功率工艺
优化类型 Speed优化 面积进行优化 Speed优化 面积进行优化
标准单元库 ARM的SC9 ARM的SC9 ARM的SC12 ARM的SC9
整体性能(总 DMIPS) 344 63 375 188
频率/MHz 275 50 300 150
电源效率/(DMIPS/MW) TBD 12.15 24 38
面积/mm2 0.083 0,047 0.21 0.11
FPU面积/mm2 不适用 不适用 0.08 0.06
2.1.2 STM32F407ZGT6芯片
为了满足汽车仪表的功能,本设计的主控芯片需要具有强大的数据处理功能的CPU,足够大的内存来存储图形界面图像以及较高的内部时钟来进行中断,定时器等功能,同时该芯片支持移植FreeRTOS操作系统。
因此本设计采用STM32F407ZGT6单片机作为主控芯片。它不单具有ARM Cortex-M4内核并且延展了其他的外围设备。该主控芯片所拥有的168MHZ时钟、定时器功能、FLASH大小以及SRAM符合了本设计所需求的图像储存空间以及中断功能。同时,该芯片还拥有丰富的通信接口,包含了在本次设计中需求的串口通信以及CAN接口通信。它还支持FreeRTOS操作系统,满足了本次设计的需求。STM32F407具有144个引脚供用户使用,引脚描述如图2.1所示:

图2.1 STM32F407引脚图
其中,部分引脚说明功能如表2.2所示:
表2.2 STM32F407引脚功能表
端口 引脚 第一功能 第二功能
位置 符号 功能 符号 功能
PE 58-68 PE7-PE15 通用I/0口 FSMC_D4-FSMC_D12 FSMC总线数据线
PF 10-15 PF0-PF5 通用I/0口 FSMC_A0-FSMC_A5 FSMC总线地址线
PE 140-141 PE0-PE1 通用I/0口 FSMC_NBL0-FMSC_NBL1 FSMC总线(SRAM专用)
48 PB2 通用I/0口 BOOT1 BOOT启动引脚
103 PA11 通用I/0口 USB_D-/CAN_RS USB/CAN引脚
104 PA12 通用I/0口 USB_D+/CAN_TX USB/CAN引脚
105 PA13 通用I/0口 JTMS JTAG/SWD仿真接口
109 PA14 通用I/0口 JTCK JTAG/SWD仿真接口
8-9 PC14-PC15 不可做I/0口 RTC晶振 外接RTC晶振用
2.2最小系统模块
在本课题中采用的主控芯片需要设计最小系统,该系统是指由最少组件组成的单片机可以工作的系统。本设计的最小系统模块主要有六个部分组成:主控芯片、电源电路、时钟电路、BOOT启动电路、调试接口电路、复位电路。主控芯片如图2.2所示:

图2.2 STM32F407主控芯片
图中的电源引脚VBAT引脚采用CR1220电池和VCC3.3混合电源模式。当使用外部电源时,CR1220不工作。断开外部电源后,CR1220供电以确保RTC正常运行,并且后备份寄存器的内容不会丢失。
STM32的复位电路包含三种方式:手动复位、上电复位、程序自动复位。如图2.3所示:

图2.3 复位模块电路
从图中可以看出该电路为低电平复位的方式,主要由于STM32采用低电位复位。图中的电阻以及电容构成了上电复位电路。其工作方式为,电容会在上电的时候得到充电,该充电动作会导致RESET出现一个很瞬时的低电平,进而导致芯片复位。而手动复位的工作方式为,RESET会在用户按下复位按键的时候接地,这样就会得到一个低电平,从而实现芯片的复位。在设计中,将LCD显示器的复位引脚也接在了该电路上,从而实现一起复位的效果。
同时STM32的最小电路较51单片机多了BOOT启动电路以及调试接口电路。Cortex-M4内核的STM32有4种启动模式,分别为:用户闪存启动——既flash启动,SRAM(内存)启动,系统存储器启动以及FSMC启动。原理图如图2.4所示:

图2.4 BOOT启动模块电路
调试电路具有两种调试接口,一种为采用5引脚连接的JTAG,另一种为2线串行连接的SWD。在本次课题中,将使用ST-LINK官方调试工具连接SWD接口进行调试。如图2.5所示:

图2.5 JTAG/SWD接口
2.3 LCD显示电路
本设计想要实现全液晶的汽车仪表系统,首先需要终端界面的实现,在本设计中采用ATK-4.3 TFTLCD电容触摸屏模块作为图形化界面的终端。此LCD显示屏是由ALIENTEK公司发明的一款电容式触摸屏模块,它具有4.3英寸的显示屏以及高性能的分辨率——800 * 480,采用16位真彩色显示,可以更好的显示汽车仪表中所呈现的各色各类的图形界面[9]。而且该芯片直接自带GRAM,无需外加驱动器,同时只需要3.3V或5V的供电,无需外加高压,因此非常适合本次的STM32单片机使用。LCD模块引脚图如图2.6所示:

图2.6 LCD模块引脚图
LCD显示屏有8位与16位两种连接方式,由于本设计的汽车仪表含有较多的图像信息,采用8位的连接方式不能够满足设计的需要,所有该模块采用具有更快的传输速度的16位的连接方式,这对于汽车仪表这类实时显示信息的设备来说,更快一倍的显示速率是尤为重要的。在此模块中,将LCD的RESET直接连接到主控芯片的RST,两者共享一个复位电路。同时,将其他I/O口与STM32的FSMC接口连接,即灵活的静态存储控制器,该接口能够与同步或异步存储器和16位PC存储器卡连接[10]。该电路图如图2.7所示:

图2.7 LCD电路图
2.4 CAN通信电路
本设计采用CAN总线通信的方式实现汽车仪表间的通讯,利用CAN总线分析器,采用上位机输入模拟信号的方式,向STM32单片机输入CAN报文。CAN是Controller Area Network 的缩写,是为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需要,由1986年德国电气商博世公司开发出面向汽车的CAN通信协议[11]。该协议特点如下所示:
(1)多主性;当总线空闲时,所有单元都可以发送CAN消息信号,而当两个以上的单元同时发送消息时,则根据标识符(ID)确定优先级。
(2)系统的灵活性;连接到总线的单元没有类似于“地址”的信息。因此,在总线上添加单元时,无需更改连接到总线的其他单元。
(3)通讯速度快,距离长;最高速度可达1Mbps(距离小于40M),最长距离可达10KM(速率小于5Kbps)。
(4)具有错误检测,错误通知和错误恢复功能。所有单元均可检测到错误。检测到错误的设备将立即通知所有其他设备。如果发送信息的设备检测到错误,它将强制当前传输结束。强制结束发送的单元会不断地重新发送此消息直到发送成功为止[12]。
(5)故障闭合功能;它可以确定错误的类型是总线上的临时数据错误还是连续数据错误。当总线上发生连续错误时,可以将错误单元与总线隔离。
(6)连接节点多;CAN总线可以同时连接到多个单元的总线。理论上,可连接单元不受限制。但是,它受到实际通信时间延迟和电气负载的限制。
综合以上特点,CAN总线通信技术十分契合本设计的汽车仪表系统,在本设计中采用的是ISO11898标准的CAN通信协议,该协议具有125Kbps~1Mbps的高速通信标准,为保证汽车仪表系统的实时通信效果,使用的是500Kbps的通信速率,足以满足本次设计需求。
在本次设计中采用TJA1050型号的CAN收发器作为CAN通信模块的主要芯片。CAN通信模块电路如图2.8所示。

图2.8 CAN模块电路
在本模块的设计中,将主控芯片的PA11引脚与TJA1050收发芯片连接在一起,再通过TJA1050芯片同外部的CAN总线连接。另外,在 CAN总线的起止端都有一个120Ω的终端电阻,来做阻抗匹配以减少回波反射[13]。
2.5蜂鸣器以及按键电路
为了更好的提现汽车仪表系统的完整性,扩展了两个功能模块,分别为蜂鸣器电路以及按键电路。其中,蜂鸣器电路是为了契合汽车仪表的报警功能,当报警条件满足时,LCD显示屏会点亮对应的报警信号等以供驾驶员的查考,同时,蜂鸣器会发出声响用以警示驾驶员。为了方便实用,本次设计采用的是有源蜂鸣器,有源蜂鸣器内部自带一个振荡电路,该电路在上电时就会产生振荡,然后发出声响。而如果使用无源蜂鸣器,还额外需要驱动信号(2~5Khz),才可以发声。蜂鸣器模块电路图如图2.9所示:

图2.9 蜂鸣器模块电路
在本模块设计中,三极管起到了扩流的作用。同时,为了避免当主控芯片复位的时候,蜂鸣器可能会误发声的现象,在接地端设计了一个下拉电阻,防止上述现象的发声。最后,将蜂鸣器信号与STM32的PF8引脚连接。
按键模块则是为了驾驶员在使用某些特定功能,按下开关后,汽车仪表盘会有相应的显示。在设计中,利用内部的上拉电阻器为该模块提供上拉,使用STM32的I/O输入时,无需设置外部上拉电阻。按键模块电路图如图2.10所示:
图
2.10 按键模块电路
3 软件设计
3.1 主程序设计
本课题设计的主程序流程如图3.1所示,开机后会初始化液晶显示屏,内部时钟以及I/O口。在FreeRTOS里建立两个任务,分别为主程序任务以及显示任务(主程序任务优先级大于显示任务)。主程序任务会根据内部时钟,不停地循环。当STM32收到信息或按键按下,会判断是否有效。如若无效,不执行任何操作,继续循环。如若有效,会切换到显示任务中,根据逻辑,输出对应的信号,更新LCD液晶显示屏上的信息或蜂鸣器鸣响。

图3.1 程序主流程图
3.2 FreeRTOS移植
FreeRTOS是一款免费的可裁剪的小型RTOS系统,同时也是一款可移植性极高的实时操作系统,由于汽车仪表系统需要判断多种任务状态,因此采用了操作系统。它提供了实时操作系统所需的基本功能包括:任务调度,任务管理,时间管理,消息队列,信号量,内存管理等[14]。同时,该系统也被称为抢占式的实时多任务系统,它将一个大任务分解为若干个小任务,由于小任务会很快执行完成,所以看起来像是同时执行了多个任务。同时,在小任务中会分配优先级的顺序,该系统的任务调度如图3.2所示:

图3.2 任务调度流程图
移植FreeRTOS需要去官网下载相关源码,适配到Keiil5的项目工程里。在适配中需要将sys.h文件中的宏SYSTEM_SUPPORT_OS修改为1,该宏决定了是否使用操作系统。还需要修改usart.c中的文件,在代码中添加FreeRTOS.h的头文件,将FreeRTOS引入进来,同时应用#if,#endif,防止头文件重定义。最后,封装好FreeRTOS操作系统所需要的延时函数,部分源码如图3.3所示:

图3.3 延时函数源码
完成上述工作后,在项目主函数中创建两个任务,高优先级的主程序任务TaskMain以及低优先的TaskDisplay。在TaskMain中会根据计数器的值,去执行2ms,5ms以及10ms的任务,进行无限循环,如图3.4所示:

图3.4 TaskMain循环任务
在TaskDispaly显示任务中,内嵌了emWin代码模型,用以实现在LCD液晶显示屏上更新图形信息。
3.3 emWin图形界面实现
为了完善本设计对仪表仪器人机交互界面操作的人性化、智能化的需求,本设计引用了emWin在stm32嵌入式设计,使用了GUIBuilder作为一种LCD界面图形可视化程序的设计方法,最终驱动硬件电路完成LCD显示[15]。在TaskDisplay中,利用Bmpcvt.exe软件可将png格式的图片转化为16进制的C代码格式。在APP模块中,调用GUIBuilder的API函数“GUI_DrawBitmap”,即可实现图片的显示。项目部分源码如图3.5所示:

图3.5 emWin实现
emWin可以在操作系统下的多任务中工作。它具有模块化的特点,采用分层结构。emWin总共包括4层,每层可以单独使用。包括第一层:LCD驱动器;第二层:图形库;第三层:插件库;第四层:窗口管理器[16]。emWin是以C语言的形式实现,通过对第一层的修改,就可应用到项目中。emWin模块流程图如3.6所示:

图3.6 emWin流程图
在汽车仪表的图形化界面设计中,最为重要的就是仪表指针转动的设计。仪表指针需要根据STM32收到的CAN报文,来在图形界面中有相应的显示。为了使指针的精度精准,需要用量角器测出仪表盘的数据刻度,在代码中进行算法优化。以车速表为例,如图3.7所示:

图3.7 车速表概念图
如上图所示,将该仪表盘看做一个在坐标轴上的圆形,从X轴起始到0刻度大约为225度,到170刻度大约为45度。因此该车速表可以看做一个半径为1的270度圆,既1.25×3.14+0.25×3.14。当CAN报文传输进20KM/h的值时,只需让指针指向约195度的位置,既1.16×3.14,就可以实现仪表指针的精准转动。具体代码如图3.8所示:

图3.8 指针算法
具体的数据会在调试中,根据实际情况的变化而改变以到达最小误差的效果。
文章底部可以获取博主的联系方式,获取源码、查看详细的视频演示,或者了解其他版本的信息。
所有项目都经过了严格的测试和完善。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)