一、伺服電機的雙環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,最終實現了在保證電機響應和角度閉環足夠的情況下,盡量減小因為抖動產生的響聲。