打印
[应用相关]

基于STM32的二轮自平衡小车

[复制链接]
1128|95
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言

近年来,移动机器人是目前科学领域比较活跃的领域之一,其应用范围越来越广泛,面临的环境也越来越复杂,这就要求机器人能够适应一些复杂的环境和任务。二轮自平衡机器人正是在这一背景下提出来的,对于制作此种类型的自平衡小车无疑对我stm32的学习有莫大的好处,一方面深入了解stm32以及学习串级PID的运用,另一方面也是对我近期学习的硬件方面知识一个检验。

本人为32小白水平有限,同时也是第一篇博客,如果有地方描述不清晰不正确,欢迎大佬指出一起讨论

使用特权

评论回复
评论
初级工程渣 2022-6-30 19:07 回复TA
本文链接:https://blog.csdn.net/weixin_52122764/article/details/115146092 
沙发
初级工程渣|  楼主 | 2022-6-30 19:07 | 只看该作者
系统框图

使用特权

评论回复
板凳
初级工程渣|  楼主 | 2022-6-30 19:09 | 只看该作者
获取小车的速度和角度是实现小车自平衡的前提,数据在stm32的中断控制中配合PID算法使用,输出数值给PWM寄存器控制相应电机,从而实现平衡。遥控部分是控制转向,根据移动终端向蓝牙发送数据从而实现相应的运动。

我们可以将平衡小车的运动方式类比为手指上放置一根筷子,保持其直立状态,根据生活经验可知,当筷子向某个方向倒下时,我们眼睛观察到筷子倒下反馈给大脑,大脑控制手迅速向筷子倒下的方向运动,使其始终保持原有直立状态。同样,平衡小车道理相同,当传感器检测到小车有倒下的趋势时,控制轮子向相同方向运动,不同角度会输出不同速度即可保持平衡。

使用特权

评论回复
地板
初级工程渣|  楼主 | 2022-6-30 19:09 | 只看该作者
运动分析

平衡小车的控制可以分为直立控制,速度控制以及转向控制,即直立环、速度环和转向环,使小车能够保持平衡状态的是速度环以及直立环,通过传感器读取角度输出不同的PWM即不同的速度使其保持平衡。其中单独的直立环可以使小车保持直立,但如果受到外力的影响,那么不用多想,小车一定会倒下,将直立环和速度环串起来,那么当小车受到外力时,也能迅速平衡。

使用特权

评论回复
5
初级工程渣|  楼主 | 2022-6-30 19:10 | 只看该作者
运动控制

小车的直立控制是通过负反馈控制的


使用特权

评论回复
6
初级工程渣|  楼主 | 2022-6-30 19:11 | 只看该作者
高中时期大家对正反馈和负反馈都有所了解,这里不过多解释。直立控制实际上就是将小车控制在一定角度内,这个角度由小车的机械零点有关(你搭建的小车重心),对于机械零点的确定会在调试中说明,上文提到如果只有直立环不足以小车完全保持平衡,所以我们还需要加入速度环。

使用特权

评论回复
7
初级工程渣|  楼主 | 2022-6-30 19:12 | 只看该作者
小车的速度控制是通过正反馈控制的

使用特权

评论回复
8
初级工程渣|  楼主 | 2022-6-30 19:12 | 只看该作者
我们可以假设此时小车处于直立状态,如果小车想向前运动,那么小车必然要向前倾斜获取向前的加速度,但是向前倾斜轮子必然要向后转动,那么小车的速度会下降(轮子向后转动了)假如为负反馈那么小车必然会增加倾角,一直循环下去这样则会加速小车的倒下,所以在速度控制中反馈系统应该是正反馈。

使用特权

评论回复
9
初级工程渣|  楼主 | 2022-6-30 19:13 | 只看该作者
转向控制




​所谓转向环即当小车已经能保证基本的平衡时,通过蓝牙控制使小车改变方向的控制系统

使用特权

评论回复
10
初级工程渣|  楼主 | 2022-6-30 19:14 | 只看该作者
​所谓转向环即当小车已经能保证基本的平衡时,通过蓝牙控制使小车改变方向的控制系统

使用特权

评论回复
11
初级工程渣|  楼主 | 2022-6-30 19:15 | 只看该作者
    定时器PWM输出以及编码器模式

PWM输出

    脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

使用特权

评论回复
12
初级工程渣|  楼主 | 2022-6-30 19:34 | 只看该作者
当小车在运行过程中随着倾角的改变小车的速度也应该发生变化,如果只是单纯给予高低电平,只能以额定速度运动,显然不能达到我们想达到的程度,所以我们需要定时器输出PWM波,我们选用的主控模块只有4个定时器(1个高级3个通用)一个定时器有4个通道控制小车显然是足够的。当然如果你选择其他系列芯片会有多个定时器,选择也会更多

使用特权

评论回复
13
初级工程渣|  楼主 | 2022-6-30 19:37 | 只看该作者
(注意基本定时器无法输出PWM脉冲)

其中如果用到高级定时器TIM1以及TIM8注意除了基础的配置还需要使能刹车和死区寄存器,以使能整个PWM输出,还需要使能高级定时器特有的寄存器。

TIM_CtrlPWMOutputs(TIM1,ENABLE); //高级定时器特有

使用特权

评论回复
14
初级工程渣|  楼主 | 2022-6-30 19:38 | 只看该作者
编码器模式

上文系统框图可以看出,速度系统需要一个速度反馈,其他系统的反馈可以通过6050读取,那么此时小车的速度如何读取呢?这里就需要编码器读取此时的速度。编码器会引出AB相,通过STM32的编码器模式以特定的GPIO口连接编码器AB相,读取脉冲,从而读取速度。

使用特权

评论回复
15
初级工程渣|  楼主 | 2022-6-30 19:40 | 只看该作者

使用特权

评论回复
16
初级工程渣|  楼主 | 2022-6-30 19:41 | 只看该作者
通过查阅参考手册不难得知只有高级定时器以及通用定时器具有检测编码器的功能,基本定时器并不具备这种功能。所以我们可以配置定时器来读取编码器数据。

这里需要注意的是:编码器模式只有定时器的通道一和通道二可以使用,即只有TIMx_CH1 TIMx_CH2 可以使用

千万注意这一点,如果自己打板的话没注意这一点就可以重新打板了 /(ㄒoㄒ)/

使用特权

评论回复
17
初级工程渣|  楼主 | 2022-6-30 19:42 | 只看该作者
参考手册如下:

使用特权

评论回复
18
初级工程渣|  楼主 | 2022-6-30 19:43 | 只看该作者
选择编码器接口模式的方法是:如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则置SMS=011。

通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性;如果需要,还可以对输入滤波器编程。

使用特权

评论回复
19
初级工程渣|  楼主 | 2022-6-30 21:00 | 只看该作者
两个输入TI1和TI2被用来作为增量编码器的接口。参看下表:

使用特权

评论回复
20
初级工程渣|  楼主 | 2022-6-30 21:01 | 只看该作者

使用特权

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

本版积分规则

68

主题

676

帖子

0

粉丝