代码
Axis_transform.c
#include "Axis_transform.h"//Alpha = Iu//Beta = (√3/3*2^15*Iu + 2*√3/3*2^15*Iw)/(2^15)// 此坐标变化是IQ15格式 计算系数 小数点的浮点数据*2^15//克拉克变化输入时三相电流 电流传感器采集-4095到4096的IQ12格式void CLARKE_Cale(p_CLARKE pV){ pV->Alpha = pV->As; pV->Beta = _IQmpy((pV->As +_IQmpy2(pV->Bs)),18918); // 1/sqrt(3) 0.57735*2…^15=0.57735*32768 _IQ(0.57735026918963)}// Parking Id,Iq// Id = Ialpha*cos+Ibeta*sin// Iq = Ibeta*cos-Ialpha*sin// 卡拉卡是等幅值变化所以 输入 Alpha和Beta是IQ12格式输出还是IQ12 从-4095到4096//Sine和Cosine表格90度256个 参数是-1到1的IQ15 -32767到32768void PARK_Cale(p_PARK pV){ pV->Ds = _IQmpy(pV->Alpha,pV->Cosine) + _IQmpy(pV->Beta,pV->Sine); pV->Qs = _IQmpy(pV->Beta,pV->Cosine) - _IQmpy(pV->Alpha,pV->Sine);}//IParking Ia,Ib// Ialpha = Id*cos-Iq*sin// Ibeta = Iq*cos+Id*sinvoid IPARK_Cale(p_IPARK pV) { pV->Alpha = _IQmpy(pV->Ds,pV->Cosine) - _IQmpy( pV->Qs,pV->Sine); pV->Beta = _IQmpy(pV->Qs,pV->Cosine) + _IQmpy(pV->Ds,pV->Sine);}
Axis_transform.h
#ifndef Axis_transform_H#define Axis_transform_H#include "stm32f10x.h"#include "IQ_math.h"typedef struct { int32_t As; // 三相电流A int32_t Bs; // 三相电流B int32_t Cs; // 三相电流C int32_t Alpha; // 二相静止坐标系 Alpha 轴 int32_t Beta; // 二相静止坐标系 Beta 轴 } CLARKE ,*p_CLARKE ;#define CLARKE_DEFAULTS {0,0,0,0,0} // 初始化参数typedef struct { int32_t Alpha; // 二相静止坐标系 Alpha 轴 int32_t Beta; // 二相静止坐标系 Beta 轴 int32_t Angle; // 电机磁极位置角度0---65536即是0---360度 int32_t Ds; // 电机二相旋转坐标系下的d轴电流 int32_t Qs; // 电机二相旋转坐标系下的q轴电流 int32_t Sine; // 正弦参数,-32768---32767 -1到1 int32_t Cosine; // 余弦参数,-32768---32767 -1到1 } PARK , *p_PARK ;#define PARK_DEFAULTS {0,0,0,0,0,0,0} // 初始化参数typedef struct { int32_t Alpha; // 二相静止坐标系 Alpha 轴 int32_t Beta; // 二相静止坐标系 Beta 轴 int32_t Angle; // 电机磁极位置角度0---65536即是0---360度 int32_t Ds; // 电机二相旋转坐标系下的d轴电流 int32_t Qs; // 电机二相旋转坐标系下的q轴电流 int32_t Sine; // 正弦参数,-32768---32767 -1到1 int32_t Cosine; // 余弦参数,-32768---32767 -1到1 } IPARK , *p_IPARK;#define IPARK_DEFAULTS {0,0,0,0,0,0,0} // 初始化参数void CLARKE_Cale(p_CLARKE pV); // 三相到二相变换 克拉克变换void PARK_Cale(p_PARK pV) ; // 二相到二相变换 怕克变换void IPARK_Cale(p_IPARK pV) ; // 二相到二相变换反怕克变换#endif /* Axis_transform*/