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

一、项目简述

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)

二、技术点详解

(1)软件部分

1、主控芯片
项目的硬件核心处理器NXP MK60DN512ZVLQ10 MCU(2019)、NXP i.MX RT1064 MCU(2020)

参数K60DN512补充i.MX RT1064补充
主频100MHZ600MHZ
内核ARM-Cortex-M4ARM-Cortex-M7
SRAM128k1M外置32M
Flash512k4M
UART6个8个
SPI3个2个
I2C2个4个
I2S1个3个
CAN2个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.PID控制算法:
P比例环节:及时成比例地反映控制系统的偏差信号,偏差一旦产生,控制器立即产生控制作用,以减少偏差。

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

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

在计算机控制系统中,数字 PID 控制算法通常又分为位置式 PID 和增量式 PID。
小车方向控制采用位置式PD控制,速度控制采用双反馈增量式PID控制。
输出量 =P误差+I误差的积分+D*误差的变化
在这里插入图片描述
在这里插入图片描述
2.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 而言要更智能一些

2.2电机控制算法
增量式PID
当执行机构需要的是控制量的增量(例如:驱动步进电机)时,增量的PID控制算式:
在这里插入图片描述
最后选用的采样周期为 20ms,即每 20ms 对电机
进行一次 PID 调节。

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

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

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

5.路径识别模块: LC并联谐振选频放大检波电路、MCU ADC转换、HC-SR04超声波测距。
在这里插入图片描述

6.测速模块: 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计数器改变。
7.人机交互界面: 按键中断、OLED显示屏、MCU模拟SPI驱动显示。

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

9、AI机器学习: 方向控制采用训练好的模型进行控制(2020)

(2)、硬件部分

1、伺服电机(舵机):
为S3010舵机,6V电压时扭力可达6.5kg·cm,动作速度快

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

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

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

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

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

  • 11
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值