快捷搜索: 王者荣耀 脱发

直流电机角度位置控制详解(附源码)

电机角度位置控制,指的是使电机转动特定所需角度。

常用于驱动齿轮组,涡轮蜗杆,丝杆滑块等执行机构。电机需带有编码盘反馈。

电机角度控制简单分为两层,内层电机速度环,外层电机角度环。

首先获取编码盘脉冲值,进行处理,得到实时反馈转速,然后通过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);

}

先随便写点,有空接着弄,知乎是同人。

经验分享 程序员 微信小程序 职场和发展