This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0G1507:使用 MSPM0G1507 进行 PI 控制

Guru**** 2378650 points
Other Parts Discussed in Thread: MSPM0G1507
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1527403/mspm0g1507-pi-control-using-mspm0g1507

部件号:MSPM0G1507

工具/软件:

你(们)好  

目前、我正在使用 采用 MSP430 微控制器的 PMP7647_RevC 设计解决方案。 我计划迁移到 MSPM0G1507、  

我需要有关所面临问题(附加了电流波形)的帮助

使用计时器、PI 控制以非常慢的速度在 5ms 运行

我正在尝试使用负载部分的 PI 控制。

此致、

Yogesh

/* Ki = 0.1, 0.1 x 2^31 = 2,147,483,648 = 0x0CCCCCCC   (0.001) 0x0020C49B*/
#define Ki (0x00CCCCCC)
/* Kp = 0.1, 0.3 x 2^31 = 644,245,094 = 0x2666 6666 */
#define Kp (0x00CCCCCC)



const DL_MathACL_operationConfig gMpyConfig = {
    .opType      = DL_MATHACL_OP_TYPE_MPY_32,
    .opSign      = DL_MATHACL_OPSIGN_SIGNED,
    .iterations  = 1,
    .scaleFactor = 0,
    .qType       = DL_MATHACL_Q_TYPE_Q31};

int error = Ref_Load_Current-Load_Current;
errorQ31 = (error << (31-12))-1;;
DL_MathACL_startMpyOperation(MATHACL, &gMpyConfig, Ki, errorQ31);
DL_MathACL_waitForOperation(MATHACL);
integral = integral + DL_MathACL_getResultOne(MATHACL);
if(integral>=0x50000000){
    integral = 0x50000000;
}
else if(integral < 0){
    integral =0;
}
DL_MathACL_startMpyOperation(MATHACL, &gMpyConfig, Kp, errorQ31);
DL_MathACL_waitForOperation(MATHACL);
Proportional = DL_MathACL_getResultOne(MATHACL);
output = integral + Proportional ;
if(output>=0x50000000){
    output = 0x50000000;
}
else if(output < 0){
    output = 0;
}
DL_MathACL_startMpyOperation(MATHACL, &gMpyConfig, 320, output);
DL_MathACL_waitForOperation(MATHACL);
outputPI = DL_MathACL_getResultOne(MATHACL);
Duty_Boost = outputPI;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的  Yogesh:

    在这里的问题是什么,我看到你使用 mathacl 进行计算?

    我建议使用 IQMath 库来简化调用 MATHACL 的方法:

    https://dev.ti.com/tirex/explore/node?node=A__ADcdNs.Hftd6j7Ux7SGqLw__MSPM0-SDK__a3PaaoK__LATEST&placeholder=true 

    B.R.

    Sal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sal:

    感谢您的更新。 您有任何 PI 控制代码示例吗?

    此致、

    Yogesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Yogesh:

    以下是我用来处理 SDK 电机控制工程和 IQmath 库的内容:

    int32_t error   = _IQ27(0.0f);
    int32_t kp      = _IQ27(0.2f);
    int32_t ki      = _IQ27(0.06f);
    int32_t Up      = _IQ27(0.0f);
    int32_t Ui      = _IQ27(0.1f);
    int32_t Uout    = _IQ27(0.0f);
    int32_t Umax    = _IQ27(0.4f);
    int32_t Umin    = _IQ27(0.1f);
    
    void runSpeedLoopPI(void){
    
        if(pUserStatusRegs->motorState == MOTOR_CLOSE_LOOP_ALIGNED){
    
            error = gUserSpeedCommand - gEstSpeedFilter;
    
            Up = _IQmpy(kp,error);
    
            if(Up<Umax)Ui+=_IQmpy(ki,Up);
            if(Ui>Umax) {
                Ui = Umax;
            } else if(Ui<Umin) {
                Ui = Umin;
            }
    
            Uout = Up+Ui;
            if(Uout>Umax) {
                Uout = Umax;
            } else if(Uout<Umin) {
                Uout = Umin;
            }
    
            pUserCtrlRegs->speedCtrl.w = (Uout>>(27-15));
        }
    }

    通常为 Umin=-Umax 或 0、此代码用于特殊目标。

    B.R.

    Sal