电机控制中的PID

电机控制中的PID

FOC算法中的电流环,速度环都涉及到PID控制

PID又分位置式PID控制算法和增量式PID控制算法,而个人认为在电机控制中使用增量式PID效果会更好一些。下面主要介绍几种增量式PID控制算法及C代码实现。

1.抗积分饱和PID

1.1AN1078文档中的PID

PI结构框图和原理
在这里插入图片描述
C代码实现:

//电流环D轴PI控制
void PI_Control_D( PID_ID_TypeDef *dParm)
{
	int32_t U,Excess;
	U = (dParm->Id_Sum + dParm->Id_Kp*dParm->Id_Err)>>12;
	if(U > dParm->Id_OutMax)
	{
		U = dParm->Id_OutMax;
	}
	else if(U < dParm->Id_OutMin)
	{
		U = dParm->Id_OutMin;
	}
	else
	{
		dParm->Id_Out = U;
	}
	Excess = U - dParm->Id_Out;
	dParm->Id_Sum = dParm->Id_Sum + dParm->Id_Ki*dParm->Id_Err - dParm->Id_Kc*Excess;
}

1.2传统增量式PID

离散化公式:
在这里插入图片描述
C代码实现:

int16_t PIDControl_Q(PID_IQ_TypeDef * PID, int16_t Ref, int16_t Cur)
{
	int32_t Kp_Out, Ki_Out, PID_Out,PID_Out_Last;
    if (!PID->Iq_Err)
    {
    	PID->Iq_Err = Ref - Cur;                               // 初始化PID当前偏差
    	PID->Iq_Err_Err = PID->Iq_Err - PID->Iq_Err_Last1;           // 初始化PID上次偏差和上上次偏差之差
    	PID->Iq_Err_Last1 = Ref - Cur;                         // 初始化PID上次偏差
    	PID->Iq_Err_Err_Last1 = PID->Iq_Err_Err;

    }
    else
    {
        PID->Iq_Err_Last1 = PID->Iq_Err;                                    // 保存PID上次偏差
        PID->Iq_Err = Ref - Cur;                                         // 计算PID当前偏差
        PID->Iq_Err_Err = PID->Iq_Err - PID->Iq_Err_Last1;                     // 计算PID上次偏差和上上次偏差之差
    }

    Kp_Out = ((int32_t)PID->Iq_Kp * (int32_t)PID->Iq_Err_Err)>>12;
    Ki_Out = ((int32_t)PID->Iq_Ki * (int32_t)PID->Iq_Err)>>12;
    PID_Out = PID->Iq_Out;
    PID_Out += Kp_Out + Ki_Out;


    if (PID_Out > PID->Iq_OutMax)
    {
        PID_Out = PID->Iq_OutMax;                                         // PID最高输出
    }

    if (PID_Out < PID->Iq_OutMin)
    {
        PID_Out = PID->Iq_OutMin;                                          // PID最低输出
    }

    PID->Iq_Out = PID_Out;
    return PID->Iq_Out;
}

1.3back-cal PID

结构框图:
在这里插入图片描述
C代码实现:

/**
 *  PI controller
 * */
static float _pi(struct BackCalPID *that, float err)
{
    that->i_err = err;

    own.m_pre_out = that->i_err * own.m_kp + own.m_sum;

    that->o_out = own.m_pre_out;

    /*output clamp*/
    if (that->o_out > own.m_out_up)
    {
        that->o_out = own.m_out_up;
    }
    else if (that->o_out < own.m_out_low)
    {
        that->o_out = own.m_out_low;
    }

    /*back-cal dynamic Integrator clamp*/
    own.m_sum += that->i_err * own.m_ki + own.m_kc * (that->o_out-own.m_pre_out);

    return that->o_out;
}

上述具体的PID.c/.h文件链接:
https://download.csdn.net/download/strive3/87124205

以上几种PID控制算法均可以实现电机控制中的电流环,速度环PI控制。

2.学习资料

附上一些视频和文章资料,大家如果感兴趣可以看看。

2.1TI公开课:

链接: https://www.bilibili.com/video/BV1LE411W7M9/?p=5

2.2王博视频:

链接: https://www.bilibili.com/video/BV1NT4y1j76y/?from=search&seid=5197738155280057976&spm_id_from=333.337.0.0

2.3知乎王崇卫的文章:

文章中介绍了多种PID,并在matlab中做了仿真比较。
链接: https://zhuanlan.zhihu.com/p/436897732

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
前馈PID电机控制是一种高级的电机控制技术,用于精确控制电机的速度、位置或力矩。PID代表比例(proportional),积分(integral),微分(derivative)这三个控制算法的结合。 在前馈PID电机控制,首先通过比例控制算法根据仪器或传感器反馈的偏差信号来产生一个控制信号。这个控制信号与输入信号进行比较,然后将差异值与比例增益相乘,得到一个修正量。这个修正量是实际控制器的输出信号,用于修正电机的运动。 接下来,前馈PID电机控制使用积分控制算法来考虑历史偏差。积分控制算法将历史偏差的累积加权并与积分增益相乘,以产生另一个修正量。这个修正量加上比例修正量,反映了电机受到的历史偏差的影响。 最后,前馈PID电机控制使用微分控制算法以考虑当前偏差的变化率。微分控制器根据偏差信号的斜率计算一个修正量,并乘以微分增益,以产生另一个修正量。这个修正量加上之前的修正量,反映了电机受到当前偏差变化的影响。 综合这三个控制算法的输出,前馈PID电机控制可以非常精确地调整电机的运动,使其达到所需的速度、位置或力矩。由于PID控制是通过不断调整控制信号来实现,因此可以对各种不稳定性进行修正,使电机在不同负载和环境条件下都能保持稳定和准确性能。因此,前馈PID电机控制是一种非常常用和高效的电机控制技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值