☰
STM32平衡小车实战:JGB-520编码电机与TB6612驱动及PID调参指南
2026/9/28 1:09:45 网站建设 项目流程

1. 从一堆散件到能站住的平衡小车,先搞清楚这套硬件到底在干什么

平衡小车这个项目,很多人第一次做的时候会觉得最难的是PID算法,但实际焊完板子、烧完程序之后才发现,真正让人抓狂的往往是电机不转、编码器读数乱跳、TB6612莫名其妙发烫这些硬件层面的问题。我前后做过五六台不同方案的平衡小车,从最开始的L298N到后来的TB6612,从直流减速电机到带霍尔编码器的JGB-520,踩过的坑基本覆盖了从选型到调参的完整链路。这篇文章就把这些经验完整地梳理一遍,重点放在JGB-520编码电机和TB6612驱动模块的配合使用上,同时把PID调参的实操细节讲透。

先明确这套硬件的分工。STM32是整个系统的大脑,负责读取传感器数据、执行PID运算、输出PWM控制信号。JGB-520是执行机构,它本质上是一个带减速箱的直流电机,尾部集成了霍尔编码器,可以输出脉冲信号反馈转速和方向。TB6612是功率驱动模块,它接收STM32输出的PWM信号和方向信号,把它们转换成能够驱动电机的大电流输出。三者之间的关系可以用一个简单的类比来理解:STM32是驾驶员,TB6612是油门和方向盘,JGB-520是车轮和速度表。驾驶员根据速度表的读数来决定踩多少油门、往哪个方向打方向盘。

这套方案之所以在平衡小车项目里特别常见,核心原因有三个。第一,JGB-520的编码器分辨率适中,减速比通常在1:30到1:48之间,配合13线或11线霍尔编码器,四倍频之后每转可以产生几百到上千个脉冲,对于平衡小车这种需要实时速度反馈的场景来说精度足够。第二,TB6612的驱动能力刚好匹配JGB-520的工作电流,持续1.2A、峰值3.2A的输出能力可以轻松带动这款电机,而且它的待机功耗极低,适合电池供电的场景。第三,STM32的定时器资源丰富,可以同时输出多路PWM并捕获编码器脉冲,硬件上不需要额外的扩展芯片。

但这里有一个很多人一开始不会注意到的问题:JGB-520的编码器输出是霍尔式的,输出信号是方波,而STM32的编码器接口模式对信号的边沿质量有要求。如果电机引线太长或者没有做滤波处理,方波上会出现振铃和毛刺,导致编码器计数出现误触发。我在第一台车上就遇到过这个问题,电机一转编码器读数就疯狂跳动,后来在编码器A/B相线上各加了一个100nF的电容到地,问题才解决。这个细节在后面讲硬件连接的时候会详细展开。

2. JGB-520编码电机和TB6612的接线细节,比你想的更容易出错

2.1 JGB-520的六根线到底怎么接

JGB-520电机尾部一共引出六根线,标准配色是:红色和白色是电机电源线,直接接TB6612的AO1/AO2或者BO1/BO2输出端;黑色和绿色是编码器的电源和地,通常黑色接GND、绿色接VCC(一般是3.3V或5V,具体看编码器规格);黄色和蓝色是编码器的A相和B相信号输出,接到STM32的定时器编码器接口引脚上。

这里有几个容易踩的坑。第一个坑是电机电源线的极性。红白两根线接反了电机会反转,但这个问题在调试阶段很容易发现,不算大坑。真正麻烦的是编码器的电源电压。有些批次的JGB-520编码器供电范围是3.3V到5V,有些只支持5V。如果你直接接3.3V,编码器可能输出信号幅度不够,STM32识别不到。我的建议是先用万用表量一下编码器输出信号的高电平幅度,如果在3.3V以上就可以直接接STM32的IO口,如果只有2V左右就需要加电平转换或者改用5V供电再分压。

第二个坑是A相和B相的接线顺序。A/B相接反了不会导致编码器不工作,但会导致计数方向相反。这个问题在调试的时候表现为:你让电机正转,但速度反馈是负值。解决方法是把A/B两根线对调,或者在软件里把计数方向取反。我个人的习惯是在硬件上就把线序调对,这样软件层面不需要做额外的处理,代码更干净。

第三个坑是编码器电源和电机电源的隔离。JGB-520的电机和编码器虽然封装在一起,但它们的电源是独立的。电机电源来自TB6612的VM端,编码器电源来自STM32的3.3V或5V。如果共地处理不好,电机的换向噪声会通过地线串到编码器电源上,导致编码器输出误脉冲。正确的做法是在TB6612的电源输入端和编码器电源输入端各加一个100uF的电解电容和一个100nF的陶瓷电容,并且在PCB布局上让电机电源线和编码器信号线尽量远离。

2.2 TB6612的引脚功能与STM32的对应关系

TB6612模块通常有16个引脚,但实际用到的核心引脚只有几个。VM接电机电源,VCC接逻辑电源(3.3V或5V),GND共地。STBY是待机控制引脚,接高电平模块才工作,我一般直接接STM32的一个GPIO,方便在紧急情况下快速切断电机输出。AIN1和AIN2是A通道的方向控制引脚,BIN1和BIN2是B通道的方向控制引脚。PWMA和PWMB是A/B通道的PWM输入引脚,接STM32定时器的PWM输出通道。AO1/AO2和BO1/BO2是电机输出端,分别接两个JGB-520的电机线。

TB6612的真值表很关键,很多人不看手册直接接线,结果电机不转或者只会一个方向转。简单来说:AIN1和AIN2不能同时为高电平,否则电机制动;AIN1高AIN2低时电机正转,AIN1低AIN2高时电机反转;AIN1和AIN2都为低时电机停止(滑行)。PWMA输入PWM信号,占空比决定转速。这里有一个细节:TB6612的PWM频率建议在10kHz到100kHz之间,太低会有可闻噪声,太高会导致开关损耗增加。我一般用20kHz,刚好在音频范围之上,电机运行很安静。

STM32这边,我通常用TIM1或TIM8的高级定时器来输出PWM,因为这两个定时器支持互补输出和死区控制,虽然TB6612不需要互补输出,但高级定时器的PWM分辨率更高。编码器接口用TIM2、TIM3、TIM4、TIM5这几个通用定时器,它们都支持编码器模式。具体引脚分配要看你的STM32型号,以STM32F103C8T6为例,TIM1的CH1和CH2可以输出PWM,TIM2的CH1和CH2可以接编码器A/B相,TIM3的CH1和CH2接另一个编码器。

2.3 电源方案的选择与噪声抑制

平衡小车的电源方案直接影响系统的稳定性。我推荐用2节18650锂电池串联,标称电压7.4V,充满8.4V。这个电压可以直接接TB6612的VM端,同时通过一个降压模块降到5V给STM32和编码器供电。注意不要用9V碳性电池,它的内阻大,电机启动瞬间电压会被拉低,导致STM32复位。

噪声抑制是电源方案里最容易被忽视的部分。电机换向时会产生大量的高频噪声,这些噪声会通过电源线和地线传播。我在实际项目中总结了一个有效的滤波方案:在TB6612的VM和GND之间并联一个470uF的电解电容和一个100nF的陶瓷电容,在STM32的5V输入端加一个LC滤波(10uH电感加100uF电容),编码器的电源引脚上再加一个100nF的陶瓷电容。这套组合下来,电机运行时示波器上看电源纹波可以控制在50mV以内。

3. STM32的编码器接口配置与PWM输出,CubeMX里几个关键选项别选错

3.1 编码器模式的配置逻辑

STM32的定时器编码器模式是一个硬件级的正交解码器,它可以自动根据A/B相的边沿关系进行加减计数,不需要CPU干预。配置的时候有几个关键参数需要理解。首先是编码器模式的选择,CubeMX里提供了TI1、TI2和TI1&TI2三种模式。TI1模式只对A相的边沿计数,TI2模式只对B相的边沿计数,TI1&TI2模式对A/B两相的所有边沿都计数,也就是四倍频。对于平衡小车来说,我推荐用TI1&TI2模式,因为四倍频可以提高分辨率,让低速时的速度反馈更平滑。

计数器周期设置为65535(16位最大值),这样正转时计数器递增,反转时递减,溢出后自动回绕。读取速度的时候,我通常用定时器中断每隔固定时间(比如10ms)读取一次计数器的值,然后计算差值得到速度。这里有一个细节:读取计数器后需要把计数器清零,否则下一次读取的差值会累积。但清零操作要在读取之后立即执行,避免在清零和读取之间丢失脉冲。

编码器的计数方向可以通过交换A/B相的接线来改变,也可以在软件里对读数取反。我倾向于在硬件上就把方向调对,因为软件取反会增加代码的复杂度,而且容易在调试的时候搞混。判断方向是否正确的方法很简单:用手正向转动电机轴,观察计数器的值是递增还是递减,如果递减就把A/B相线对调。

3.2 PWM输出的频率与分辨率权衡

PWM频率和分辨率是一对矛盾。STM32的定时器在给定时钟频率下,PWM频率越高,分辨率越低。以STM32F103的72MHz主频为例,如果定时器预分频设为0,自动重装载值设为3599,那么PWM频率就是72MHz/3600=20kHz,分辨率是3600级。这个分辨率对于电机控制来说足够了,因为电机本身的响应速度远低于这个精度。

但如果你把PWM频率提高到100kHz,分辨率就降到720级,低速时的控制精度会下降。我实测下来,20kHz是一个比较好的平衡点,既避开了音频噪声,又保证了足够的分辨率。如果你对噪声特别敏感,可以用25kHz或30kHz,分辨率仍然在2000级以上。

还有一个容易忽略的点是PWM的初始状态。在电机使能之前,PWM输出应该是0占空比,否则上电瞬间电机会突然转动。我在代码里会在初始化完成后先把PWM占空比设为0,再拉高STBY引脚使能TB6612,这样上电时电机不会动。

3.3 定时器中断的优先级安排

平衡小车系统里通常有多个中断:编码器定时器中断、MPU6050数据就绪中断、PID控制定时器中断、串口中断等。这些中断的优先级安排直接影响系统的实时性。我的经验是把PID控制定时器中断设为最高优先级,因为PID运算的周期必须严格固定,否则积分项和微分项的计算会出错。编码器读取中断设为次高优先级,MPU6050中断设为中等优先级,串口中断设为最低优先级。

PID控制周期我一般设为5ms,也就是200Hz的控制频率。这个频率对于平衡小车来说足够了,因为小车的机械响应时间通常在几十毫秒级别。控制周期太短会导致CPU负载过高,太长会导致响应迟钝。5ms是一个经过验证的平衡点。

4. PID调参不是玄学,但确实需要一套系统的方法

4.1 先搞清楚位置式PID和增量式PID在这个项目里的分工

平衡小车通常需要三个PID环:直立环、速度环和转向环。直立环控制小车的倾角,让小车保持直立;速度环控制小车的行驶速度,让小车按照设定的速度前进或后退;转向环控制小车的转向,让小车按照设定的方向行驶。这三个环里,直立环和转向环通常用位置式PID,速度环通常用增量式PID。

位置式PID的输出直接对应控制量的绝对值,适合直立环这种需要精确控制角度的场景。增量式PID的输出是控制量的增量,适合速度环这种需要平滑调节的场景。很多人一开始不理解为什么速度环要用增量式,其实原因很简单:增量式PID的输出是累加的,即使反馈值有轻微波动,输出也不会突变,电机的转速变化更平滑。而位置式PID在速度环里使用时,反馈值的微小波动会导致输出大幅变化,电机转速会抖动。

直立环的输入是MPU6050测得的倾角,输出是PWM占空比。速度环的输入是编码器测得的速度,输出是直立环设定值的修正量。转向环的输入是陀螺仪的Z轴角速度,输出是左右电机的差速。这三个环的关系是:速度环的输出叠加到直立环的设定值上,转向环的输出叠加到左右电机的PWM上。

4.2 直立环的调参步骤与常见问题

直立环的调参是整个PID调参里最关键的环节。我的调参步骤是这样的:先把速度环和转向环的参数全部设为0,只调直立环。直立环的Kp从0开始逐渐增大,直到小车能够快速响应倾角变化但不会剧烈振荡。然后加入Kd,Kd的作用是抑制振荡,让小车在倾角变化时能够平滑地回到平衡位置。Kd太大会导致小车对噪声敏感,太小则振荡抑制不够。

具体操作的时候,我先把Kp设为10,Kd设为0,用手扶着小车感受电机的响应。如果小车往一边倒的时候电机能够快速往同方向加速,说明Kp的方向是对的。然后逐渐增大Kp,直到小车在平衡位置附近开始振荡。这时候加入Kd,从Kp的1/10开始逐渐增大,直到振荡消失。最后微调Kp和Kd,让小车在受到轻微扰动时能够快速恢复平衡。

这里有一个很多人会遇到的坑:直立环的Kp方向搞反了。如果小车往一边倒的时候电机往反方向加速,小车会瞬间倒下。判断方向的方法很简单:用手把小车往一边倾斜,如果电机试图把小车推回平衡位置,方向就是对的;如果电机把小车往倾倒方向推,方向就是反的。方向反了的话,把Kp取负值即可。

另一个坑是MPU6050的安装方向。MPU6050的X轴和Y轴对应小车的俯仰和横滚方向,如果安装方向不对,直立环的输入就是错的。我一般把MPU6050的X轴对准小车的前进方向,这样俯仰角就是小车前后倾斜的角度。安装的时候要注意MPU6050要尽量靠近小车的重心,减少振动对测量的影响。

4.3 速度环的增量式PID实现与参数整定

速度环的作用是让小车在保持直立的同时按照设定的速度行驶。速度环的输入是编码器测得的速度,输出是直立环设定值的修正量。增量式PID的公式是:Δu = Kp*(e(k)-e(k-1)) + Kie(k) + Kd(e(k)-2*e(k-1)+e(k-2))。其中e(k)是当前速度误差,e(k-1)是上一次速度误差,e(k-2)是上上次速度误差。

速度环的调参比直立环简单一些,因为速度环的响应速度要求不高。我一般先把Ki设为0,Kp从0开始逐渐增大,直到小车能够按照设定速度行驶但速度有轻微波动。然后加入Ki,Ki的作用是消除稳态误差,让小车能够精确达到设定速度。Ki太大会导致速度超调,太小则稳态误差消除不够。Kd在速度环里通常不需要,因为速度环的反馈值本身比较平滑,加入Kd反而会引入噪声。

速度环的采样周期和直立环不同。直立环的采样周期是5ms,速度环的采样周期通常是20ms到50ms。因为速度的变化比倾角的变化慢得多,速度环的采样周期太长会导致响应迟钝,太短则编码器读数噪声会被放大。我一般用20ms,也就是50Hz的采样频率。

4.4 转向环的串级控制与差速分配

转向环通常用串级PID,外环是方向角,内环是角速度。外环的输入是目标方向角和当前方向角的偏差,输出是目标角速度。内环的输入是目标角速度和陀螺仪测得的角速度的偏差,输出是左右电机的差速。串级控制的好处是内环可以快速抑制扰动,外环可以精确控制方向。

差速分配的逻辑是:左电机PWM = 直立环输出 + 速度环输出 + 转向环输出,右电机PWM = 直立环输出 + 速度环输出 - 转向环输出。这样当转向环输出为正时,左电机加速右电机减速,小车向右转;转向环输出为负时,左电机减速右电机加速,小车向左转。

转向环的调参顺序是先调内环再调外环。内环的Kp从0开始逐渐增大,直到小车能够快速响应角速度变化但不会振荡。然后加入内环Ki,消除角速度的稳态误差。外环的Kp从0开始逐渐增大,直到小车能够按照设定方向行驶。外环的Ki通常不需要,因为方向角的稳态误差可以通过内环消除。

5. 调试过程中那些让人抓狂的问题,我是这样一个个解决的

5.1 电机不转或者只往一个方向转

这个问题最常见的原因是TB6612的STBY引脚没有拉高。TB6612的STBY引脚是待机控制,低电平时模块不工作,电机不转。很多人忘了接这个引脚,或者接了但没有拉高。解决方法很简单,把STBY接STM32的一个GPIO,初始化的时候拉高。

另一个原因是方向控制引脚的电平组合不对。TB6612的AIN1和AIN2不能同时为高电平,否则电机制动。如果AIN1和AIN2都为低电平,电机滑行。正确的组合是AIN1高AIN2低(正转)或AIN1低AIN2高(反转)。如果你发现电机只往一个方向转,检查一下方向控制引脚的电平是否在切换。

还有一个不太常见但很隐蔽的原因是PWM信号的极性。有些STM32的定时器通道默认输出高电平有效,有些默认低电平有效。如果极性搞反了,PWM占空比越大电机反而越慢。解决方法是检查定时器的OCPolarity配置,确保高电平有效。

5.2 编码器读数跳动或者不计数

编码器读数跳动通常是因为信号噪声。JGB-520的编码器输出是霍尔式的,信号边沿不够陡峭,容易受到电机换向噪声的干扰。我在编码器A/B相线上各加了一个100nF的电容到地,同时在软件里对编码器读数做了滑动平均滤波,问题基本解决。

如果编码器完全不计数,先检查编码器的电源是否正常。用万用表量一下编码器电源引脚的电压,如果是0V说明供电有问题。然后检查A/B相信号是否有输出,用手慢慢转动电机轴,用万用表量A/B相电压,正常应该在0V和3.3V之间切换。如果电压不变,说明编码器损坏或者接线错误。

还有一个容易忽略的问题是STM32的编码器接口配置。如果定时器的编码器模式配置错误,比如选成了TI1模式但只接了A相,编码器就不会计数。检查CubeMX里的编码器模式配置,确保选的是TI1&TI2模式,并且A/B相分别接到了对应的引脚上。

5.3 小车振荡或者往一个方向加速

小车振荡通常是因为直立环的Kp太大或者Kd太小。Kp太大会导致小车在平衡位置附近来回振荡,Kd太小则振荡衰减太慢。解决方法是减小Kp或者增大Kd。我一般先把Kp减小20%,如果振荡消失说明Kp确实太大了;如果振荡仍然存在,再增大Kd。

小车往一个方向加速通常是因为速度环的极性搞反了。速度环的输出应该叠加到直立环的设定值上,如果极性反了,小车会越走越快直到倒下。判断方法很简单:用手推一下小车,如果小车往推的方向加速,说明速度环极性反了。解决方法是在速度环的输出上乘以-1。

还有一个原因是MPU6050的零偏没有校准。MPU6050的陀螺仪有零偏,如果不校准,积分得到的角度会漂移。我一般在初始化的时候让MPU6050静止采集1000个样本,计算平均值作为零偏,然后在后续的角度计算中减去这个零偏。

5.4 TB6612发热严重甚至烧毁

TB6612发热严重通常是因为电流过大或者散热不良。JGB-520的堵转电流可以达到2A以上,如果小车在堵转状态下长时间运行,TB6612会发热。解决方法是加散热片,或者在软件里加入过流保护,当电流超过阈值时自动降低PWM占空比。

TB6612烧毁通常是因为电源接反或者电机线短路。TB6612的VM和GND接反会瞬间烧毁芯片,所以接线的时候一定要仔细检查。电机线短路也会导致TB6612输出端过流烧毁,所以在焊接电机线的时候要确保没有短路。

还有一个不太常见的原因是PWM频率太低。TB6612的PWM频率低于1kHz时,电机电流纹波会很大,导致TB6612发热增加。我一般用20kHz,这个频率下TB6612的温度在可接受范围内。

6. 从能站住到能跑起来,几个进阶优化的方向

6.1 前馈控制让小车响应更快

前馈控制是在PID反馈控制的基础上,根据设定值的变化直接给出一个控制量,不需要等待误差产生。在平衡小车里,前馈可以用在速度环上:当设定速度变化时,直接给电机一个前馈PWM,然后再用PID修正。前馈控制的好处是响应速度快,因为不需要等待误差积累。

前馈系数的确定方法有两种:一种是根据电机的电压-转速特性计算,另一种是实验整定。我一般用实验整定的方法:先给电机一个固定的PWM,测量小车的稳态速度,然后计算前馈系数 = PWM / 速度。这个系数就是前馈增益,当设定速度变化时,前馈输出 = 前馈系数 * 设定速度。

6.2 串级PID在直立环上的应用

直立环也可以用串级PID,外环是角度,内环是角速度。外环的输入是目标角度和当前角度的偏差,输出是目标角速度。内环的输入是目标角速度和陀螺仪测得的角速度的偏差,输出是PWM占空比。串级控制的好处是内环可以快速抑制扰动,外环可以精确控制角度。

串级直立环的调参顺序是先调内环再调外环。内环的Kp从0开始逐渐增大,直到小车能够快速响应角速度变化但不会振荡。然后加入内环Kd,抑制角速度的振荡。外环的Kp从0开始逐渐增大,直到小车能够保持直立。外环的Kd通常不需要,因为内环已经抑制了振荡。

6.3 用MATLAB PID Tuner辅助整定参数

MATLAB的PID Tuner工具可以根据系统的阶跃响应自动整定PID参数。使用方法很简单:先在Simulink里搭建小车的模型,包括电机模型、编码器模型和PID控制器,然后用PID Tuner工具自动整定参数。整定完成后,把参数导出到STM32的代码里。

但要注意,MATLAB整定出来的参数是基于理想模型的,实际系统里会有摩擦、间隙、噪声等非线性因素,所以整定出来的参数只能作为初始值,还需要在实际系统上微调。我一般用MATLAB整定出来的参数作为起点,然后在实际系统上调整Kp和Kd,直到小车运行平稳。

6.4 串口调试与实时数据可视化

串口调试是平衡小车调参的重要工具。我一般用STM32的串口把PID的输入、输出、误差等数据发送到电脑,然后用串口示波器软件实时显示。这样可以看到PID的运行状态,判断参数是否合适。

串口数据的格式我一般用简单的文本格式,比如"angle, target, pwm\n",每行三个数据。串口波特率用115200,发送周期用20ms。串口示波器软件我推荐用SerialPlot或者VOFA+,这两个软件都支持实时显示和数据分析。

还有一个技巧是在串口数据里加入时间戳,这样可以分析系统的响应时间。时间戳可以用STM32的定时器计数,每次发送数据的时候把定时器的值一起发送。这样在电脑端可以画出时间-角度曲线,分析系统的动态响应。

7. 一些容易被忽略但很关键的细节

7.1 电机死区补偿

JGB-520电机有死区,也就是PWM占空比低于某个阈值时电机不转。这个阈值通常在5%到10%之间。如果不做死区补偿,PID输出在死区范围内时电机不响应,会导致控制精度下降。死区补偿的方法是在PID输出上叠加一个死区补偿量,当PID输出为正时加上正补偿,为负时加上负补偿。

死区补偿量的大小需要实验确定。我一般从5%开始逐渐增大,直到电机在最小PWM下能够转动。补偿量太大会导致电机在零输出附近抖动,太小则死区补偿不够。我实测下来,JGB-520的死区补偿量在8%左右比较合适。

7.2 电池电压监测

电池电压下降会影响电机的转速,因为PWM占空比相同的情况下,电池电压越低电机转速越慢。如果不做电压补偿,小车的速度会随着电池放电而下降。电压补偿的方法是在PID输出上乘以一个系数,系数 = 标称电压 / 实际电压。这样当电池电压下降时,PID输出会自动增大,保持电机转速不变。

电池电压监测可以用STM32的ADC来实现。我一般用分压电阻把电池电压降到3.3V以内,然后接到ADC引脚上。ADC采样周期用100ms,采样后做滑动平均滤波,减少噪声。电压补偿系数在代码里实时计算,不需要手动调整。

7.3 陀螺仪温漂补偿

MPU6050的陀螺仪有温漂,温度变化时零偏会漂移。如果不做温漂补偿,小车的直立环会随着温度变化而漂移。温漂补偿的方法是在MPU6050旁边放一个温度传感器,根据温度变化修正陀螺仪零偏。但这个方法需要事先标定温度-零偏曲线,比较麻烦。

更简单的方法是用互补滤波或者卡尔曼滤波,把加速度计的角度和陀螺仪积分角度融合,这样可以自动修正陀螺仪的零偏。我一般用互补滤波,系数用0.98,也就是98%的陀螺仪积分角度加上2%的加速度计角度。这个系数下,角度输出既平滑又不会漂移。

7.4 电机同步校准

两个JGB-520电机的特性不可能完全一致,同样的PWM占空比下转速可能有差异。如果不做同步校准,小车会往一边偏。同步校准的方法是在小车上电后让两个电机以相同的PWM运行一段时间,测量两个编码器的读数,计算转速差异,然后在代码里对PWM输出做补偿。

同步校准的补偿系数需要定期更新,因为电机的特性会随着磨损和温度变化而改变。我一般在上电初始化的时候做一次同步校准,运行过程中如果发现小车跑偏,再手动触发一次校准。

8. 最后分享几个我在实际项目中总结的调参口诀

直立环调参口诀:先Kp后Kd,Kp管响应,Kd管振荡。Kp从小往大调,调到小车快速响应但不过冲;Kd从Kp的1/10开始调,调到振荡消失。方向反了取负值,MPU6050装正了再调参。

速度环调参口诀:先Kp后Ki,Kp管响应,Ki管稳态。Kp从小往大调,调到小车能按设定速度行驶;Ki从Kp的1/10开始调,调到稳态误差消失。极性反了乘-1,编码器读数正了再调参。

转向环调参口诀:先内环后外环,内环管角速度,外环管方向角。内环Kp从小往大调,调到角速度响应快速;外环Kp从小往大调,调到方向跟踪准确。差速分配要对称,左加右减不能反。

这三个口诀是我做了五六台平衡小车之后总结出来的,基本上按照这个顺序调参,一两个小时就能让小车从站不住到跑起来。当然每台车的机械结构和电机特性都不一样,具体参数需要根据实际情况微调。但调参的思路和方法是通用的,掌握了这套方法,换任何硬件平台都能快速上手。

还有一个我踩过的坑值得单独提一下:不要一上来就同时调三个环。我第一台车就是三个环一起调,结果小车要么往一个方向加速,要么剧烈振荡,根本找不到问题出在哪里。正确的做法是先调直立环,让小车能站住;再调速度环,让小车能按速度行驶;最后调转向环,让小车能按方向行驶。每个环调好之后再调下一个,这样问题定位起来容易得多。

另外,调参的时候一定要有耐心。PID调参不是一次就能调好的,需要反复尝试和微调。我一般会花半天到一天的时间专门调参,期间不断记录参数和对应的现象,找到最优参数组合。调参的过程中如果遇到问题,先检查硬件连接和传感器数据,确认硬件没问题之后再调软件参数。很多时候问题不在PID参数上,而在硬件或者传感器上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询