直流电机角度位置控制详解(附源码)
电机角度位置控制,指的是使电机转动特定所需角度。
常用于驱动齿轮组,涡轮蜗杆,丝杆滑块等执行机构。电机需带有编码盘反馈。
电机角度控制简单分为两层,内层电机速度环,外层电机角度环。
首先获取编码盘脉冲值,进行处理,得到实时反馈转速,然后通过PID控制器,形成速度内环。
对编码盘脉冲值处理,电机会获得绝对角度反馈。
void Motor_Angle_Cal(unsigned short int motor_num,float T) { float res1, res2; static float pos[MOTOR_MAX], pos_old[MOTOR_MAX]; pos[motor_num] =MOTOR_FEEDBACK[motor_num].real_angle; motor.ANGLE[motor_num].eer=pos[motor_num] - pos_old[motor_num]; if(motor.ANGLE[motor_num].eer>0) { res1=motor.ANGLE[motor_num].eer-T;//反转,自减周期T(我取360) res2=motor.ANGLE[motor_num].eer; } else { res1=motor.ANGLE[motor_num].eer+T;//正转,自加周期T res2=motor.ANGLE[motor_num].eer; } if(ABS(res1)<ABS(res2)) //不管正反转,肯定是转的角度小的那个是真的 { motor.ANGLE[motor_num].eer_eer = res1; } else { motor.ANGLE[motor_num].eer_eer = res2; } motor.ANGLE[motor_num].POS_ABS += motor.ANGLE[motor_num].eer_eer; pos_old[motor_num] = pos[motor_num]; }
用手顺时针拨动三圈,电机会获得反馈+1080度,然后通过PID控制器,至此,角度环形成。
过程分析,当前绝对角度反馈为 motor_angle[moto_num].pos_abs,目标位置角度motor_angle[moto_num].pos_goal输入角度环pid计算。 角度环pid的输出pid.motor_pos[moto_num].out做为速度环的输入,
与速度反馈 abs_err[moto_num]做差,通过速度环pid输出给电机pwm占空比或can信号,驱动电机。
经过微小震荡(超过位置会反转),最终电机稳定停止在目标位置,此时系统稳定。
宏观现象来看,电机连接的齿轮转动给定圈数,达成控制目标。
void Motor_Auto_Run(void) { unsigned short int moto_num; float abs_err[MOTOR_MAX]; static float abs_err_old[MOTOR_MAX]; for (moto_num=0;moto_num<=1;moto_num++) { Motor_Angle_Cal(moto_num,360); PID_Cal_Limt(&pid.motor_pos[moto_num], motor_angle[moto_num].pos_abs,motor_angle[moto_num].pos_goal); abs_err[moto_num] = motor_angle[moto_num].pos_abs - abs_err_old[moto_num]; PID_Cal_Limt(&pid.motor_speed[moto_num], abs_err[moto_num],pid.motor_pos[moto_num].out); abs_err_old[moto_num] = motor_angle[moto_num].pos_abs; } PWM_OUT_Control(pid.motor_speed[MOTOR1].out,pid.motor_speed[MOTOR2].out); }
先随便写点,有空接着弄,知乎是同人。