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.

[参考译文] MSPM0G3507:使用 MSPM0G3507的简单 PI 补偿代码

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1491033/mspm0g3507-simple-pi-compensation-code-using-mspm0g3507

器件型号:MSPM0G3507

工具/软件:

您好、

我正在使用 MATHACL 或 IQ 库寻找 PI 补偿代码?

此致、

Yogesh

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

    你好 Yogesh!

    您是按照所示指的 PI P 正常- I 太棒了?

    马修  

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

    是的、马修。

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

    您好、Matthew、

    我尝试使用"mathacl_mpy_div_op_LP_MSPM0G3507_nortos_ticlang"。 需要您的帮助才能更好地理解。  

    我正在计划进行某种 PI 仿真、以检查计算 是否正确。

    设定点为3500、ADC 测量值为 3,400,3603600345 0 和3550。 第一次迭代结果如下所示:
    错误= 3500-3400=100
    error31 =(100 <<(31-12))-1 = 52428799 (0x031FFFFF)
    Integrate = 0+(0x0CCCCCCCCC*0x031FFFFF >>>31)= 5242879 (0x004FFFFF)
    比例= 0x2666666*0x031FFFFF >>31 = 15728639 (0x00EFFFFF)
    输出=积分+比例= 20971518 (0x013FFFFE)
    outputPI = 0x013FFFFE*300>>31 = 2

    第一次迭代结果符合预期。 第二次迭代结果如下所示:  
    错误= 3500-3600=-100
    error31 =(-100 <<(31-12))-1 =-52428801 (0xFCDFFFFF)
    Integrate = 5242879  +(0x0CCCCCCCCC*0xFCDFFFFF>>>31)= 429496726 (0x19999996) --需要解释(理想为零)
    比例 = 0x266666*0xFCDFFFFF>>>31 = 1272761547 (0x4BDCCCCB) --需要解释
    输出=积分+比例= 150328553 (0x59999999) --钳位到更高的值
    outputPI = 0x59999999*300>31=209 --这是错误的

    #include "ti_msp_dl_config.h"
    
    /* Ki = 0.1, 0.1 x 2^31 = 2,147,483,648 = 0x0CCC CCCC */
    #define Ki (0x0CCCCCCC)
    /* Kp = 0.3, 0.3 x 2^31 = 644,245,094 = 0x2666 6666 */
    #define Kp (0x26666666)
    #define setpoint  3500
    const DL_MathACL_operationConfig gMpyConfig = {
        .opType      = DL_MATHACL_OP_TYPE_MPY_32,
        .opSign      = DL_MATHACL_OPSIGN_UNSIGNED,
        .iterations  = 1,
        .scaleFactor = 0,
        .qType       = DL_MATHACL_Q_TYPE_Q31};
    
    float res=0.0;
    volatile int32_t outputPI=0,errorQ31=0,integral = 0,Proportional=0,output=0;
    int array[4]={3400 ,3600,  3450 , 3550}, measured_value=0,error=0;
    
    int main(void)
    {
        SYSCFG_DL_init();
        DL_TimerA_startCounter(PWM_0_INST);
        int i = 0;
    
        while (1) {
            measured_value=array[i];
            error = setpoint-measured_value;
            errorQ31 = (error << (31-12))-1;
            DL_MathACL_startMpyOperation(MATHACL, &gMpyConfig, Ki, errorQ31);
            DL_MathACL_waitForOperation(MATHACL);
            integral = integral + DL_MathACL_getResultOne(MATHACL);
            if(integral>=0x59999999){
                integral = 0x59999999;
            }
            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>=0x59999999){
                output = 0x59999999;
            }
            else if(output < 0){
                output = 0;
            }
            DL_MathACL_startMpyOperation(MATHACL, &gMpyConfig, 300, output);
            DL_MathACL_waitForOperation(MATHACL);
            outputPI = DL_MathACL_getResultOne(MATHACL);
            DL_TimerA_setCaptureCompareValue(PWM_0_INST, outputPI, DL_TIMER_CC_0_INDEX);
            i++;
            if(i>3){
                i=0;
            }
            //res = _IQ30toF(output>>1);
        }
    }

    请仔细查看、如果有任何更正、请告诉我。  

    此致、

    Yogesh

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

    你好 Yogesh!

    在计算积分时、您如何考虑时间?

    马修

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

    您好、Matthew、

    您有任何示例代码吗。  

    此致、

    Yogesh

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

    你好 Yogesh!

    我们没有 PI 补偿器的示例;但是、我在这里的建议是从您的应用中删除 MATHACL、并以最简单的形式测试您的算法。 可以在算法正常工作后实现 MATHACL。  

    马修  

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

    您好、Matthew、

    请告诉我代码中所需的修改。

    我不会将连续时域转换为离散域、 正常 PI 计算仅限我确定目标。

    此致、

    Yogesh

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

    尊敬的 Yegoesh:

    PI 只是针对输入数据的乘法、加法和判断运算。

    您可以 参考 我们的 IQMath 库来玩 mathacl。 它在 API 中集成了 MATHACL、因此用户只需要调用 API 并执行乘法操作。

    有一个与此相关的 SDK 演示:

    TI\mspm0_sdk_2_04_00_06\examples\nortos\LP_MSPM0G3507\IQmathacl_ops_test

    您可以在 SDK 路径中找到它的源代码和标头:TI\mspm0_sdk_2_04_00_06\source\ti\IQMath

    以下是 供您参考的乘法代码 jsut:

    /**
     * @brief Multiply two values of IQN type, using MathACL.
     *
     * @param iqNInput1       IQN type value input to be multiplied.
     * @param iqNInput2       IQN type value input to be multiplied.
     * @param q_value         IQ format.
     *
     * @return                IQN type result of the multiplication.
     */
    __STATIC_INLINE int_fast32_t __IQNmpy(int_fast32_t iqNInput1, int_fast32_t iqNInput2, const int8_t q_value)
    {
        /* write control */
        MATHACL->CTL = 6 | (q_value<<8) | (1 << 5);
        /* write operands to HWA */
        MATHACL->OP2 = iqNInput2;
        /* write trigger word last */
        MATHACL->OP1 = iqNInput1;
        /* read iqmpy product */
        return MATHACL->RES1;
    }

    B.R.

    Sal

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

    尊敬的 Sal Ye:

    很抱歉延迟的回复。将检查并更新 IQ 数学

    此致、

    Yogesh