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.

28335 Clarke函数改写错误

各位老师好。最近在对官方给出的CLARKE_MACRO(clarke1)的函数进行改写,出现问题,求助大家解答。

图中蓝色框为官方给出的Clarke变换头文件;黄色框为自己改写的Clarke文件;目的是想通过结构体指针将变量定义与函数分离;

电机运行过程中进行数学变换用的变量,仍采用官方给出的Clarke文件(clarke1)计算,自己改写的(Clarke_Actu)仅与之比对;

在Expression中将两者结果进行比对,可以观察到二者的输入A B相电流相同;但数学计算输出的Beta值与实际值相差太大;

后经验证可得只要在改写后的文件中做数学运算就会出现很大误差,还请大家指点一下。万分感谢。

  • 请问能否给出您自己改写的Clarke文件的完整代码?

    您现在的图片内我无法看到完整的该函数,谢谢
  • Susan你好,很高兴收到回复,蟹蟹。

    改写的Clarke头文件.h如下:(改写)
    #ifndef INC_PMSM_CLARK_H_
    #define INC_PMSM_CLARK_H_
    #include "IQmathLib.h"
    #include <math.h>

    typedef struct{ _iq As;
    _iq Bs;
    _iq Cs;
    _iq Alpha;
    _iq Beta;
    } CLARKE_TYPE;

    #define Clarke_Init { 0, \
    0, \
    0, \
    0, \
    0, \
    }
    #endif /* INC_PMSM_CLARK_H_ */

    改写的源文件.c如下:(改写)
    #include "IQmathLib.h"
    #include "PMSM_Clark.h"

    void PMSM_Clarke(CLARKE_TYPE *Clarke_Temp)
    {
    Clarke_Temp->Alpha = Clarke_Temp->As;
    Clarke_Temp->Beta = _IQmpy((Clarke_Temp->As +_IQmpy2(Clarke_Temp->Bs)),_IQ(0.57735026918963));
    }

    变量初始化:
    CLARKE clarke1 = CLARKE_DEFAULTS;(官方)
    CLARKE_TYPE Clarke_Actu = Clarke_Init;(改写)

    在MainISR中调用如下:

    clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; // Phase A curr.(官方)
    clarke1.Bs=((AdcMirror.ADCRESULT2)*0.00024414-offsetB)*2*0.909; // Phase B curr.(官方)

    Clarke_Actu.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909;(改写)
    Clarke_Actu.Bs=((AdcMirror.ADCRESULT2)*0.00024414-offsetB)*2*0.909;(改写)

    CLARKE_MACRO(clarke1)(官方)
    PMSM_Clarke(&Clarke_Actu);(改写)

    电机驱动采用官方给出的clarke.h文件(CLARKE_MACRO),自己改写部分不用于电机运行控制,仅与官方结果做对比;

    对比结果出现了上述图片中的问题:

    利用改写后的函数PMSM_Clarke()做数学计算输出的Beta值与实际值相差太大;后经验证可得只要在改写后的文件PMSM_Clarke()中做数学运算就会出现很大误差。

    希望可以得到回复;

    蟹蟹 Susan.

    祝工作顺利,心情愉快。