stm32蓝牙平衡小车项目心得(二)

续上一篇的内容。

首先是为小车需要使用到的各个模块和功能进行配置和初始化,这里就不一一列举,简要说其中的一些;

电机编码器的GPIO要配置成GPIO_Mode_IN_FLOATING(浮空输入)模式;然后是为每个编码器配置一个定时器用于计算编码器输出的电频变化次数;
以及编码器模式配置成:
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);

平衡小车的运行主体主要是在中断中完成,这里要弄清小车的时序,可以由MPU6050的中断线或者设置一个定时器,每5ms发起一次中断,在中断里读取两个电机编码器的值计算速度,然后是获取MPU6050数据,可以直接移植正点原子封装好的MPU6050的文件,采用DMP(或者用互补滤波或卡尔曼滤波)解算出Roll(小车相对y轴的角度),gyroy(小车相对y轴的加速度),gyroz(小车相对z轴的加速度)。

解算出这些数据小车就具备获取自身状态的能力啦,然后再引入上一篇说到的直立环、速度环和转向环。

PWM_OUT=Vertical_Out(直立环)-Velocity_Out(速度环);

MOTOR1=PWM_OUT-Turn_Out; //左轮电机输出值
MOTOR2=PWM_OUT+Turn_Out; //右轮电机输出值

再就是配置小车中断的优先级,小车为了保持平衡,计算输出的中断优先等级一定要是最高的,才确保不会被其他中断打断影响了小车的平衡。

还有的就是要对小车电机的输出进行限值,pwm设置的最大值是多少,就对小车电机的输出值限制最大为多少。

加下来是遇到的一些细节问题:
1、程序写好了,小车通电却没有反应?
可能的原因是,小车在通电的时候,MPU6050可能还没有准备好,这就导致了MPU6050初始化的程序没有执行到,所以小车没有反应。

解决办法:
可以在小车初始化之前,先延时差不多100ms,等待MPU6050准备好再初始化就可以了。

2、由于速度环控制过猛,导致小车无法直立的问题?
因为速度环其实对于直立环来说是一种抑制效果,但我们的目的其实始终是为了小车的直立,这里我们需要在保持小车能够稳定的前提下,降低速度环的控制效果。

解决方法:
可以适当降低小车的速度环Kp、Ki的大小,但有可能使小车无法一直稳定。所以还有一种方法,就是调节速度环控制的周期,大概可以设置在直立环的十倍左右。直立环每控制十次,速度环再控制输出一次。

平衡小车最难的还是MPU6050文件的移植和pid参数的调节。

MPU6050的移植可以参考:

MPU6050 DMP文件的移植

调PID参数的话,也没什么技巧,注意在调之前先测试一下极性,确定正负之后,剩下的就靠耐心啦!

嗯,就先想到这么多,有想到其他的再更。大神请多多指教!

再用一次上一篇的图:

在这里插入图片描述
下一篇是蓝牙控制篇,比较容易就介绍一下蓝牙控制的数值要怎么融入到小车电机输出值里面。

之后我也会把整个工程程序分享在我的微信公众号上, 有需要到时候可以下载。要是急也可以在我的微信公众号加我微信联系我,我也可以直接分享。

希望对读者有所帮助,喜欢的话可以关注一下我的公众号,我会把学习笔记发在上面,大家可以一起共同学习!

在这里插入图片描述
Alt

发布了19 篇原创文章 · 获赞 12 · 访问量 6101

猜你喜欢

转载自blog.csdn.net/Rosen_er/article/details/104739111