电机三环pid控制及调试经验
一、伺服电机的双环pid
双环pid在正常底盘运动的控制中已经足够了,但是对于双轴云台的控制来说,双环pid的云台控制的响应速度是远远不够的,所以加入了电流环的控制。
两篇大佬的文章——这是我学习pid和电机控制的入门
https://www.cnblogs.com/sasasatori/p/12227708.html
https://www.cnblogs.com/sasasatori/p/11672918.html
双环pid
之前对电双环pid的调试,总结了一些经验。
当时的理解比较粗浅,对于电机的理解就只是会转的电机。
现在我对pid的理解大概是:
比例P-基础运行能力。
Kp小的时候不能达到目标,Kp大的时候会超出目标,也就是超调。
积分I-补足Kp的问题,对于小的偏差量有效果。
当Ki小的时候不能达到目标,即小的偏差量不能回正,当Ki大的时候,会超出目标,系统表现迟钝。
微分D-阻止超出目标。
当Kd小的时候会超出目标,当Kd大的时候,目标范围附近高频抖动,对误差敏感。
对于速度环和角度环的关系可以是通过减速比和电机的转矩来解释。
减速比,即减速装置的传动比,是传动比的一种,是指减速机构中瞬时输入速度与输出速度的比值,用符号“i”表示。
一般减速比的表示方法是以1为分母,用 “:” 连接的输入转速和输出转速的比值,如输入转速为1500r/min,输出转速为25r/min,那么其减速比则为:i = 60:1。一般的减速机构减速比标注都是实际减速比,但有些特殊减速机如摆线减速机或者谐波减速机等有时候用舍入法取整,且不要分母,如实际减速比可能为28.13,而标注时一般标注28。
二、伺服电机的三环pid——电流环
电机的电流环作为最内环,角度环(位置环)作为最外环。
将电机角度环计算的输出作为电机速度环的期望,将电机速度环的输出作为电流环的期望。
1 void Yawcontrol() 2 { 3 4 Motor_SetAngleFdb(&Motor_Yaw,Motor_Yaw.encoder.consequent_angle);//反馈 5 Motor_SetSpeedFdb(&Motor_Yaw,IMU.IMUdata.SpeedYaw); 6 //角度环和速度环 7 Motor_SetMotorRef(&Motor_Yaw, Slope_CalcSlopeRef(Motor_Yaw.pid[1].fdb,0, &Slope_paraYaw)); 8 Motor_CalcSelfMotorOutput(&Motor_Yaw); 9 //电流环 10 PID_SetRef(&Motor_Yaw.pid[2],Motor_Yaw.pid[0].output); 11 PID_SetFdb(&Motor_Yaw.pid[2],Motor_Yaw.encoder.current); 12 PID_Calc(&Motor_Yaw.pid[2],&Motor_Yaw.pid_param[2]); 13 14 /*电机输出*/ 15 Motor_SetMotorOutput(&Motor_Yaw, -Motor_Yaw.pid[2].output); 16 } 17 18 /** 19 * @brief 设置电机PID目标值 20 * @param pmotor: 指向电机对象的指针 21 * @param ref: 目标值 22 * @retval 无 23 */ 24 void Motor_SetMotorRef(Motor_t* pmotor, float ref) { 25 if ( pmotor->pid_type == MOTOR_PID_NONE) return ; 26 if ( pmotor->pid_type == MOTOR_PID_SPEED) { 27 PID_SetRef(&(pmotor->pid[0]), ref); 28 } 29 else if (pmotor->pid_type == MOTOR_PID_ANGLE) { 30 PID_SetRef(&(pmotor->pid[1]), ref); 31 } 32 } 33 34 void PID_Calc(PID_PIDTypeDef* pid, PID_PIDParamTypeDef* pparam) { 35 float dError,Error; 36 37 Error = pid->ref - pid->fdb; //计算误差 38 pid->sum = pid->sum + Error; //累积误差 39 pid->err_last = pid->err; //更新结构体历史误差 40 pid->err = Error; //更新结构体误差 41 dError = pid->err - pid->err_last; //计算微分 42 43 //积分限幅 44 pid->sum = limit(pid->sum, pparam->sum_max,-pparam->sum_max); 45 46 //计算输出 47 pid->output = pparam->kp * Error + pparam->ki * pid->sum + pparam->kd * dError; 48 49 //输出限幅 50 pid->output = limit(pid->output, pparam->output_max, -pparam->output_max); 51 }
三.三环pid调试经验
清明假期进行了哨兵云台pitch轴三环pid的调试,开始的时候因为速度环的Kp给的过大导致电机发生抖动,有响声。但是在这种情况下pitch轴还是比较软,最后减小的速度环的Kp,加大了电流环的Kp,最终实现了在保证电机响应和角度闭环足够的情况下,尽量减小因为抖动产生的响声。