HAL库版STM32双轮自平衡车(一) ———代码思路和PID基础精讲
系列文章第一篇将重点讲解一下怎么编写平衡小车代码的思路以及一些基础的PID知识点,超详细
系列文章目录
HAL库版STM32双轮自平衡车(一) ———代码思路和PID的简单介绍(本篇)
HAL库版STM32双轮自平衡车(二) ——— CubeMX的配置、原理图接线、物料准备
HAL库版STM32双轮自平衡车(四) ———— 原理图以及PCB绘制
目录
前言
趁着暑假时间充裕,我也是完成了平衡小车的制作,现在实现的功能仅限于小车自平衡保持直立以及外界干扰(如:手用力推小车)时小车能够以很快的响应速度恢复平衡直立。接下来会写关于制作HAL库版平衡小车的系列文章。系列文章的链接放在了文章开头的系列文章目录里。
这篇文章也就是HAL库版STM32平衡小车的第一篇将重点讲解一下怎么编写平衡小车代码的思路以及一些基础的PID知识点,跟着我的思路相信你一定能在自己的脑海里面形成一个完整的框架,话不多说我们开始吧。
一、代码整体框架
二、P , I , D 这三个控制器的作用和缺点
p控制器(比例)
作用是:减小测量值和期望值之间的误差,让测量值不断接近期望值。
缺点是:存在稳态误差(静差)。若存在固定扰动时,P控制律不能迅速响应。
I控制器(积分)
作用是:消除静差,所谓静差,就是系统稳定后输出值和设定值之间的差值,积分环节实际上就是偏差累计的过程,把累计的误差加到原有系统上以抵消系统造成的静差。
缺点是:控制不及时。因为积分输出的累积是渐进的,其产生的控制作用总是落后于偏差的变化,不能及时有效地克服干扰的影响,难以使控制系统稳定下来。
D控制器(微分)
作用是:反应了偏差信号的变化规律,或者说是变化趋势,根据偏差信号的变化趋势来进行超前调节,从而增加了系统的快速性。
缺点是:放大噪声。
三、所用PID精讲
通过上述的代码框架,可以知道我的这个平衡小车用的是位置式并联型PID控制
- 什么是位置式PID?
式中输出的u(k)可直接用来控制 系统需要控制的对象,u(k)的值和控制对象是一一对应的,因此通常称该公式为位置式PID控制算法。位置式PID缺点是每次输出均与过去的状态有关,计算时要对e(k)进行累加,计算繁琐,保存e(i)占用很多内存,控制不方便。增量式PID和位置式PID没有本质区别,就是数字PID的两种不同表示形式而已,在不同的系统中,根据题的具体内容选择适合的方法,位置式需要历次的偏差信号,而增量式只需一个增量信号即可。增量式误动作小,易于实现手动/自动的无扰动切换,不产生积分失控。但是缺点在于积分截断效应大,溢出影响大。
下面也给出增量式PID的数学公式:
- 什么是并联型PID?
并联型PID实现了比例项,积分项和微分项的完全解耦,调节其中的Kp,Ki 与 Kd即可独立的作用在比例,积分和微分项上;而标准形式的Kp将同时影响比例,积分和微分三项行为。串联型类似
- 为什么采用位置式并联型PID?
虽然位置式计算较为繁琐,但是在位置式直立环的微分项中,角度的微分可以直接采用mpu6050采集到的y轴角速度值,比较容易理解。
采用并联型PID是因为可以让直立环和角度环独立开来,易于理解,调参也比较容易。当然如果采用串联型,那么就要将直立环设置为内环,速度环设置为外环,并且速度环的输出就要作为直立环期望角度的输入,因为重点在于保持直立状态。
- 为什么直立环用 PD 而不用 PI 呢?
当角度接近机械零度时,P控制器就不工作了,控制器认为完成了任务,然而控制器忽略了角度在机械零度时电机还存在角速度,简单来说就是小车还有惯性。这时候就需要加入D控制器,预测下一时刻的偏差,进行超前调节,从而增加了系统的快速性。反过来想就是这个PID控制器中为什么不用积分。这里必须知道的一点是当比例系数很大的时候系统几乎没有静差。平衡小车直立控制需要快速性,相比之下P是很大的,积分的作用是消除静差,而静差对于直立控制的影响很小自然就不需要积分了。实际上平衡小车不一定要完全处于机械中值,稍微偏一点点也没有关系,只要稳定就行了。再有一点,小车需要尽可能快的达到直立平衡,I控制存在着控制不及时的缺点。
所以对于准确性要求不高的系统可以不加入积分控制。
- 平衡小车直立有了直立环为什么还需要速度环?
小车光有直立环也是可以直立一小会儿的,但是一但外界有干扰(比如用手推了小车),小车只能通过单方向运动维持平衡,加入速度环就是修正小车的角度,小车一直往前面开时,速度环让小车以更快速度行驶使得小车后仰,这时直立控制让小车后退以维持平衡。
- 还是老问题,为什么速度环用 PI 而不用 PD 呢?
对于速度控制当然是越精确越好,平衡小车当然希望速度一直为0。但是光有P控制器是不够的,因为P控制器的主要缺点是存在静差。那么就需要用I积分控制器来消除静差。
虽然D控制器可以预测未来,提前响应,但是微分控制的缺点是放大噪声。速度控制的速度偏差是由直立控制电机运动引起的,即速度噪声很大,所以不加入微分控制。
所以对于准确性要求高,系统噪声大时可以采用PI控制。
四、编写代码前的整体思路
我认为这是关于制作HAL库版平衡小车的重中之重,在编写代码前应该在脑海里面有一个大体的思路至关重要,这一步的完成度关系着之后编写代码的效率和质量。
下面就来开始吧,一步步进行。
- 首先要驱动轮子转吧,那就一定需要PWM。这一步就需要设置一个定时器(TIM2)的两个通道为PWM模式
- 轮子的正反转还要控制电机驱动板的AIN,BIN。这一步需要设置4个IO口为输出模式
- 速度环肯定需要得到两个轮子的转速。这一步就需要开启两个定时器(TIM3,TIM4)的编码器模式
- 直立环需要俯仰角以及y轴加速度。这一步需要开启I2C1为I2C模式
- OLED显示。这一步需要开启I2C2为I2C模式
- PID控制需要维持高度的周期性,用MPU6050自带的中断引脚INT发出的信号作为定时信息。这一步需要将一个IO口设置为外部中断引脚。
之后在CubeMX中的配置就可以按上述步骤一步步来。
五、小结
这篇文章就叙述完了,下一篇文章重点讲解CubeMX的配置、原理图接线、物料准备,以及在配置时遇到的“大坑”,CubeMX的配置思路也是与本篇文章所讲息息相关。
码字不易,希望喜欢的小伙伴别忘了点赞+收藏+关注,你们的肯定就是我创作的动力
欢迎大家积极交流,本文未经允许谢绝转载!!!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)