打印
[其他ST产品]

STM32爬坡寻迹小车(PID算法)

[复制链接]
2402|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
由于该题我们没有去参加比赛,只是做着好玩,所以就没有按照竞赛题目的要求用msp430作为主控芯片,而是用了一块stm32最小系统板,题目相信大家都清楚了,下面是设计步骤:

一、简要分析
1、小车需要沿着黑虚线行驶,那么必须要有寻迹功能,并且行驶一定距离后还需要转向,那么最好使用三个红外模块可以更加准确的检测黑线。

2、小车需要爬不同角度的坡,那必然就不可能固定它的速度(这里的速度实质上是指他的占空比,因为在我的设计中速度其实是固定的,说速度是为了便于理解),因为如果固定的速度偏小,那么过高的坡它爬不上去,如果固定的速度过大,那么过低的坡它行驶的太快的话可能会不便于红外模块的接收。

3、正是由于第二点的要求所以需要引入了PID来调速,PID的作用就是为了使小车能够在爬不同角度的坡时能够大概的保持速度不变,不会因为坡度的提升而使速度降低,这里说速度大概保持不变是因为该题对小车行驶速度的变化要求不高,所以对PID参数的调节并不需要特别准确。

4、最后就是当三个红外模块全部检测到黑线时小车立即停止,蜂鸣器响。

使用特权

评论回复
评论
尽快回复过 2023-2-28 17:25 回复TA
———————————————— 版权声明:本文为CSDN博主「清栀007」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_53336580/article/details/123905523 
沙发
尽快回复过|  楼主 | 2023-2-28 17:25 | 只看该作者
设计思路
1、红外模块:使用PB12(左)、PB13(中)、PB14(右)三个GPIO口作为红外的输入检测;只有在需要转向的时候右边的红外模块才会检测到黑线,当它需要转向了,输出的低电平就会反馈到stm32中,再通过调节输出pwm的那几个GPIO口的占空比来控制四个电机的转速,从而实现转向的功能。并且当三个红外全部检测到黑线,即全部输出高电平时,使四个电机反转,注意这个反转的时间很小,占空比也很小,过了这段时间后马上将占空比调节为0。

使用特权

评论回复
板凳
尽快回复过|  楼主 | 2023-2-28 17:26 | 只看该作者
2、由于stm32最小系统板只有三个通用定时器(TIM2、TIM3、TIM4)和一个高级定时器(TIM1),而我们总共需要用到四个定时器,那么我直接将TIM1的四个通道作为PWM输出控制四个电机,需要注意的是使用高级定时器输出PWM时需加上TIM_CtrlPWMOutputs这个函数;

使用特权

评论回复
地板
尽快回复过|  楼主 | 2023-2-28 17:26 | 只看该作者
3、TIM2和TIM3配置为编码器模式,TIM2的通道1和通道2作为小车左后轮编码器A、B相,A、B相接PA0、PA1;将TIM3的通道1和通道2作为小车右后轮编码器A、B相,A、B相接PA6、PA7;

使用特权

评论回复
5
尽快回复过|  楼主 | 2023-2-28 17:26 | 只看该作者
4、使用TIM4中断来读取TIM2、TIM3计数器(cnt)的值,设置TIM4每隔5ms溢出一次,每向上计数四次cnt的值加1,并且在中断函数中读取完cnt的值后就清零,那么每次进入TIM4溢出中断时,cnt的值都不会太大,我们便可以直接将cnt的值作为小车的当前速度。

使用特权

评论回复
6
尽快回复过|  楼主 | 2023-2-28 17:26 | 只看该作者
5、随着角度的提升,小车的速度会越来越慢,以至于后面会爬不上去,但是如果初始占空比给大了,速度又太快,可能导致红外模块刚检测到黑线还没反应过来,小车就已经冲过去了,那还怎么玩是吧。但是有了PID控速的话,只要给了他一个初始速度,他就能自己通过调节占空比来大概的保持这个速度,当编码器测得的实际速度过小时,通过PID算法(增量式用于测速较好),将得到的一个占空比更大的PWM波返回,达到增加速度的目的。、

使用特权

评论回复
7
尽快回复过|  楼主 | 2023-2-28 17:26 | 只看该作者
6、使用TB6612作为电机的驱动模块,使用LM2596S降压模块稳出5V电压给各模块供电。

使用特权

评论回复
8
尽快回复过|  楼主 | 2023-2-28 17:26 | 只看该作者
硬件电路:

使用特权

评论回复
9
尽快回复过|  楼主 | 2023-2-28 17:27 | 只看该作者
电机驱动的选择
我们采用的是TB6612FNG电机驱动模块。TB6612FNG的主要引脚功能:
(1)AINl/AIN2、BIN1/BIN2、PWMA/PWMB为控制信号输入端;
(2)AO1/A02、B01/B02为2路电机控制输出端;
(3)STBY为正常工作/待机状态控制引脚;
(4)VM(3~13.5 V)和VCC(2.7~5.5 V)分别为电机驱动电压输入和逻辑电平输入端。

使用特权

评论回复
10
尽快回复过|  楼主 | 2023-2-28 17:27 | 只看该作者

使用特权

评论回复
11
尽快回复过|  楼主 | 2023-2-28 17:27 | 只看该作者

使用特权

评论回复
12
尽快回复过|  楼主 | 2023-2-28 17:27 | 只看该作者
红外模块的选择

该红外循迹模块用于小车行驶过程中检测前方道路两端的黑线,并将相应的信息发送到STM32单片机。单片机实时接收,当左红外探测到黑线,则表明左轮即将压线,需要向左调整方向;当右红外探测到黑线,则表明右轮即将压线,需要向右调整方向。根据不断接收来自红外模块发送的信息,即可实时调整方向,从而保证小车不偏离轨道,能够按照规定的路线行驶。

使用特权

评论回复
13
尽快回复过|  楼主 | 2023-2-28 17:27 | 只看该作者
编码器电机的选择

该霍尔编码器工作电压为5V,编码器线数为260线,车轮转一圈,电机输出260个脉冲,倍频后为1040,精度为0.35,可较为准确的获取该小车的实际速度,为小车的精准控速提供基本的硬件支持。

由于stm32最小系统板内部资源及硬件的限制,我们只使用两个后轮的编码器来采集速度, 并且值得注意的是,编码器有个转速上限,超过这个上限是不能正常工作的,这个是硬件的限制,原则上线数越多转速就越低,我们买的是260线的,经过软件四倍频就是1024,也就是小车转一圈cnt的值为1024。

使用特权

评论回复
14
尽快回复过|  楼主 | 2023-2-28 17:28 | 只看该作者
接线方法:

电机线:接电机驱动的输出口1
编码器电源:接5V(3.3V也可)
编码器输出A相:接单片机
编码器输出B相:接单片机
编码器地线:接地
电机线+:接电机驱动的输出口2

使用特权

评论回复
15
尽快回复过|  楼主 | 2023-2-28 17:28 | 只看该作者
4、降压模块的选择

采用LM2596S稳出5V电压。LM2596是非同步降压型电源管理单片集成电路的开关电压调节器,能够输出3A的驱动电流,同时具有很好的线性和负载调节特性。LM2596内部包含150KHZ振荡器、1.23v基准稳压电路、热关断电路、电流限制电路、放大器、比较器和内部稳压电路等。可调范围1.23~37V。

使用特权

评论回复
16
尽快回复过|  楼主 | 2023-2-28 17:28 | 只看该作者
5、车轮及车胎的选择
我认为,这个题目中,车轮及车胎的选择至关重要,一定要选择摩擦力足够大的车胎,毕竟想要获得高分,你的车就必须要能爬上30度的坡。

使用特权

评论回复
17
尽快回复过|  楼主 | 2023-2-28 17:28 | 只看该作者
三、TIM配置步骤
1 TIM1(高级定时器):

功能:TIM1的四个通道(CH1-CH4)分别用于对小车四个电机的PWM输出,通过调节占空比,改变电机的转速,从而对小车进行调速。

使用特权

评论回复
18
尽快回复过|  楼主 | 2023-2-28 17:28 | 只看该作者
配置步骤:

使能定时器及端口时钟,设置对应引脚复用映射;
初始化定时器参数,包含自动重装值,分频系数,计数方式等;
初始化通道输出比较参数,包含PWM模式,输出极性,使能等;
修改TIMX_CCRX的值,控制占空比(一般在main函数中实时修改);
使能TIMX在CCRX上的预装载寄存器;
使能TIMX在ARR上的预装载寄存器允许位;
开启定时器。

使用特权

评论回复
19
尽快回复过|  楼主 | 2023-2-28 17:28 | 只看该作者
定时器基本结构体中,将预分频值设置为720,即将系统时钟72MKZ分频为 72M / 720 = 100KHZ ,为TB6612电机驱动PWM输出的最大频率;重装载值设置为20000,使可调节占空比的数据范围更大,更适合于PID算法的转换;计数方式为向上计数。

使用特权

评论回复
20
尽快回复过|  楼主 | 2023-2-28 17:28 | 只看该作者
通道输出比较结构体中,将PWM模式设置为PWM1,输出极性设置为输出高电平(将模式设置为PWM2,极性设置为低电平效果一致)。

另由于TIM1是高级定时器,配置过程中需要将相应的结构体成员全部配置,配置参数与上类似。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

443

帖子

0

粉丝