悠扬随风 发表于 2024-10-15 19:45:37

stm32平衡车(标准库开源)

一、媒介

1.本项目重要参考:

B站Up主:会飞的鱿鱼03,
然后mpu6050姿态解算参考了[小学生都会的]MPU6050DMP库移植(stm32标准库)_哔哩哔哩_bilibili
2.大抵思路:

https://i-blog.csdnimg.cn/direct/e792db9f290444da945f1cce7e1e874d.png
先简朴讲下,pid直立环和速度环,直立环是让小车可以或许站着,速度环是让小车可以或许停住

二、单独模块

1.mpu6050:

https://i-blog.csdnimg.cn/direct/f8ad792337cc4d84b2ac0c0d46131d61.png
大抵原理:

通过I2C向芯片发送指令,使回传三轴加速度(Accelerometer)和三轴角速度(Gyroscope)。再将该数据丢进dmp库中,可剖析出滚转角(Roll)、俯仰角(Pitch)、偏航角(Yaw)。
https://i-blog.csdnimg.cn/direct/f94e11bde63c4bf78eec9dc8082a5dc9.png
其中偏航角决定的是前进的方向,然后滚转角(Roll)和俯仰角(Pitch)与mpu6050的放置位置有关,调取其中的数据来反映当前位置。
利用方式:

1.导入文件(两个都要,注意添加路径)

https://i-blog.csdnimg.cn/direct/be1543e34bdc47ceae3d7519f494ceae.png
https://i-blog.csdnimg.cn/direct/29c2b70b6c6247fca555610887e8e333.png
2.改引脚(在MPU6050_I2C.h文件中)

由于题主利用PB3、4引脚,利用复用引脚,还需在MPU6050_I2C.c举行相干修改
https://i-blog.csdnimg.cn/direct/f39dd2805beb44378f8fbf9502759de4.png
3.初始化

MPU6050_Init();
MPU6050_DMP_Init(); 4.在循环中举行数据提取即可

MPU6050_DMP_Get_Data(&Pitch,&Roll,&Yaw);
MPU_Get_Gyroscope(&Gx, &Gy, &Gz); (该文件在文章最后开源,可参考[小学生都会的]MPU6050DMP库移植(stm32标准库)_哔哩哔哩_bilibili)
2.霍尔编码器:

https://i-blog.csdnimg.cn/direct/6fc2cfbf4c1f48edbf36f1e704838e7d.png
大抵原理:

https://i-blog.csdnimg.cn/direct/923ef4f2025a45e18279eea5ce6240e4.png
通过脉冲的速度,即可计算车轮转速
通过判断A、B相相对位置,即可判断正反转
利用方式:

编码器在stm32中有专门的模式,可节省软件资源,但每个编码器要用掉1个定时器。
1.初始化(见开源文件)

TIM_EncoderInterfaceConfig(TIM2,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); 2.读取计数

TIM_GetCounter(TIM2);TIM_SetCounter(TIM2,0); 读取当前计数,再将当前计数归零。只要定时执行该步伐,即可得到速度
3.tb6612

https://i-blog.csdnimg.cn/direct/e34e8bac39bc4e5b8c357a8feda3defe.png
大抵原理:

通过给入PWM控制速度
通过AIN12,BIN12控制方向
https://i-blog.csdnimg.cn/direct/c0295e701f5b423bb648853a4d86ce1a.png
三、PID算法

https://i-blog.csdnimg.cn/direct/c2aed61587184f3eacdb7b1f4062d780.png
其中e(t)为偏差,Kp、Ki、Kd分别为比例、积分、微分的系数
三个系数分别起到的作用

Kp:回调速度。但过大会产生过冲
Kd:克制Kd。类似阻尼效应
Ki:消除静态误差。
pid的目标:

是对偏差e(t)举行处理,使偏差趋近于0的过程
为了方便数据处理,常见的是离散pid:
https://i-blog.csdnimg.cn/direct/bd8e24ac87ff4fd59479900df86a6e5f.png


直立环:

通常采用PD控制器
https://i-blog.csdnimg.cn/direct/3fc0bd2b415e413da645d40401f13d47.png
输入 :目标角度(Middle_angle),实际角度,X轴角加速度(由于角度微分)
输出:PWM
int Vertical(float Med_Angle,float Angle,float gyro_X)
{
        int PWM_out;
       
        PWM_out = Vertical_Kp*(Angle-Med_Angle) + Vertical_Kd*(gyro_Y-0);
        return PWM_out;
} 速度环:

通常采用PI控制器,而且为减缓速度差值对减少对平衡的影响,所以在速度环中,利用用了一阶低通滤波
https://i-blog.csdnimg.cn/direct/c0a99768f5c142de9b84be8850e641e7.png
输入 :目标速度(=0),当前速度(由编码器测得的数据反映)
输出:PWM
int Velocity(int Target,int encoder_left,int encoder_right)
{
        static int Encoder_S, EnC_Err_Lowout_last, PWM_out,Encoder_Err, EnC_Err_Lowout;
        float a = 0.7;
       
        //1.计算速度偏差
        Encoder_Err = ((encoder_left+encoder_right)-Target);
        //2.对速度偏差进行低通滤波
        //low_out=(1-a)*Ek+a*low_out_last;
        EnC_Err_Lowout = (1-a)*Encoder_Err + a*EnC_Err_Lowout_last;
        EnC_Err_Lowout_last = EnC_Err_Lowout;
        //3.对速度偏差积分,积分出位移
        Encoder_S += EnC_Err_Lowout;
        //4.积分限幅
        Encoder_S = Encoder_S>10000 ? 10000:(Encoder_S<(-10000)?(-10000):Encoder_S);
       
        //5.速度环控制输出计算
        PWM_out = Velocity_Kp*EnC_Err_Lowout + Velocity_Ki*Encoder_S;
        return PWM_out;
}
转向环:

与PD控制器直立环相似,但直立环有目标角度,也就是平衡的时候,因此需要实际与目标角度举行拟合。而转向环是旋转的变量,没有所谓的目标
 输入:旋转角度,z轴角速度 
输出:PWM
int Turn(int gyro_Z,int Angle)
{
        int PWM_out;
        PWM_out=Turn_Kd*gyro_Z + Turn_Kp*Angle;
        return PWM_out;
} PID调节技巧:

1.根据设定电机定时器的ARR,角度大抵范围,速度大抵范围估计Kp、Ki、Kd大抵数量级。然后随便带入几个值,判断差别pid的极性。
2.优先调直立环。先只调Kp,逐渐调大,找到出现低频大幅震惊的阈值,且不要过大;再加入Ki,逐渐调大,找到出现高频小幅震惊的阈值。(短暂观察,避免电机烧了)
3.将上述的值分别乘以0.6,然后开始调速度环。速度环的Kp:Kd 大抵是 200:1。
可参考:【电赛】PID算法的常用组合和调参步调 (串级/并级/舵机环/速度环/直立环/转向环/间隔环...)_哔哩哔哩_bilibili

代码开源:

通过百度网盘分享的文件:stm32平衡车(终).7z
链接:https://pan.baidu.com/s/1iUyFSLq2sGnFLweCSq3KJQ 
提取码:zndp
PID参考资料:

通过百度网盘分享的文件:PID参考文档.zip
链接:https://pan.baidu.com/s/1_HOKx0UVQazHtLzZmwZqzg 
提取码:sg0c

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: stm32平衡车(标准库开源)