基于STM32汽车仪表系统设计

来源:小学作文 发布时间:2021-01-05 点击:

  目

 录 摘

 要 .................................................................................................................... I

 Abstract..................................................................................................................... II

 引

 言 ................................................................................................................... 1

 1 方案设计 ............................................................................................................... 3

 1.1 总体方案论证 .............................................................................................. 3

 1.2 项目总体设计 .............................................................................................. 4

 2 项目硬件设计 ....................................................................................................... 6

 2.1 单片机 .......................................................................................................... 6

 2.1.1 ARM Cortex-M4 内核 ......................................................................... 6

 2.1.2 STM32F407ZGT6 芯片 ....................................................................... 6

 2.2 最小系统模块 ............................................................................................... 8

 2.3 LCD 显示电路 ............................................................................................ 10

 2.4 CAN 通信电路 ........................................................................................... 11

 2.5 蜂鸣器以及按键电路 ................................................................................. 12

 3 软件设计 ............................................................................................................. 14

 3.1 主程序流程 ................................................................................................ 14

 3.2 FreeRTOS 移植 ........................................................................................... 15

 3.3 emWin 图形界面实现 ................................................................................ 16

 3.4 Simulink 建模处理 ..................................................................................... 19

 4 项目调试 ............................................................................................................. 21

 4.1 软件调试 .................................................................................................... 21

 4.1 重点问题及解决 ........................................................................................ 22

 结

 论 ................................................................................................................. 24

 参考文献 ................................................................................................................. 25

 附录:程序主函数 ................................................................................................. 27

 致

 谢 ................................................................................................................. 36

 本科论文

  摘

 要

 当前,随着科技的发展,汽车功能的日益增多,汽车仪表系统也变得愈发多元化。传统的机械式指针仪表因为其繁琐的布线方式和点对点的通信方式,已不能满足当前行业的需求。因此,研究一款功能多样,结构简单,安全可靠的仪表系统成为汽车产业技术开发和研究的热点之一 [1] 。

 本次课题基于 STM32F407 微型控制器以及 CAN 总线通信技术,设计一款新型全液晶汽车仪表。相比于传统的机械式指针仪表,本设计的汽车仪表具有简单的接线方式,快速的模块之间通讯以及全液晶显示等特点。同时,该课题中采用 emWin 技术进行 LCD 液晶显示屏的设计,具有更直观美化的人机交互界面,而且由于采用了 CAN 总线通信方式,元器件与控制元件(ECU)之间信息传递性将会更好。本次课题,采用 CAN 分析仪开发测试工具,通过定义好相关模拟变量,模拟实际汽车中的情况输入 CAN 信号报文并利用 Simulink 建模进行汽车仪表灯的逻辑处理。同时将 FreeRTOS 实时操作系统移植到 STM32F407 上,利用 STM32 芯片输入输出信号,进而达到点亮汽车仪表的目的。

 通过软件与硬件方面的调试,该课题达到了预期研究要求,证明了课题技术上的可行性以及延展性。

  关键词:汽车仪表; CAN 总线; STM32F407;

 Simulink 建模; FreeRTOS

 本科论文

 Abstract

 With the development of science and technology, the function of automobile is increasing rapidly. The traditional mechanical pointer instrument can not meet the needs of current industry because of its cumbersome wiring mode and point-to-point communication. Therefore, the research of

 a new instrument system with characters like function diversification, simple structure, safe and reliable has become one of the important issues in the development and research of automobile industry technology [1] . Based on stm32f407 micro controller and CAN BUS communication technology, this project designs a new type of full LCD automobile instrument. Compared with the traditional mechanical pointer instrument, the new instrument has the characteristics of simple wiring, fast communication between modules and full LCD display. In addition, the design of LCD with emWin technology in this project provides a more visibly human-computer interface. By using CAN bus communication, the information transmission between components and control elements (ECU) is better. In this project, CAN analysis tool is used to simulate actual situation by giving relevant simulation variables, inputting CAN signal message and carrying out the logic processing of vehicle instrument lamp with Simulink modeling. Moreover, the FreeRTOS real-time operating system is also transplanted to stm32f407, the input and output signals of STM32 chip are used to lighten the automobile instrument. Through the debugging of software and hardware, the project has achieved the expected research requirements, and has proved the technical feasibility and scalability of this project.

  Keywords: Automobile instruments; CAN bus; STM32F407; Simulink modeling; FreeRTOS

 本科论文

  引

 言 众所周知,随着时代的进步,汽车逐渐成为人们在生活和工作中密不可分的一种工具。而随着智能化的来临,通讯网络,计算机,微控制器,自动控制等产品正在不断发展,人们对于产品的方便性以及舒适性也越来越看重,使得传统的人工工艺和机械装备不再满足人们的需求,因此,一代代更加智能且美观的产品成为当下发展的重要课题。而汽车伴随着时代的发展,也在逐渐向着机械与电子一体化,智能化汽车产业的方向靠近 [2] 。

 正如同汽车之于人们的重要性不言而喻,汽车仪表对于汽车的重要性也是重中之重。汽车仪表作为驾驶员在使用汽车时,最重要且最直接的交互窗口,它可以实时反馈汽车在行驶中的各种动态信息。包括:发动机转速,当前车速,油表显示,水温表显示以及报警信息等。因此,汽车仪表的发展成为了汽车发展的首要前提,汽车仪表的研究与设计代表对整个汽车技术进步有着至关重要的作用。而传统的汽车工艺制作需要用到大量的焊接过程,由于焊接操作难度大,工作环境恶劣,焊接质量要求高等原因,人工焊接早已被淘汰 [3] 。同时由于传动的机械式指针汽车仪表,其通信方式为点对点的导线布线,在汽车功能俞加增多的当下,传统的通信方式已经很难实现如此多的元器件之间的通信。而且其指针式的仪表外观也不被大众所青睐。因此基于当下发展,本课题所研究的基于 STM32 与 CAN 总线的新型全液晶仪表可以在很大程度上避免这些问题。

 通过针对真实的 CAN 网络系统,将其仪表系统进行虚拟化建模,在此基础上把若干真实的节点引入到该虚拟系统中 [4] ,并通过 CAN 分析仪实现模拟数据的传递。由于 STM32 芯片在某一时刻仅能进行一个任务,无法满足汽车仪表需要同时响应多种情况的需求。因此在本课题中,需要将FreeRTOS 实时操作系统移植到 STM32 上,它能够支持多任务,任务抢占,相对来说,CPU 利用率会有所提高 [5] 。这样一来,STM32 芯片就可以在 CAN总线的配合下,实现汽车仪表的功能。另一方面,由于取消了指针式的机械仪表,需要在 LCD 显示屏呈现整个汽车仪表盘的形象,提供良好的人机交互界面。因此本课题引用了 emWin 来实现。emWin 是 Segger 公司针对嵌入式平台开发的稳定、高效的图形软件库,适合用于任何图形 LCD 的操作应

 本科论文

 用,并可输出高质量的无锯齿的文字和图形,通过调用 emWin 提供的函数接口,开发嵌入式图形界面应用变得简单而快捷 [6] 。同时由于汽车仪表中,存在较多的信号算法来进行信息处理,而该信号算法,是由 Matlab\ Simulink建模模块来实现的。Simulink 是存在于 MATLAB 的框图设计环境下的一种可视化仿真工具,对于各种时变系统,包括通讯、控制、信号处理、视频处理和图像处理系统,Simulink 提供了交互式图形化环境和可定制模块库来对其进行设计、仿真、执行和测试。它提供了一种更快捷、直接明了的方式,而且用户可以立即看到系统的仿真结果 [7] 。通过在 Simulink 中模拟输入输出变量的情况,实现汽车仪表灯的算法。最后,STM32 会根据输入信号的情况,将输出信号传递给 LCD 液晶显示屏以点亮相关仪表灯。

 本文基于STM32F407设计的汽车仪表系统设计,本篇论文共分为四章,主要内容如下:

 第一章:系统方案设计。主要研究系统的设计目标与设计方案,结合当下情况探讨自己的设计方案,选择合适的硬件模块和软件架构进行课题设计。

 第二章:项目硬件设计。根据系统方案设计,确定课题的硬件设计模块,主要包括 STM32 主控芯片模块,CAN 通讯模块、LCD 显示屏模块,按键控制模块以及蜂鸣器报警模块。

 第三章:项目软件设计。包括移植 FreeRTOS 操作系统,Simulink 的逻辑建模,利用 emWin 开发图形界面,最后封装到 STM32 芯片上。

 第四章:系统调试。利用 CAN 分析仪对项目进行调试,查找代码 bug以及项目硬件连接的调试,分析存在的问题以及解决方法。

 本科论文

 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 系统功能框图

  STM32F407 电源模块 按键模块 报警模块 LDC 显示模块 CAN 收发器 CAN 模块

 本科论文

 该项目分为两种控制方式: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 程序主流程图

 上位机利用 CAN 分析仪发送信息 CAN 模块接受信息传给单片机/按键按下 读取 CAN 报文判断该信号是否有效 输出对应的信号给LCD 显示屏/蜂鸣器 LCD 显示屏更新信息/蜂鸣器鸣响 Y N 开始 结束

 本科论文

 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 报文,来在图形界面中有相应的显示。为了使指针的精度精准,需要用量角器测出仪表盘的数据刻度,在初始化 LCD 设置坐标 读 emWin 指令 写 emWin 指令 写入颜色数据 LCD 显示 单片机处理 读出颜色数据 开始

 本科论文

 代码中进行算法优化。以车速表为例,如图 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 指针算法 具体的数据会在调试中,根据实际情况的变化而改变以到达最小误差的效果。

 本科论文

 3.4 Simulink 建模处理 在本设计的逻辑处理代码中,采用 Simulink / Stateflow 工具箱对汽车仪表系统进行建模和仿真,以便算法模型自动生成 C 代码并将其下载到硬件电路板上。基于模仿的开发方式前期不依赖于硬件平台,开发效率高,避免了传统手写代码开发周期长,一般需要重复多次才能成功的避免 [17] 。本次建模处理主要分为两个模块:报警灯模块以及报警声音模块。由于汽车仪表含有较多的报警模块,所以使用 Simulink 建模工具会大大节约时间。使用方法主要是在界面中定义好输入输出变量,添加逻辑处理模块,对输入的变量进行逻辑处理后,主要是在状态机之间的跳转,将得到的输出变量传送出去。报警灯部分建模如图 3.9 所示:

 图 3.9 报警灯模型 上图显示模型为报警灯模型,由于大部分报警灯仅需要满足输入信号,即可输出报警信号点亮报警灯,所以并未过多的状态机跳转。而报警声音模块需要由于仅有一个有源蜂鸣器,所以需要判断,当前蜂鸣器所响应的报警优先级,如低优先级则替换到该声音,如高优先级,则等待高优先级结束再响应,算法流程图如图 3.10 所示:

 本科论文

  图 3.10 报警声音模型 在该模型中,首先会将所有输入信号的优先级的排好序,设置一个CurrentPriority 变量作为标志位。当高优先级的信号传进来后,会将赋给CurrentPriority。进而在状态机中,会根据 CurrentPriority 变量的值来进入相应的报警声音模块中,之后 CurrentPriority 会被初始化。由于项目在运行了FreeRTOS 操作系统,所以会不断的接收变量信号,一旦有更高优先级的信号被接收,当前的报警声音就会被中断,CurrentPriority 就会进入下一个报警模块中。

 本科论文

 4 项目调试 4.1 软件调试 本课题设计的汽车仪表系统采用 Keil5 开发环境,该环境的编译器以及调试工具可以和 STM32 很好的匹配。本次设计的的虚拟仪表能够实时显示当前车速、当前油量、水箱温度等信息。该平台使得人机交互系统更加的实用、美观、操作简单 [18] 。

 本设计基于STM32F407控制,利用CAN分析仪在PC端发送指定CAN报文给 STM32 单片机,根据程序逻辑来驱动 LCD 液晶显示模块。主要在Keil5 环境下,基于 C 语言开发。在 Keil5 中,新建一个 FreeRTOS 的新项目,选择 STM32F407ZGT6 芯片,再将从官网下载的 FreeRTOS 以及 emWin的源码移植进去,修改相关的配置文件,可以进行本项目的代码设计。在本项目中采用 ST-LINK 调试工具,配置好相关设计后,当编写完程序编译通过后,可以直接通过 ST-Link 工具下载到 STM32 芯片中,不必通过串口烧录 HEX 文件的形式。同时,可以调用 Keil5 中的 debug 窗口,可以实时查看程序的运行状态,在需要调试的地方加入“断点”,可以排查出现问题的代码。如图 4.1 所示:

  图 4.1 Keil5 环境 debug 调试模式 通讯方面使用 Can 分析仪的上位机软件,编辑定义好的 CanID,发送

 本科论文

 指定字节的 Can 报文来调试仪表的功能实现,上位机软件如图 4.2 所示:

 图 4.2 Can 分析仪上位机软件调试界面 4.1 重点问题及解决 在实物的调试过程中,主要包含以下几个重点问题:

 (1)

 CAN 通信不成功; (2)

 图形界面冲突,会出现一个图形被另一个覆盖的情况; (3)

 仪表指针异常,无法指向 CAN 报文发来的数据位置; (4)

 编译不通过,STM32 没有足够的空间存储图片信息; 经过多次调试排查,第一种情况需要先检查 CAN 总线的波特率是否保持一致,可以应用 EmbededConfig(分析仪配置软件),配置波特率保持一致,检查 CAN_H 和 CAN_L 信号是否接反。同时在上位机界面中,需要将报文配置为标准帧,标准帧的ID长度不同于扩展帧,容易造成信息不匹配。针对图形界面冲突的问题,原因是由于在实现一个图像的时候,需要先将该图像所在的坐标“清除”出来,以便显示图像。解决办法是在代码中将突出的图像放在一个循环中,以免出现覆盖的现象。仪表指针异常,经过使用Keil5 调试诊断,发现是由于 CAN 报文发送的是 16 进制的数据,而在指针算法中采用的是十进制的算法,数据不匹配造成的。可以采用位操作的技巧,

 本科论文

 取出正确的数值。最后一个问题,是由于 STM32 的存储空间有限,较大的图像信息过多的占用内存,可以应用 Photoshop 软件改变图片的像素大小,优化内存占用,可以解决上述问题。最后实物图像如图 4.3 所示:

 图 4.3 项目实物图

 本科论文

  结

 论

 控制器方面本设计采用的 STM32F407 符合本设计的控制需求,拥有良好的 CPU 处理功能,高精度的内部时钟, FLASH 以及 SRAM 存储器,多个 AD 通道,I/O,以及定时器通讯接口等功能。本设计使用的 CAN 收发器2.0V 可以很好的与 STM32F407 兼容使用,具有高效率的信息传递性。配合CAN 分析器的诊断报文,STM32 可以很好的接收模拟的 CAN 数据,同时将输出信号传递给 LCD 液晶显示屏,该 4.3 寸的液晶显示屏同时也很好的模拟了汽车仪表的图形界面功能,具有比较美观的图形界面。该设计方案达到了我们的预期设计。

 当在上位机发送指定的 CAN 信息后,如“主驾安全带未系”,“ABS 报警灯”, “当前车速80KM/S”等,经过CAN收发器的接收传递给STM32F407,STM32F407 经过逻辑运算,判断该信息是否符合显示模块的条件,进而驱动 LCD 显示屏以及蜂鸣器模块。LCD 显示屏就会根据 emWin 指令,在屏幕指定位置呈现图形,包括不同颜色,是否闪烁等情况。当再次收到 STM32指令时,也会进一步决定是否取消报警或更换报警等情况。既此时为一个周期的流程,该流程在整个汽车仪表系统中为 10ms 一次,从上电开始。

 采用 CAN 总线通信的汽车仪表系统,通信效果得到很大的增强,抗干扰能力也有显著的提高。而 LCD 液晶显示屏的改进,也使得人机交互界面更加的美观,令人舒适。由于该项目仅为模拟通信实验,具体实验数据还有待考证,包括 MCU 的处理效率,多 MCU 间的 CAN 通信,液晶显示屏的动画效果等。但由此可见基于 CAN 总线通信的液晶汽车仪表,在未来具有很大的期望空间。

 本科论文

  参考文献

 [1] 李静. 基于 CAN 总线的新型汽车仪表系统的设计与实现[D].南京邮电大学,2017. [2] 许德章.现代汽车仪表技术与发展趋势[J].汽车电器,2002(05):1-2. [3] 陈慧,张新丰编著. 汽车电子控制系统仿真与设计[M]. 上海:同济大学出版社, 2017.01.11-12. [4] 刘学晶. 基于 CAN 总线的车用仪表系统的设计与研究[D].上海工程技术大学,2016 [5] 左忠凯,刘军,张洋著. FreeRTOS 源码详解与应用开发 基于 STM32[M]. 北京:北京航空航天大学出版社, 2017.07.22-23. [6] 钟涛,祝玲.基于 STM32 单片机的 emWin 系统设计[J].中国新通信,2017,19(07):53-54 [7] 朱迪. FreeRTOS 实时操作系统任务调度优化的研究与实现[D].南京邮电大学,2015 [8] 廖义奎编著. ARM Cortex M4 嵌入式实战开发精解 基于 STM32F4[M]. 北京:北京航空航天大学出版社, 2013.07.54-55. [9] 任克强,王传强.基于 STM32F4 的多通道串口驱动 TFT 液晶屏显示系统设计[J].液晶与显示,2020,35(05):449-455 [10] 石长华,孙小霞,冯晓晖,徐贝贝.基于 emWin 的汽车发动机转速表表盘的制作[J].内燃机与配件,2017(18):11-13 [11] 毕国兴. 基于 CAN 总线的电动汽车仪表研究与开发[D].青岛理工大学,2012 [12] 刘炳,刘青青.基于 STM32F107 的 CAN 总线双通道通讯技术[J].中国科技信息,2020(09):56-57. [13] 司云腾. 基于 CAN 总线的汽车组合仪表综合系统设计[D].南京信息工程大学,2018 [14] 张龙彪. 嵌入式实时操作系统 FreeRTOS 的内核研究[D].昆明理工大学,2013

 本科论文

 [15] 陈继华,汤涛林,李国栋,许明昌.emWin 在 stm32 和 ra8875 中的嵌入式设计[J].电子设计工程,2019,27(08):156-160 [16] 陈新,蒲庆文.基于 emWin 图形库的电动汽车液晶仪表设计[J].仪表技术与传感器,2013(07):105-107 [17] 倪朋朋,顾海全,王文斌,郑丽丽.基于 Simulink/Stateflow 的汽车转向灯控制系统的研究[J].汽车零部件,2019(11):25-29 [18] 章敏凤,束文强.基于 STM32 的汽车仪表装置的设计[J].东莞理工学院学报,2018,25(05):17-21 [19] 谭浩强. C 程序设计[M]. 北京: 清华大学出版社,1999:45-78 [20] Martina Sciaccaluga,Ilaria Delponte. Investigation on human factors and key aspects involved in Autonomous Vehicles -AVs- acceptance: new instruments and perspectives[J]. Transportation Research Procedia,2020,45.

 本科论文

  附录:程序主函数

 #include "GUI.h" #include "JPGResource.h" #include "displayapp.h" #include "sys.h" #include "delay.h" #include "key.h" #include "Beep.h"

 uint16_t gEngCoolantValue = 0; uint16_t gFuelResistanceValue = 0; uint16_t gESCVehSpeed = 0;

 //0-170km/h uint32_t gEMSEngSpd = 0;

  //0-8000 uint32_t gODOMeter = 0; uint8_t gturnleft = 0; uint8_t gturnright = 0; uint32_t flag = 0; uint8_t gAir = 0; uint8_t gseatbelt = 0; uint8_t gseatbelt1 = 0; uint8_t gABSwarning = 0; uint8_t gPark = 0; uint8_t gposition = 0;

 static const GUI_POINT aPointer[] = {

 { 0, 10 },

 { 150, 0 },

 { 0, -10 },

 { -20, 0 }, }; static const GUI_POINT aSmallPointer[] = {

 { 0, 5 },

 { 40, 0 },

 { 0, -5 },

 { -10, 0 }, };

 static GUI_POINT aPointerHiRes[countof(aPointer)];

 本科论文

 static GUI_POINT aSmallPointerHiRes[countof(aSmallPointer)];

 typedef struct { GUI_AUTODEV_INFO AutoInfo; GUI_POINT aPoints[countof(aPointer)]; GUI_POINT aSmallPoints[countof(aSmallPointer)]; int Factor; }PARAMPolygon;

 #define HMI_POS_Y 25

 static void DrawSpeed(void * p)

 {

 int posX = 25, posY = HMI_POS_Y;

 PARAMPolygon * pParam = (PARAMPolygon *)p;

 if (pParam->AutoInfo.DrawFixed) {

 GUI_ClearRect(posX, posY, bmspeed.XSize + posX, bmspeed.YSize + posY);

 GUI_DrawBitmap(&bmspeed,posX,posY);

 }

 GUI_AA_FillPolygon(pParam->aPoints, countof(aPointer), (posX + 160)*pParam->Factor, (posY + 160)* pParam->Factor );//车速针

 GUI_AA_FillPolygon(pParam->aSmallPoints, countof(aSmallPointer), (posX + 170)*pParam->Factor, (posY + 305)* pParam->Factor);//油表针 }

 static void DrawVelocity(void * p)

 {

 int posX = 425, posY = HMI_POS_Y;

 PARAMPolygon * pParam = (PARAMPolygon *)p;

 if (pParam->AutoInfo.DrawFixed) {

 GUI_ClearRect(posX, posY, bmvelocity.XSize + posX, bmvelocity.YSize + posY);

 GUI_DrawBitmap(&bmvelocity,posX,posY);

 }

 GUI_AA_FillPolygon(pParam->aPoints, countof(aPointer), posX + 160, posY + 160);//转速针

 GUI_AA_FillPolygon(pParam->aSmallPoints, countof(aSmallPointer), posX + 170, posY + 305);//水温 }

 void keyBeam() {

 本科论文

  u8 key;

  key=KEY_Scan(0);

  if(key)

  {

  if(key == WKUP_PRES)

 {

 GUI_DrawBitmap(&bmHigh_Beam,610,380);

 }

 else

 {

  GUI_ClearRect(610, 380, bmHigh_Beam.XSize + 610, bmHigh_Beam.YSize + 380);

 }

 if(key == KEY0_PRES)

 {

  GUI_DrawBitmap(&bmlow_beam,530,380);

  }

 else

 {

  GUI_ClearRect(530, 380, bmlow_beam.XSize + 530, bmlow_beam.YSize + 380);

 }

  }else delay_ms(10); }

 void show() {

 if( gturnleft == 1)

  {

 if( flag == 1)

  {

 GUI_DrawBitmap(&bmTurn_left,255,380);

 BEEP = 1;

  delay_ms(100);

 BEEP = 0;

  }

 else

  {

 GUI_ClearRect(255, 380, bmTurn_left.XSize + 255, bmTurn_left.YSize + 380);

  }

 本科论文

 }

 if( gturnright == 1)

  {

 if( flag == 1)

 {

  GUI_DrawBitmap(&bmTurn_right,445,380);

  BEEP = 1;

  delay_ms(100);

  BEEP = 0;

 }

 else

  {

 GUI_ClearRect(445, 380, bmTurn_right.XSize + 445, bmTurn_right.YSize + 380);

  }

  }

 if( gABSwarning == 1)

 {

  GUI_DrawBitmap(&bmABS_warning,310,5);

 }

 else

 {

  GUI_ClearRect(310, 5, bmABS_warning.XSize + 310, bmABS_warning.YSize + 5);

 }

 if( gPark == 1)

 {

  static int t = 0;

  GUI_DrawBitmap(&bmParkingIndication_green,400,10);

  if( t == 0)

  {

 BEEP = 1;

 delay_ms(100);

 BEEP = 0;

 delay_ms(100);

 BEEP = 1;

 delay_ms(100);

 BEEP = 0;

 t = 1;

  }

 }

 else

 本科论文

  {

  GUI_ClearRect(400, 10, bmParkingIndication_green.XSize + 400, bmParkingIndication_green.YSize + 10);

 }

 if( gposition == 1)

 {

  GUI_DrawBitmap(&bmPosition_lamp,690,380);

 }

 else

 {

  GUI_ClearRect(690, 380, bmPosition_lamp.XSize + 690, bmPosition_lamp.YSize + 380);

 }

 if( gAir == 1)

  {

  GUI_DrawBitmap(&bmAirbag_warning,35,380);

  }

  else

  {

 GUI_ClearRect(35, 380, bmAirbag_warning.XSize + 35, bmAirbag_warning.YSize + 380);

  }

  if( gseatbelt == 1)

  {

  GUI_DrawBitmap(&bmseatblet,105,380);//显示

 BEEP = 1;

 delay_ms(50);

 BEEP = 0;

 delay_ms(50);

 BEEP = 1;

 delay_ms(50);

 BEEP = 0;

 delay_ms(1000);

  }

  else

  {

 GUI_ClearRect(105, 380, bmseatblet.XSize + 105, bmseatblet.YSize + 380);//清除

  }

  if( gseatbelt1 == 1)

  {

 本科论文

  GUI_DrawBitmap(&bmseatblet_1,18...

推荐访问:仪表 汽车 设计
上一篇:【演说稿】要想撰写一篇独具一格、引人入胜领导讲话,你要掌握这些技巧
下一篇:快手短视频平台下区域探店视频创作研究

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有