4.2核心代码
/**************************************************************************
函数功能:增量PI控制器
入口参数:编码器测量值,目标速度
返回 值:电机PWM
根据增量式离散PID公式
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
e(k)代表本次偏差
e(k-1)代表上一次的偏差 以此类推
pwm代表增量输出
在我们的速度控制闭环系统里面,只使用PI控制
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
**************************************************************************/
int Incremental_PI (int Encoder,int Target)
{
float Kp=20,Ki=30;
static int Bias,Pwm,Last_bias; //相关内部变量的定义。
Bias=Encoder-Target; //求出速度偏差,由测量值减去目标值。
Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //使用增量 PI 控制器求出电机 PWM。
Last_bias=Bias; //保存上一次偏差
return Pwm; //增量输出
}复制代码
这里可以看到使用的是增量式比例积分控制器,Kp和Ki的值在函数中临时设置,完全按照公式编写,简单易懂。
4.3定时控制
int Target_velocity=50; //设定速度控制的目标速度为50个脉冲每10ms
int TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//10ms定时中断
{
TIM3->SR&=~(1<<0); //===清除定时器1中断标志位
Enco