平衡小车调试总结



前言

本文将总结平衡小车的调试经验,经过几晚的努力平衡小车已经可以比较稳定的平衡了。前期的调试过程一度让我怀疑人生,好在还是有能力去分析和解决。本文平衡小车基于STM32,部分内容其他单片机可能不适用。


以下是本篇文章的正文内容

一、前期准备工作

1.注意电池电压

在小车上电时一定要用万用表去测量电池电压,最好是确定电池已经充满电。在前期调试时无论怎么调平衡环kp值小车都无法基本站立,几次浏览代码都没发现什么问题。调了几个小时后效果更差了,小车一加速系统就会复位(这里要注意在OLED上打印一下基本信息,不然连系统出什么问题都不知道),查看小车主板原理图也没发现什么问题。过一晚后断定是电池没电了(在此之前adc测量值一直没变),万用表测量电池发现少了1V。

2.确定机械中值

先在OLED上输出陀螺仪俯仰角,让小车前倾至倒下记录角度,再让小车后倾至倒下记录角度。将两个角度求平均值就是小车的机械中值了。机械中值非常重要,一两度的误差影响都很大,特别是陀螺仪装的比较高时。在调试过程中要注意陀螺仪安装方向,不同的安装方向要修改旋转矩阵。详情可参考MPU6050常见问题的分析与处理这篇文章。

二、PID调试

1.平衡环PD调试

调试平衡环时关闭直立环和转向环。先确定kp极性,小车前倾时车轮要往前开,小车后倾时车轮要往后开。一般取小车±10度时电机到达最大速度,如果PWM频率为10kHZ,那么kp取值为0-720。增大kp直到出现低频振荡说明kp值足够大了。
接下来调节kd值,先将kp值置零确定kd极性。小车前倾车轮前进,小车后倾车轮后退说明kd极性正确。把调试好的kp值加入,增大kd值,直到出现高频振荡,说明kd值足够大了。
因为在调试过程中都往较大值的方向调试,所以最终结果要乘以0.6-0.9才比较合适。如果最后小车能平稳保持5s左右,说明平衡环参数已经非常好了,如果小车往一个方向一直前进属于正常现象。

2.编码器极性修改

在进行速度环调节之前先确定编码器读出的数据是否和预期的一样。关闭平衡环,在OLED上打印编码器数值。大部分情况下都是一个正一个负,这是因为电机是对称安装的,所以有一个电机取值与另外一个电机相反。向前旋转车轮时编码器数值应当为正,同理向后旋转时数值为负。找到极性正确的电机,另外一个电机就要参考这个电机的极性来修改。
例如右电机的极性是正确的,左电机可以这样修改。

MOTOR_Left = read_encoder(2);
MOTOR_Right = read_encoder(4);

if(MOTOR_Left != 0)
	MOTOR_Left = -MOTOR_Left;

3.速度环PI调试

速度环的调试比平衡环简单,根据大佬的经验ki = kp / 200。所以只有确定好kp就行了。先注释掉平衡环,观察kp和ki极性是否正确。正常的现象是向前旋转车轮时两个车轮都会由于正反馈会达到最大速度。如果向前缓慢旋转一个车轮时另外一个车轮也缓慢向后说明极性错误。如果向前缓慢旋转一个车轮时,两个车轮向相反方向达到最大速度,这种情况下kp的极性是正确的,由于两电机对称安装一个电机前转另外一个电机相对而言就会反转。
这时可以在设置PWM函数中修改,以左电机取反为例。

if(moto1 > 0)			
{
	AIN1=0;
	AIN2=1;			
}
else 	          
{
	AIN1=1;
	AIN2=0;
}
PWMA = myabs(moto1) + dead_zone;

if(moto2 < 0)	
{
	BIN1=0;
	BIN2=1;
}
else 
{
	BIN1=1;
	BIN2=0;
}
PWMB = myabs(moto2) + dead_zone;	

确定好极性后就可以加入平衡环进行调试了。逐渐增大速度环直到小车出现抖动说明速度控制足够大了,要稍微减小到小车不抖动。小车能在原地以缓慢的速度来回摆动说明速度环参数比较合适。

4.转向环PD调节

这里我使用的PD并不是标准的PD,只要遥控时才使用微分控制。kp的入口数据是陀螺仪原始数据。先确定kp极性,注释掉平衡环和速度环,放在地上旋转小车时小车阻碍旋转说明极性正确。转向环是最不重要的一环,按照实际情况进行调节就可以了。

三、电机死区调节

电机死区是不可忽视的调节对象。所谓的死区是电机PWM小到一定范围时无法驱动电机。调节好平衡环和速度环后如果小车来回摆动的幅度很大就需要调节死区了。或者来回推动小车,可以明显感受到小车倾斜2-3度时才有回复力。具体调节方法是在设置PWM的函数中加上一个数值。当死区数值增大到小车出现抖动就说明死区足够大了,可以往下调节至不出现抖动。

四、时序问题

小车的处理时序越短,理论上小车性能会更好。但是MPU6050的采样频率是有限制的,不能小于5ms。所以时序最短只能设置为5ms,一般会用定时器或者MPU6050中断引脚触发5ms中断然后处理数据输出PWM。一开始我在确保程序没有问题的情况下发现小车怎么也无法直立,后来我把中断函数中OLED的打印全部去掉,小车就能直立起来了。因为OLED打印数据本身也有时序,这个时序影响了5ms的中断时序。所以最好不要在中断函数中打印数据到OLED,尽量缩减中断函数的代码量。


结语

那么以上就是本篇文章的所有内容了。

评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微光feng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值