|
楼主 |
发表于 2018-10-19 13:11:16
|
显示全部楼层
你可以先研究一下AN1078_cn.pdf
这里没有6步换相,用的是正弦波。
引用电流模式的代码:
//------------------------------反电势角度低通
err=(S8)((Mot_EmfDeg-emfdeglp)&0xff);
emfdeglp=(emfdeglp+err/10)&0xff;
//------------------------------定子相电流变换到转子,得到Id,Iq
ClarkeTrans(Mot_IU,Mot_IV,&Ia,&Ib);
ParkTrans(Ia,Ib,emfdeglp,&Id,&Iq);
//------------------------------根据Iq\Id与设定电流之差去调整Vq\Vd
err=Mot_Iqref-Iq;
Vq+=err/5;//比例控制
err=Mot_Idref-Id;
Vd+=err/5;//比例控制
//------------------------------Vq\Vd变换到相电压
//注意Vq,Vd缩小100倍
ParkTrans(Vd/100,Vq/100,-emfdeglp,&Va,&Vb);//Park逆变换只需将角度取负
ClarkeInvTrans(Va,Vb,&Vu,&Vv,&Vw);
//可以三路同时减去最低那一相电压,减小开关损耗
TIM3->CCR2=Vu+128;//三相电压
TIM3->CCR3=Vv+128;
TIM3->CCR4=Vw+128;
引用电压模式精简后的代码:
//------------------------------反电势角度低通
Mot_EmfDeg=myatan(emfulp,emfvlp);
err=(S8)((Mot_EmfDeg-emfdeglp)&0xff);
emfdeglp=(emfdeglp+err/10)&0xff;
Mot_Vp=(emfdeglp+err_v)&0xff;//角度偏移
p=Mot_Vp;
Vu=(U16)Vpwm*costab[p]/127;
p-=256/3;//360/3=120度
Vv=(U16)Vpwm*costab[p]/127;
Vw=0-Vu-Vv;
//可以三路同时减去最低那一相电压,减小开关损耗
TIM3->CCR2=Vu+128;//三相电压
TIM3->CCR3=Vv+128;
TIM3->CCR4=Vw+128; |
|