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语言编程能力得到很大的提升。