这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【原创】平衡车pid调参全过程--from飞

共1条 1/1 1 跳转至

【原创】平衡车pid调参全过程--from飞

工程师
2025-01-17 19:36:30     打赏

参照轮趣科技开发手册进行复刻平衡车,以下为调参全过程

一、 Pid的个人理解

PID 即比例 积分 微分

KP值 在目标点位产生的震荡的幅度

KD值 决定了产生的阻尼大小 减小震荡幅度  很大反而会出现震荡

KI值 抵消恒力

二、 调参过程:

**确定机械中值**

轮趣科技开发手册原话是:

图片1.png

说白了就是从一边往另一边推 观察roll值多少时 倒下

相加/2得到

本人实测是-21+22 接近零了 也赋值的0

图片2.png

**预估大致数量级**

直立环PD控制器函数:

1. int Vertical(float Med,float Angle,float gyro_Y)  

2. {  

3.     int temp;  

4.     temp=Vertical_Kp*(Angle-Med)+Vertical_Kd*gyro_Y;  

5.     return temp;  

6. }  

 

temp是给到电机的参数 即-7200到7200范围

angle 0-60

7200/60 即 120

7200/10 即 720

KP 范围 即0-1k

实际观测 角速度gyox 范围约0-2k

7200/2k 3.6

KD 范围即0-10

直立环函数:

1.     static int Err_LowOut_last,Encoder_S;    

2. 4.      static float a=0.7;    

3. 5.      int Err,Err_LowOut,temp;    

4. 6.      Velocity_Ki=Velocity_Kp/200;    

5. 7.      Err=(encoder_L+encoder_R)-Target;    

6. 8.      Err_LowOut=(1-a)*Err+a*Err_LowOut_last;    

7. 9.      Err_LowOut_last=Err_LowOut;    

8. 10.     Encoder_S+=Err_LowOut;    

9. 11.     Encoder_S=Encoder_S>20000?20000:(Encoder_S<(-20000)?(-20000):Encoder_S);    

10. 12.     if(stop==1)Encoder_S=0,stop=0;    

11. 13.     temp=Velocity_Kp*Err_LowOut+Velocity_Ki*Encoder_S;    

12. 14.     return temp;    

13. 15. }    

 

Err_LowOut是编码器速度 让Load(7200,7200)观察编码器测出的速度 68 两个相加即140

60/140 即3/7

KD 0-1

KI固定=KD/200

**确定极性**

只给直立环的KP or KD 赋值 观察是否车轮,旋转方向与小车倾斜,方向同向

速度环:直立环KP kD 给其最大值的十分之一 赋给速度环最大值 观察倾斜是车轮速度

如果很快则极性正确 很慢则极性相反

**正式调节**

其实无非就是确定以下几个参数:

float Vertical_Kp,Vertical_Kd;          //直立环 数量级(Kp:0~1000、Kd:0~10)  

float Velocity_Kp,Velocity_Ki;        //速度环 数量级(Kp:0~1)  

float Turn_Kp,Turn_Kd;                      //转向环 

 直立环:PD

k p 小电击反应迟钝,kp 大 电机反应猛烈

k d 小抖动范围大,kd 正好的时候抖动范围比较小,达到高频

注意高频抖动时不要持续太久,否则容易烧掉驱动模块

从小开始调 速度环先给0 转向环暂时不用赋值

1. float Vertical_Kp=-100,Vertical_Kd;          //直立环 数量级(Kp:0~1000、Kd:0~10)  

2. float Velocity_Kp=0,Velocity_Ki=0;      //速度环 数量级(Kp:0~1)  

3. float Turn_Kp,Turn_Kd                      ////转向环

发现 电机反应迟钝

逐渐加大

Kp=-400时电机反应过于猛烈

最终给到-300

kd=-1 抖动范围大

kd最终给到-3.4

调好之后乘以0.6,赋值,再去调速度环 KP

速度环:PI

kp赋值0.4 ki固定=kp/200 即 0.02

发现 小车晃动幅度大 难以保持平衡 说明速度环kp给小了

kp 0.8 发现来回摆动的频率过大 说明给大了

kp最终赋值0.6 ki赋值0.003

转向环:PD

转向环没有写严格的PD控制器 因为 mpu6050测量的转向角误差比较大

在计算平衡角的时候,把误差进行了累积

 KP主要是起到放大作用 越大转向越快 对于平衡而言不是很重要

KD和速度环ki数量级是一样的

分别按照手册取经验值 50和0.6即可

最终参数为:

float Vertical_Kp=-180,Vertical_Kd=-2;          //直立环 数量级(Kp:0~1000、Kd:0~10)  

float Velocity_Kp=0.6,Velocity_Ki=0.003;        //速度环 数量级(Kp:0~1)  

float Turn_Kp=10,Turn_Kd=0.6;                      ////转向环 



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]