
FOC核心函数
- SVPWM算法



- 逆变电路三相导通有8种开关量模式因此,任意电压矢量均可以由最近的两个基本电压矢量合成,从而获得近似圆形的定子磁链
- SVPWM理论基础,平均值等效原理
- 基于坐标系:α-β坐标系
SVPWM实现步骤- 计算参考电压矢量
- 判断参考电压矢量Vref所在扇区
- 计算相邻电压矢量和零矢量作用时间
- 计算各相桥臂功率器件的开关时间
画圈子里面的代码实现
-
SVPWM模块是电机控制系统实现的核心内容,通过uα和uβ来计算得出6路PWM控制信号,
-
下面是park逆变换的计算方法

#include <tim.h>
#include <math.h>/*正余轩计算*/
#define PWM_Period 100 /*tim定时器*/
#define _PI 3.14159265359
#define _PI_2 1.57079632679
#define _PI_3 1.0471975512
#define _2PI 6.28318530718
#define _3PI_2 4.71238898038
#define _PI_6 0.52359877559
#define _SQRT3 1.73205080757
/******************************************/
float voltage_power_supply;/*直流的母线电压24v*/
float sensor_offset=0;
float zero_electric_angle=0;
/******************************************/
//将角度规定在一个范围内
float _normalizeAngle(float angle)
{
float a=fmod(angle,_2PI);/*ȡģ*/
return a>=0 ? a:(a + _2PI);
}
/******************************************/
//FOC核心函数,输入Ud、Uq和电角度,输出PWM
void setPhaseVoltage(float Uq,float Ud,float angle_el)
{
float Uref;/*²Î¿¼µçѹ*/
float U_alpha,U_beta;
uint32_t sector;
float T0,T1,T2;
float Ta,Tb,Tc;
float V1,V2,V3;
int A,B,C;/*计算扇区的中间变量,布尔类型*/
int N;/*判断扇区的变量*/
//(1)计算Vref
angle_el=_normalizeAngle(angle_el+_PI_2);/*½«½Ç¶È¶¨Ò»¸ö·¶Î§ÄÚ*/
U_alpha=Ud*cos(angle_el)-Uq*sin(angle_el);//·´park±ä»»==½«Ud/Uqת³ÉU¦Á/U¦ÂµÄ²Î¿¼µçѹ
U_beta=Ud*sin(angle_el)+Uq*cos(angle_el);
Uref=_sqrt(U_alpha*U_alpha+U_beta*U_beta)/voltage_power_supply;
if(Uref>0.577)Uref=0.577;/*Áù±ßÐεÄÄÚÇÐÔ²£¨SVPWM×î´ó²»Ê§ÕæÐýתµçѹʸÁ¿¸³Öµ ¸ùºÅ3 / 3*/
if(Uref<-0.577)Uref=-0.577;
//(2)判断参考电压的扇区
sector=(angle_el / _PI_3)+1;
//(3)计算相邻电压矢量和零矢量作用的时间
T1=_SQRT3*sin(sector*_PI_3-angle_el)*Uref;/*¼ÆËãÁ½¸öÏàÁÚµçѹ×÷ÓÃʱ¼ä*/
T2=_SQRT3*sin(angle_el-(sector-1.0)*_PI_3)*Uref;
T0=1-T1-T2;/*ÁãʸÁ¿×÷ÓÃʱ¼ä*/
//(4)计算各相桥臂开关时间
switch(sector){
case 1:
Ta=T1+T2+T0/2;
Tb=T2+T0/2;
Tc=T0/2;
break;
case 2:
Ta=T1+T0/2;
Tb=T1+T2+T0/2;
Tc=T0/2;
break;
case 3:
Ta=T0/2;
Tb=T1+T2+T0/2;
Tc=T2+T0/2;
break;
case 4:
Ta=T0/2;
Tb=T1+T0/2;
Tc=T1+T2+T0/2;
break;
case 5:
Ta=T2+T0/2;
Tb=T0/2;
Tc=T1+T2+T0/2;
break;
case 6:
Ta=T1+T2+T0/2;
Tb=T0/2;
Tc=T1+T0/2;
break;
default://possible error state
Ta=0;
Tb=0;
Tc=0;
}
//PWM信号输出,占空比配置
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,Ta*PWM_Period);//AÏà
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,Ta*PWM_Period);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3,Ta*PWM_Period);
}
本文详细阐述了SVPWM算法的原理,包括如何利用α-β坐标系进行计算,以及逆变电路中如何通过8种开关模式合成电压矢量。重点介绍了FOC核心函数的实现步骤,涉及角度归一化、参考电压矢量确定、扇区划分、开关时间计算,并给出了C代码实例。
1174

被折叠的 条评论
为什么被折叠?



