各位老师好。最近在对官方给出的CLARKE_MACRO(clarke1)的函数进行改写,出现问题,求助大家解答。
图中蓝色框为官方给出的Clarke变换头文件;黄色框为自己改写的Clarke文件;目的是想通过结构体指针将变量定义与函数分离;
电机运行过程中进行数学变换用的变量,仍采用官方给出的Clarke文件(clarke1)计算,自己改写的(Clarke_Actu)仅与之比对;
在Expression中将两者结果进行比对,可以观察到二者的输入A B相电流相同;但数学计算输出的Beta值与实际值相差太大;
后经验证可得只要在改写后的文件中做数学运算就会出现很大误差,还请大家指点一下。万分感谢。
Susan Yang:请问能否给出您自己改写的Clarke文件的完整代码?
您现在的图片内我无法看到完整的该函数,谢谢
各位老师好。最近在对官方给出的CLARKE_MACRO(clarke1)的函数进行改写,出现问题,求助大家解答。
图中蓝色框为官方给出的Clarke变换头文件;黄色框为自己改写的Clarke文件;目的是想通过结构体指针将变量定义与函数分离;
电机运行过程中进行数学变换用的变量,仍采用官方给出的Clarke文件(clarke1)计算,自己改写的(Clarke_Actu)仅与之比对;
在Expression中将两者结果进行比对,可以观察到二者的输入A B相电流相同;但数学计算输出的Beta值与实际值相差太大;
后经验证可得只要在改写后的文件中做数学运算就会出现很大误差,还请大家指点一下。万分感谢。
TieZhu Da:
回复 Susan Yang:
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.
祝工作顺利,心情愉快。