1.直接先代码后分析
int err=0;
double kp=0.034;//比例系数
double ki=0;//积分系数
double kd=0.05;//微分系数
int last_err=0;
int ierr=0;
int derr=0;
..............
int pid_pwm(int d1,int d2){
int temp=0;
err=d2-d1;//误差
ierr+=err;//累计误差
derr=err-last_err;//误差变化趋势
last_err=err;//同步
temp=kp*err+ki*ierr+kd*derr;//离散求值
return temp;
}
.........
//此处省略pwm初始化,这个是统一的,随便搜就能找到
int angle=1500;//舵机刚开始转动角度为90° 90*(2500-500)/180+500=1500
//关于pwm控制舵机很简单,要求pwm:50HZ,占空比1/40~1/8表示舵机旋转0~180°
.........
void main(){
while(1){
//一直循环
angle+=pid_pwm(disatnce1,distance2);
TIM_SetCompare1(TIM2,angle);//输出pwm控制舵机转动角度
}
}
分析:
比列环节:误差乘以比例系数,控制输出逼近。
积分环节:累计误差乘以积分系数,控制输出逼近。消除稳态误差。
微分环节:误差的变化乘以微分系数,减缓趋势。减缓比例环节引起的震荡。
我只用了PD比例和微分控制,可以发现满足了我的使用要求。
纸飞机调试助手,你值得拥有。
这就是超声波循迹小车pid算法的原理。
2.有没有一阶滞后滤波和卡尔曼滤波的感觉?
它们的确有相似之处,就是不停的循环计算,利用过去值推测未来值。把推测值当成真实值,因为真实值只有上帝知道。
3.难点
1.理解算法原理
比例就是饿了大口吃,积分就是吃饱了还差点再吃一小口,微分就是快要吃饱了口张小点,防止一会饿一会撑。
2.设置合适的PID系数
先比例系数,再微分,再积分,靠经验(就是网友说的口诀)和感觉(对数字的敏感程度)。