嵌入式面试—项目篇(二)全国大学生智能汽车竞赛(团队项目)

   日期:2021-03-04     浏览:124    评论:0    
核心提示:2019.3一2019.7 基于MK60DN512ZVLQ10 的室外自动寻迹智能越野车(集体项目) 2020.3一2020.7 基于NXP i.MX RT1064的电磁AI寻迹智能小车(集体项目)软件环境:keil5 IDE、Altium Designer 17硬件环境:NXP MK60DN512ZVLQ10 MCU(2019)、NXP i.MX RT1064 MCU(2020)项目描述:此项目为第十四届、第十五届全国大学生恩智浦杯智能汽车竞赛室外越野竞速项目,依照组委会公布的比赛规则,

2019.3一2019.7 基于MK60DN512ZVLQ10 的室外自动寻迹智能越野车(集体项目)

 2020.3一2020.7 基于NXP i.MX RT1064的电磁AI寻迹智能小车(集体项目)

软件环境:

keil5 IDE、Altium Designer 17

硬件环境:

NXP MK60DN512ZVLQ10 MCU(2019)、NXP i.MX RT1064 MCU(2020)

项目描述:

此项目为第十四届、第十五届全国大学生恩智浦杯智能汽车竞赛室外越野竞速项目,依照组委会公布的比赛规则,我们运用了上述的技术点,克服赛道中的坡道、横断路障等元素实现了小车沿赛道的自动寻迹,分别荣获西部赛区二等奖、华南赛区二等奖。

运用的技术点:

1.PID控制算法: 小车方向控制采用位置式PD控制,速度控制采用双反馈增量式PID控制。
2.滤波算法: 冒泡排序-中位均值滤波、限幅滤波。
3.MCU模块: FTM、PIT中断、I/O、外部中断、模拟SPI、UART、KBI中断、ADC。
4.路径识别模块: LC并联谐振选频放大检波电路、MCU ADC转换、HC-SR04超声波测距。
5.测速模块: 512线编码器、MCU正交解码。
6.人机交互界面: 按键中断、OLED显示屏、MCU模拟SPI驱动显示。
7.电机驱动模块: HIP4082+LR7843 4MOS管H桥电机驱动电路、MCU FTM产生PWM波。
8、AI机器学习: 方向控制采用训练好的模型进行控制(2020)

个人职责:

第十四届(2019年)担任车队硬件负责人,主要负责硬件电路设计,主要有电机H桥驱动电路,电磁信号采集电路、核心中控电路,同时负责项目MCU、传感器选型。
第十五届(2020年)担任校智能车队总负责人。与组员、其他队伍一起开发小车的软件和硬件,统筹项目进度与计划;主要负责小车软硬件的架构设计。

讲述:项目的硬件核心处理器NXP MK60DN512ZVLQ10 MCU(2019)、NXP i.MX RT1064 MCU(2020)

参数 K60DN512 补充 i.MX RT1064 补充
主频 100MHZ 600MHZ
内核 ARM-Cortex-M4 ARM-Cortex-M7
SRAM 128k 1M 外置32M
Flash 512k 4M
UART 6个 8个
SPI 3个 2个
I2C 2个 4个
I2S 1个 3个
CAN 2个 2个
16位ADC模块 2个
12位ADC模块 2个 2个
FTM模块 3个 4个
16位定时器 13个 4个
32位定时器 4个 6个
外部中断 所有IO都支持

选这款芯片的原因是内置的UART、SPI、ADC都十分符合我们的需求。我们最重要的ADC采集部分用了10路, FTM模块用了5个(2个电机、2个编码器、1个舵机)、OLED使用SPI,硬件部分:电机H桥驱动电路,电磁信号采集电路、核心中控电路。

功能:
克服赛道中的坡道、环岛、横断路障、十字路口等元素实现了小车沿赛道的自动寻迹,各个学校相同赛道完成,比速度(2.1米/秒,16/50,2.7米/秒、17/50)

技术点说明:
软件部分:
1.PID控制算法:
P比例环节:及时成比例地反映控制系统的偏差信号,偏差一旦产生,控制器立即产生控制作用,以减少偏差。

I积分环节:主要用于消除静差,提高系统的无差度。积分作用的强弱取决于积分时间常数,越大,积分作用越弱,反之则越强。

D微分环节:能反映偏差信号的变化趋势(变化速率),并能在该偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。

在计算机控制系统中,数字 PID 控制算法通常又分为位置式 PID 和增量式 PID。
小车方向控制采用位置式PD控制,速度控制采用双反馈增量式PID控制。
输出量 =P误差+I误差的积分+D*误差的变化

4.3.1位置式PID
位置式PID中,由于计算机输出的u(k)直接去控制执行机构(如阀门),
位置式PID控制算法的缺点是:由于全量输出,所以每次输出均与过去的状态有关,计算时要对过去e(k)进行累加,计算机工作量大;

PID控制:DUTY+Kperror+Ki error_integral+Kd*(current_error-last_error)
PD控制:DUTY+Kperror+Kd(current_error-last_error)

PD控制
1) 若偏差正在减小的过程, PD控制的量要比纯比例
控制量小一些,这样能够避免过度控制
2) 若偏差在逐渐增加的过程, PD所要施加的量比纯
比例要多一些,目的是为了抑制误差增大的趋势。
所以 D 这一项有一些预测控制的味道 ,相比 P 而言要更智能一些

4.3.2增量式PID
当执行机构需要的是控制量的增量(例如:驱动步进电机)时,增量的PID控制算式:

最后选用的采样周期为 20ms,即每 20ms 对电机
进行一次 PID 调节。

增量型算法与位置型算法相比,具有以下优点:增量型算法不需要做累加,增量的确定仅与最近几次偏差采样值有关,计算精度对控制量的计算影响较小,而位置型算法要用到过去偏差的累加值,容易产生大的累加误差;增量型算法得出的是控制量的增量,而位置型算法的输出是控制量的全量输出,误动作影响大;采用增量型算法,易于实现手动到自动的无冲击切换

2.滤波算法: 冒泡排序-中位均值滤波、限幅滤波。
单片机会连续对每个电感采集5次,使用冒泡法将数据从小到大排序后,去掉最大值和最小值,取平均值作为该次采集的数值。经测试,该滤波效果较好,可以滤掉部分高频噪声,获得的电感值稳定。获得电感值后,对当前采集到的值进行归一化处理。归一化的基本思想是:取得当前采集值(ADget)相对于当前赛道的最大值(ADMAX)、最小值(ADMIN)的相对大小,具体公式为:

归一化之后,通过对多个方向的电感值融合,获得作为PID输入的偏差。

3.MCU模块: FTM、PIT中断、I/O、外部中断、模拟SPI、UART、ADC。
FTM全称FlexTimer Module (柔性定时器模块)
FTM模块的核心是一个16位计数器,该计数器的时钟来源可设置(系统时钟(一般选择)、外部时钟)
作为一个高级单片机里的定时器模块,FTM模块具有多种功能供用户使用,例如输入捕获,输出比较,PWM比较,PWM输出,AB相正交解码等等
通过配置寄存器,单个FTM模块的不同通道可以工作在不同模式下。
单个模块下各个通道间PWM频率必须相同,可以有不同的占空比。(原因是配置频率的寄存器每个模块只有一个,配置占空比的寄存处每个通道就有一个)(智能车比赛中舵机一般均为50Hz,电机一般5~20 KHz不等)

4.路径识别模块: LC并联谐振选频放大检波电路、MCU ADC转换、HC-SR04超声波测距。

5.测速模块: 512线编码器、MCU正交解码。
采用增量式512线光电编码器,其供电电压为3.3V或5V,输出为小幅值的正弦信号。为了将此信号放大整形,设计了信号调理电路,其基本原理是使用一个运放做成比较器电路,调节参考电压,使输出变为0V-3.3V的方波信号,送入单片机进行运算。
两相输出的增量型旋转编码器。这种编码器输出A、B两相脉冲,这两组脉冲不仅能够表示转速,还能表示方向,如图所示,A相和B相脉冲数均表示转数,但当A相信号相位超前时,表示正转;B相信号相位超前时,表示反转:

编码器输出的两相脉冲需要靠单片机进行解码才能读取转速信息,FTM模块就提供了正交解码这种工作模式。通过这种模式,它可以将输入的A、B两相脉冲解码后得到计数值,进而我们就可以获得转速信息进行闭环控制。

正交解码模式下可以通过 寄存器进行相关功能的配置。在该模式下有计数/方向编码模式和 AB相编码模式。
计数/方向编码模式:B相输入值用于指示计数方向,A相输入用于计数,FTM计数器在A相输入的每个上升沿进行计数,累加或递减由B相电平决定。
AB相编码模式:计数方向由AB相之间的关系决定,计数频率由A相B相输入信号决定。当A相或B相的信号出现跳变,即可触发FTM计数器改变。
6.人机交互界面: 按键中断、OLED显示屏、MCU模拟SPI驱动显示。

7.电机驱动模块: HIP4082+LR7843 4MOS管H桥电机驱动电路、MCU FTM产生PWM波。

8、AI机器学习: 方向控制采用训练好的模型进行控制(2020)
硬件部分:
伺服电机为S3010舵机,6V电压时扭力可达6.5kg·cm,动作速度快

电源部分:
由于电路中的不同电路模块所需要的工作电压和电流容量各不相同,因此电源模块应该包含多个稳压电路,将充电电池电压转换成各个模块所需要的电压。
为满足需要,本车模上存在4种供电电压:
(1) 智能车使用锂电池供电,选择带均衡功能的保护板可以同时给两节电池充电,正常使用时电压在7.4~8.4V。可直接用于电机供电。
(2) 使用稳压芯片tps76850 输出电压5V,用于rt1064、隔离芯片、运放、霍尔元件、编码器等供电。
(3) 使用稳压芯片tps76833 输出电压3.3V,用于OLED、蜂鸣器、按键、等供电。
(4) 使用升压芯片bo512输出电压12V,用于全桥驱动器HIP4082的供电。
(5) 使用开关稳压芯片AS1015输出5.95V电压给舵机供电,用电池直接供电容易烧毁舵机,AS1015具有防止电流反灌功能有效提高舵机使用寿命。

电机驱动电路:
ir7843光耦隔离、数字芯片隔离

我主要负责的工作是数据的采集,采集数据分为三个,第一:跑的稳定的最快速度
比赛规模:
全国大学生A类竞赛,举办了15年,每年大约1万人参赛,2000多个队伍

电磁运放电路:
采用简单的同向比例放大电路,电位器可用来调节放大倍数,通过对电磁信号进行放大和检波处理和可以直接供单片机的AD口读取。运放芯片使用性价比较高的OPA4377来以满足20kHz的电感采集需求。

调试能力的说明:
项目在调试的过程,用的是串口调试助手,keil自带的调试、蓝牙、OLED屏等等,通过设置标志位、单片机发送出来的数据来进行项目调试。硬件部分则是通过仿真、示波器、万用表来进行调试。
调试通常是分模块来进行,同时使用一些变量模拟,当功能都调通以后,再接入模块来做硬件相关的效果测试。
在调试PID参数时,通常使用虚拟示波器,将电机的输出参数打印到电脑。
项目初期,代码写的比较乱,因为模块比较多,控制的硬件也多,导致项目的代码结构很差,容易出问题,后来对项目进行模块化的封装。

结尾
通过这个项目,我的收获是软件代码如何对硬件完成控制,几个电路的设计,对单片机的IO口,串口,定时器等基本开发很熟悉了,同时对项目的代码调试能力得到强化,整个代码量达到1000多行,代码结构很清晰,C语言编程能力得到很大的提升。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服