下面这段对位置式pid的定义是借鉴某大神的 ,然后关于 int pid_proc(pid_s *p, float current, float differential)中的current和differential我理解得感觉不是很到位,current为当前值,用的是TIM4->CCR3,然后motor1-ex1为微分float differential,不知道我这样写有没什么问题?求指教。。
/*********************************主函数我是这么写的***********************************************************/
while (1)
{
ex1=motor1;
motor1 = pid_proc(&sPID, motor1, motor1-ex1); //TIM4->CCR3为当前值,即定义中的float current,motor1-ex1为微分float differential
ex2=motor2;
motor2 = pid_proc(&sPID, motor2, motor2-ex2);
//循迹部分未定义
// if(follow1==1&&follow2==1) pwm_control(0,0); //两个红外都检测到黑线,停
// if(follow1==0&&follow2==1) pwm_control(motor1,motor2); // 右
// if(follow1==1&&follow2==0) pwm_control(motor1,motor2); // 左
// if(follow1==0&&follow2==0) pwm_control(motor1,motor2); //前
}
/******************************************************************************************************************/
/*************************************************以下为pid配置******************************************************/
void pid_init(pid_t pid, float Kp, float Ki, float Kd)
{
pid->target = 0;
pid->integral = 0; // 累计积分值
pid->Kp = Kp;
pid->Ki = Ki;
pid->Kd = Kd;
}
int pid_proc(pid_s *p, float current, float differential)
{
float offset;
offset = p->target - current;
p->integral += offset;
return (int)(p->Kp*offset + p->Ki*p->integral + p->Kd*differential);
}
/*************************************************************************************************/
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>