根据论坛中的帖子写的SVPWM的C语言代码,亲测可用
static void SVPWM_3ShuntCalcDutyCycles(void){
u8a,b,c;
hElectrical_AngleCnt += Pwm_PutAdd_UpDT;
if(hElectrical_AngleCnt > 10922) hElectrical_AngleCnt =10922;//60度
Electrical_Angle = hElectrical_Angle - bSign*hElectrical_AngleCnt + Turn_Angle_Error+Svpwm_Angle_Error;
Pwm_AngleA1 = (signed short)(Electrical_Angle); //求出当前电角度
TIM1->CCER=0x1ddd;
if(Motor_Pwm_Aim > 2180) Motor_Pwm_Aim = 2180; // 32768/15
Vector_Components = Trig_Functions(Pwm_AngleA1);
Valpha_tmp1 =Motor_Pwm_Aim*15 * Vector_Components.hCos/32768; //
Valpha_1 = (s16)(Valpha_tmp1);
Vbeta_tmp1 =Motor_Pwm_Aim*15 * Vector_Components.hSin/32768; // Uout*Sin电角度
Vbeta_1 = (s16)(Vbeta_tmp1);
UAlpha = Valpha_1 * T_SQRT3 ; //11200*1.73205
UBeta= Vbeta_1 * T; //U百塔*4*Tpwm(扩大4倍)
X= UBeta; //(X=0)Ubeta=0,就是V1(100),V4(011)所在的这条线, (0° /180°)
Y= ( UAlpha+ UBeta)/2;//(Y=0)Ualfa+Ubeta=0,就是V2(110),V5(001)所在的这条线 (60° /240°)
Z= (-UAlpha+ UBeta)/2;//(Z=0)Ualfa-Ubeta=0,就是V3(010),V6(101)所在的这条线(120°/300°)
Va = UBeta; //(clarke逆变换)
Vb = ( UAlpha- UBeta)/2;
Vc = (-UAlpha- UBeta)/2;
if(Va>=0) {a=1;} else a=0;
if(Vb>=0) {b=1;} else b=0;
if(Vc>=0) {c=1;} else c=0;
Sector=a+2*b+4*c;
switch(Sector) //
{
case SECTOR_3: //扇区1
hTimePhA = (T/8) + ((( T + Z - X)/2)/131072); //32768*4
hTimePhB = hTimePhA - Z/131072;
hTimePhC = hTimePhB + X/131072;
break;
case SECTOR_1: //扇区2
hTimePhB = (T/8) + ((( T- Z - Y)/2)/131072);
hTimePhA = hTimePhB + Z/131072;
hTimePhC = hTimePhA + Y/131072;
break;
case SECTOR_5://扇区3
hTimePhB = (T/8) + (((T - X + Y)/2)/131072);
hTimePhC = hTimePhB + X/131072;
hTimePhA = hTimePhC - Y/131072;
break;
case SECTOR_4://扇区4
hTimePhC = (T/8) + (((T + X - Z)/2)/131072);
hTimePhB = hTimePhC - X/131072;
hTimePhA = hTimePhB + Z/131072;
break;
case SECTOR_6://扇区5
hTimePhC = (T/8) + (((T + Y + Z)/2)/131072);
hTimePhA = hTimePhC - Y/131072;
hTimePhB = hTimePhA - Z/131072;
break;
case SECTOR_2://扇区6
hTimePhA = (T/8) + (((T - Y + X)/2)/131072);
hTimePhC = hTimePhA + Y/131072;
hTimePhB = hTimePhC - X/131072;
break;
default:
break;
}
本人使用在无刷电机控制中,电流0.6A左右,转动正常,但是加负载后有点抖动的感觉,正在研究中,,,, https://bbs.simol.cn/forum.php?mod=viewthread&tid=130960&highlight=svpwm 好厉害,继续看看看看 楼主大哥,你在干啥,这不是ST的代码吗? 也不完全是,是把ST的修改过的,ST的SVPWM一团糟,首先T/2部分与文档对应不上,然后扇区的判断也奇怪,我后来自己改了,跟楼主这个很类似 Jonny0811 发表于 2017-10-20 13:27
也不完全是,是把ST的修改过的,ST的SVPWM一团糟,首先T/2部分与文档对应不上,然后扇区的判断也奇怪,我后 ...
你好!!!我不太理解 里面 算UBeta的时候为啥 要乘以4了??
能接讲讲么??谢谢!!! 楼主还在么,有完整的程序给参考一下么 Owen1234 发表于 2018-7-3 09:58
**** 作者被禁止或删除 内容自动屏蔽 ****
楼主估计还活着,这点毋庸置疑
页:
[1]