STM32F1、FreeRTOS、PID平衡小车
一、简单介绍(代码放最后自取)1.STM32F103C8T6、按键、LED核心板上自带的PC13、TB6612、MPU6050、OLED(4引脚I2C)、直流编码电机带霍尔传感器减速齿轮、电池2.按键控制PID启停配合LED显示代码里按键是非阻塞式的没用定时器实现用的freertos任务配合延时定时扫描然后用队列传输3.速度环加直立环如果用纯直立环小车稳定后还会一直前后移动有时还停不下来所以加入速度外环可以使小车稳定后速度还保持0。这时速度保持0且角度也为0再用蓝牙遥感使外环速度环目标值为正负值速度环的输出给角度环的目标值角度环保持稳定角度的前倾或者后仰完成前进后退转向环可以使小车走得很直可加可不加。4.由于我的电机是JGA25-370直流减速电机12V170RPM转速太慢了减速比是35。非常推荐买6V600多RPM的减速比9.3那款。因为转速很慢小角度比较稳定手怎么按都不会倒地小角度前进后退稳定不能大角度因为转速拉满也跟不上。5.注意勾选USE MicroLIB要不然报错。6.先用MPU6050得到俯仰角加速度计AX/AZ再反正切得到的俯仰角静态是正确的运动、震动后由于运动加速度得到的角度是错误的GY陀螺仪角速度积分得到的俯仰角不受运动和震动影响但是会有零漂随着时间角度越来越大所以要用互补滤波主要相信陀螺仪得到的俯仰角通过加速度计得到的俯仰角减去陀螺仪俯仰角去校准陀螺仪注意陀螺仪的俯仰角要用互补滤波的角度去累加不要还是用原来的陀螺仪俯仰角注意MPU6050的安装不要装歪了最后把小车放在绝对平整的地方校准一下角度比如零漂在6附近那用GY时直接把GY减6还有平地上角速度计角度一直是4度用该角度时先把这个角度减4最后把两个结果互补滤波得到稳定的俯仰角7.MPU6050得到正确的俯仰角后再开始调角度环角度环的目标值始终是0即一直保持直立角度角度环输出给PWM我的是PWM值是-100-100所以对角度环的输出值限幅在-100-100由于我的电机转速很慢100的PWM也转不快当小角度时20-30PWM更转不快所以我的角度环Kp给的很大Kp要到6-12也就是10度的角度差角度环PWM就已经全速了。8.调好角度环后由于没有速度环纯角度环对速度没有限制小车会一直来回动而且推小车也不会马上减速。加上速度环速度环作为外环角度换为内环所以速度环的输出给角度环的输入由于我的角度环PID值给的很大角度环输入6-10度就已经满PWM了所以速度环的输出只能限制在10左右也就是车只能以小角度小速度稳定前进后退。9.最后加个并入的转向环控制差分速度即两个轮子的差速可以控制小车转弯差速为0时可以让小车前进后退走得很直。10.调PID系数的时候先调内环再调外环纯P项效果就还可以再加I项的时候一定要注意你的PID目标值和实际值的波形如果实际值达不到目标值这时加入I项就会导致很差的效果比如我的电机转不快目标速度为20但是轮子转最快也只有10这时如果加入I项这个I项就会一直累加达到饱和甚至深度饱和效果就是给大速度目标值保持一段时间这时再给给小速度目标值或者负的目标速度小车还是正速度全速前进因为积分项一直输出最大值转向环也是要观察目标差速度电机是否能跟上。如果电机全速转能跟上目标值这时加入I项效果就很好。所以要注意对目标值限幅比如速度环的目标值是遥感控制遥感控制最大值传给单片机时要先限幅再给速度环目标值比如角度环由于角度环系数很大角度为10的时候电机就满转了所以速度环的输出给角度环的输入就要限幅在-10-10。11.改进措施可以有输出偏移积分限幅微分先行。比如微分先行微分项是当前误差减去上次误差稳定状态D项一直比较小阻尼作用但是如果突然改变目标值比如目标速度由0设置为10这时本次误差是10而上次误差是稳定状态的速度为0再乘上Kd效果就像P项一样不是阻尼作用但是下次D项又会输出负值成为阻尼。所以要引入微分先行对实际值微分。12.详细教程参考b站江协科技我只是在他的基础上加了个freertos用了少量的RTOS功能。二、图片和视频直立蓝牙遥控三、源码通过网盘分享的文件平衡车.zip链接: https://pan.baidu.com/s/1KssS_FcXciwSOTWkm7tooQ?pwd1234 提取码: 1234