电机角度位置控制,指的是使电机转动特定所需角度。
常用于驱动齿轮组,涡轮蜗杆,丝杆滑块等执行机构。电机需带有编码盘反馈。
电机角度控制简单分为两层,内层电机速度环,外层电机角度环。
首先获取编码盘脉冲值,进行处理,得到实时反馈转速,然后通过PID控制器,形成速度内环。
https://blog.csdn.net/qq_40696002/article/details/103759101
对编码盘脉冲值处理,电机会获得绝对角度反馈。
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);
}
先随便写点,有空接着弄,知乎是同人。 |