/*************************************************************************** 函数功能:电机的闭环控制 入口参数:电机的编码器值 返回值 :电机的PWM ***************************************************************************/ int Velocity_A(int encoderA) { static float velocity,Encoder_Least,Encoder_bias; static float Encoder_Integral; //================速度PI控制器=====================// Encoder_Least =200-encoderA; //获取最新速度偏差=目标速度-测量速度 Encoder_bias *= 0.84; //一阶低通滤波器 Encoder_bias += Encoder_Least*0.16; //一阶低通滤波器,减缓速度变化 Encoder_Integral +=Encoder_bias; //积分出位移 积分时间:10ms if(Encoder_Integral>380000) Encoder_Integral=380000; //积分限幅 if(Encoder_Integral<-380000) Encoder_Integral=-380000; //积分限幅 velocity=Encoder_bias*20+Encoder_Integral*0.5; //速度控制 return velocity; }
时间: 2023-07-24 19:14:33 浏览: 116
https-discord.com-channels-me-780642664407760906:https
这是一个用于电机闭环控制的函数。函数的入口参数是电机的编码器值,函数将根据编码器值计算出电机的PWM值,并作为返回值。函数内部使用了速度PI控制器来实现闭环控制。
函数首先定义了一些静态变量,包括velocity(速度)、Encoder_Least(速度偏差)、Encoder_bias(低通滤波后的速度偏差)和Encoder_Integral(速度偏差的积分)。
接下来,函数使用速度PI控制器的算法进行计算。首先获取最新的速度偏差,即目标速度减去测量速度。然后通过一阶低通滤波器对速度偏差进行平滑处理,减缓速度变化。接着将平滑后的速度偏差累积到积分器中,并对积分器进行限幅处理,避免积分器过大或过小。
最后,根据速度偏差和积分项的加权求和,得到电机的PWM值,即控制电机转动的信号。函数将该PWM值作为返回值。
请注意,该函数中使用的一些参数和权重是固定的,您可能需要根据具体情况进行调整和优化。
阅读全文