这种情况应该调整速度环还是角度环的参数,有没有调串级pid的技巧请教一下
不知道你这个问题是否已经解决, 如果还没有解决的话:1、control.c
#include "control.h"
float Med_Angle=0; // 机械中值,能使得小车真正平衡住的角度
float Target_Speed=0; // 期望速度。---二次开发接口,用于控制小车前进后退及其速度。
float
Vertical_Kp=0,
Vertical_Kd=0; // 直立环Kp、Kd
float
Velocity_Kp=0, // 速度环Kp、Ki(正反馈)
Velocity_Ki=0;
float
Turn_Kp=0;
int Vertical_out,Velocity_out,Turn_out; // 直立环&速度环&转向环的输出变量
int Vertical(float Med,float Angle,float gyro_Y); // 函数声明
int Velocity(int Target,int encoder_left,int encoder_right);
int Turn(int gyro_Z);
void EXTI9_5_IRQHandler(void)
{
int PWM_out;
if(EXTI_GetITStatus(EXTI_Line5)!=0) // 一级判定
{
if(PBin(5)==0) // 二级判断
{
EXTI_ClearITPendingBit(EXTI_Line5); // 清除中断标志位
// 1.采集编码器数据&MPU6050角度信息
// 电机是相对安装,刚好相差180度,为了编码器输出极性一致,就需要对其中一个取反
Encoder_Left = -Read_Speed(2);
Encoder_Right = Read_Speed(4);
mpu_dmp_get_data(&Pitch,&Roll,&Yaw); // 读取角度
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); // 读取角速度
MPU_Get_Accelerometer(&aacx,&aacy,&aacz); // 读取加速度
// 2.将数据压入闭环控制中,计算出控制输出量
Velocity_out=Velocity(Target_Speed,Encoder_Left,Encoder_Right); // 速度环
Vertical_out=Vertical(Velocity_out+Med_Angle,Roll,gyrox); // 直立环
Turn_out=Turn(gyroz);
PWM_out=Vertical_out;//最终输出
// 3.把控制输出量加载到电机上,完成最终控制
MOTO1 = PWM_out-Turn_out; // 左电机
MOTO2 = PWM_out+Turn_out; // 右电机
Limit(&MOTO1,&MOTO2); // PWM限幅
Load(MOTO1,MOTO2); // 加载到电机上
}
}
}
/*****************
直立环PD控制器:Kp*Ek+Kd*Ek_D
入口:Med:机械中值(期望角度),Angle:真实角度,gyro_Y:真实角速度
出口:直立环输出
******************/
int Vertical(float Med,float Angle,float gyro_Y)
{
int PWM_out;
PWM_out = Vertical_Kp*(Angle-Med)+Vertical_Kd*(gyro_Y-0);
return PWM_out;
}
/*****************
速度环PI控制器:Kp*Ek+Ki*Ek_S(Ek_S:偏差的积分)
******************/
int Velocity(int Target,int encoder_left,int encoder_right)
{
// 定义成静态变量,保存在静态存储器,使得变量不丢掉
static int PWM_out,Encoder_Err,Encoder_S,EnC_Err_Lowout,EnC_Err_Lowout_last;
float a=0.7;
// 1.计算速度偏差
//舍去误差--我的理解:能够让速度为"0"的角度,就是机械中值。
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;
}
/*****************
转向环:系数*Z轴角速度
******************/
int Turn(int gyro_Z)
{
int PWM_out;
PWM_out = Turn_Kp*gyro_Z;
return PWM_out;
}
以上就是平衡小车系列文章第六讲——位置式PID、直立环与速度环软件编程讲解,平衡小车系列文章作者在持续更新中。若文章中出现错误或者小伙伴对以上内容有所疑问,欢迎大家在评论区留言,小政看到后会尽快回复大家!
【平衡小车制作】(七)串级PID调参及平衡成果展示(超详解)
看看车轮是不是卡住了,还有是不是信号传感器问题。
在加入速度环后出现的问题可能是由于角度环和速度环之间存在耦合,导致两个环之间的相互影响。以下是可能导致抖动和不停在原地的一些常见问题和解决方法:
1、没有正确设计速度环的控制策略,导致速度环和角度环之间的相互影响。在设计速度环的控制策略时,需要考虑与角度环之间的协调和平衡,使得两个环之间的控制策略能够协同工作,而不是相互干扰。
2、没有正确设计速度环的参数,导致速度环的控制效果不佳。在设计速度环的参数时,需要考虑到平衡小车的动态特性,选择合适的参数,使得速度环能够正确地控制小车的速度。
3、控制器的采样周期设置不合理。在控制器中,采样周期的设置非常重要。如果采样周期过大,将会导致系统响应变慢,控制效果不佳;如果采样周期过小,将会导致控制器的计算量增大,同时可能会引起抖动和不稳定的控制效果。
4、系统的传感器采样频率不足。如果传感器采样频率不足,将会导致系统响应变慢,控制效果不佳。为了确保系统的稳定性和控制效果,需要确保传感器采样频率足够高,能够满足系统的要求。
5、控制器的噪声滤波不足。在控制器中,噪声滤波对于控制效果的影响非常重要。如果噪声滤波不足,将会导致控制器受到噪声的影响,从而引起抖动和不稳定的控制效果。
针对以上可能导致抖动和不停在原地的问题,需要逐一排除并解决。一般情况下,可以先调试单个环路,确保其控制效果稳定后再加入另一个环路。同时,需要不断地尝试不同的控制策略和参数,才能够找到最优的控制方法。