正弦波永磁同步电动机驱动控制程序Word格式文档下载.docx
《正弦波永磁同步电动机驱动控制程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《正弦波永磁同步电动机驱动控制程序Word格式文档下载.docx(15页珍藏版)》请在冰点文库上搜索。
unsignedintcanchannel=0;
//发送选项控制
unsignedlonga=0,b=0;
unsignedintspeedsci=0;
unsignedintspeedsd=0;
unsignedintspeedthousand=3;
//转速千位
unsignedintspeedhundred=3;
//转速百位
unsignedintspeeddecade=1;
//转速十位
unsignedintspeedlow=0;
unsignedintUdc=3500;
//转速个位
unsignedintUdcthousand=0;
//电压千位
unsignedintUdchundred=0;
//电压百位
unsignedintUdcdecade=4;
//电压十位
unsignedintUdclow=8;
//电压个位
unsignedintIdc=0;
unsignedintIdcthousand=0;
//电流千位
unsignedintIdchundred=0;
//电流百位
unsignedintIdcdecade=6;
//电流十位
unsignedintIdclow=0;
//电流个位
unsignedintscicount=0;
//向上位机发送数据周期控制
unsignedlongsetspeed=2500;
//上位机设定的速度
unsignedintscisend[6];
charReceivedChar=0;
charscired[6];
intp=0,q=0,sciflag=0,tenable=0;
inti,j,t;
//AD数字滤波
unsignedintonce=0;
longIa_now;
longIa_fore;
longIb_now;
longIb_fore;
longIc_now;
unsignedintad_count;
unsignedintdelay=0;
unsignedintS_Ia=0;
unsignedintia[18]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsignedintib[18]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
longIcb,Ica;
//CLARK变换两相静止坐标系电流
longIat,Ibt;
//AD数字滤波中间变量
longIa=0,Ib=0,Ic=0;
//滤波后的电流值
//转速环PI调节参数
intdirect=0;
//转向控制0为正转1为反转
longspeed_given=170;
//转速给定
longspeed_count=10;
//转速计算周期控制标志
longspeed_feed=0;
//转速反馈
longspeed_out2=0;
//上次转速调节器输出
longspeed_e1;
//当前转速偏差
longspeed_e2=0;
//上次转速偏差
//电流环PI调节参数
longId_given=0;
//Id给定
longIq_given=0;
//Iq给定转速调节器输出
longId_feed;
//d轴电流反馈值
longIq_feed;
//q轴电流反馈值
longId_e;
//d轴当前电流偏差
longId_e0=0;
//d轴上次电流偏差
longIq_e;
//q轴当前电流偏差
longIq_e0=0;
//q轴上次电流偏差
longUd=-150;
//d轴电流调节器输出
longUq=1000;
//q轴电流调节器输出
longUd0=0;
//上次d轴电流调节器输出
longUq0=0;
//上次q轴电流调节器输出
longUpa,Upb;
//UdUqPARKN变换值
longUa,Ub,Uc;
//SPWM调制电压
voidinit_SCI(void);
//串口初始化
voidscia_xmit(inta);
//串口发送函数
voidinit_eva(void);
//EVA初始化
voidinit_ADC(void);
//ADC初始化
voidcalcuindex(void);
//转子位置角计算
voidcalcuspeed(void);
//转速计算
voidspeed_PI(void);
//转速环PI调节
voidAD(void);
//AD采样及滤波
voidI_PI(void);
//电流环PI调节
voidCLARK(void);
//CLARK变换
voidCLARKN(void);
//CLARK逆变换
voidPARK(void);
//PARK变换
voidPARKN(void);
//PARK逆变换
interruptvoidt1pint_isr(void);
//定时器1中断服务程序
interruptvoidcap3_isr(void);
//捕获单元3中断服务程序
interruptvoidsci_isr(void);
signedintsintable[512]=//同SPWM
//Q15格式,将2PI弧度分成了512份
voidmain(void){//初始化系统
InitSysCtrl();
DINT;
IER=0x00;
//关xx
IFR=0x00;
//初始化PIExx
InitPieCtrl();
InitPieVectTable();
EALLOW;
//初始化PIExx矢量表
//GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6=1;
//GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7=1;
GpioMuxRegs.GPAMUX.all=0x073F;
//EVAPWM1-6pinsGpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0=0;
//继电器开关
GpioMuxRegs.GPBDIR.bit.GPIOB0=1;
GpioMuxRegs.GPBMUX.bit.C4TRIP_GPIOB13=0;
//LED控制
GpioMuxRegs.GPBDIR.bit.GPIOB13=1;
GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=1;
GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=1;
EDIS;
PieVectTable.T1UFINT=&
t1pint_isr;
PieVectTable.CAPINT3=&
cap3_isr;
PieVectTable.RXAINT=&
sci_isr;
EvaRegs.EVAIFR
A.all=0XFF;
EvaRegs.EVAIMR
A.all=0X0200;
IER|=M_INT2;
IER|=M_INT3;
IER|=M_INT9;
PieCtrlRegs.PIER
2.bit.INTx6=1;
//定时器中断
//PieCtrlRegs.PIER
3.bit.INTx7=1;
9.bit.INTx1=1;
GpioDataRegs.GPBDAT.bit.GPIOB0=0;
//开xx
init_SCI();
init_eva();
//初始化EVA
init_ADC();
//初始化ADC
if(direct==0)
speed_given=speed_given;
//正反转速度设定
else
speed_given=-speed_given;
EINT;
ERTM;
for(;
;
){if((scienable==1)&
&
(tenable==1)==1){//speedsci=setspeed;
tenable=0;
speedthousand=speedsci/1000;
speedhundred=speedsci/100%10;
speeddecade=speedsci/10%10;
speedlow=speedsci%10;
scisend[0]='
s'
scisend[1]=0x30+speedthousand;
//speedthousand
scisend[2]=0x30+speedhundred;
//speedhundred
scisend[3]=0x30+speeddecade;
//speeddecade
scisend[4]=0x30+speedlow;
//speedlow
scisend[5]='
p'
while
(1){if(SciaRegs.SCICTL
2.bit.TXRDY==1){scia_xmit(scisend[p]);
p++;
}if(p>
5){p=0;
break;
}}}}}voidinit_SCI(){//Note:
ClockswereturnedontotheSCIAperipheral
//intheInitSysCtrl()function
SciaRegs.SCICCR.all=0x0007;
//1stopbit,Noloopback
//Noparity,8charbits,
//asyncmode,idle-lineprotocol
SciaRegs.SCICTL
1.all=0x0003;
//enableTX,RX,internalSCICLK,SciaRegs.SCICTL
2.all=0x0003;
2.bit.TXINTENA=1;
2.bit.RXBKINTENA=1;
//DisableRXERR,SLEEP,TXWAKE
SciaRegs.SCIHBAUD=0x0001;
SciaRegs.SCILBAUD=0x00E7;
}voidscia_xmit(inta){SciaRegs.SCITXBUF=a;
}voidinit_eva(){EvaRegs.T1PR=7500;
//Timer1period
EvaRegs.T1CNT=0x00;
//Timer1counter
EvaRegs.ACTR
A.all=0x0333;
//0x033D;
EvaRegs.DBTCON
A.all=0x0FFC;
//
6.4μs的死区
EvaRegs.COMCON
A.all=0x8207;
A.bit.ACTRLD=2;
EvaRegs.GPTCON
A.all=0X0080;
EvaRegs.T1CON.all=0x0842;
//连续增减记数模式,定时器时钟1分频EvaRegs.T2PR=99;
//光电编码器2500线
EvaRegs.T2CON.all=0x1830;
EvaRegs.T2CNT=0;
EvaRegs.CAPCON
A.all=0X1404;
//使能QEP}voidinit_ADC(void){AdcRegs.ADCTRL
1.all=0X1240;
/AD内核时钟预定标
18.75MHZ,采样窗口3,双排序模式AdcRegs.ADCTRL
1.bit.CONT_RUN=1;
//连续运行
AdcRegs.ADCTRL
3.bit.ADCCLKPS=3;
//AD内核时钟
3.125MHz
2.all=0X4100;
//事件管理器A启动SEQ1
3.bit.ADCBGRFDN=3;
for(i=0;
i<
1000;
i++)SciaRegs.SCICCR.bit.LOOPBKENA=0;
//disableloopback
1.all=0x0023;
//RelinquishSCIfromReset
{;
}
3.bit.ADCPWDN=1;
500;
i++)
AdcRegs.ADCMAXCONV.all=0x0001;
//Setup2conv'
sonSEQ1
AdcRegs.ADCCHSELSEQ
1.bit.CONV00=0;
//SetupADCINA0as1stSEQ1conv.AdcRegs.ADCCHSELSEQ
1.bit.CONV01=1;
//SetupADCINA1as2ndSEQ1conv.}
//*******************************************************************////根据L正反转4种不同情况进行转速计算所得转速均为正值
//*******************************************************************//voidcalcuspeed(void){if((L>
=0)&
(L<
2000))
speed_feed=L*3;
if((L<
0)&
-2000))
speed_feed=(100+L)*3;
if((L>
(L>
speed_feed=(100-L)*3;
=-2000))
speed_feed=(-L)*3;
if(speed_feed>
0)
speedsci=speed_feed;
speedsci=-speed_feed;
}voidspeed_PI(void){speed_e1=speed_given-speed_feed;
Iq_given=speed_out2+Kpspeed*(speed_e1-speed_e2)+Kispeed*speed_e1;
if(Iq_given>
500)
Iq_given=500;
if(Iq_given<
-500)
Iq_given=-500;
speed_e2=speed_e1;
speed_out2=Iq_given;
}//*****************************************************************////AD采样及滤波连续采样18次,舍弃最大值和最小值剩下的再取平均值
//*****************************************************************//voidAD(void){for(ad_count=0;
ad_count<
=17;
ad_count++){for(delay=0;
delay<
=10;
delay++)
{}
ia[ad_count]=AdcRegs.ADCRESULT0>
>
4;
ib[ad_count]=AdcRegs.ADCRESULT1>
}//testtime=0;
for(j=1;
j<
j++)
=17-j;
i++){if(ia[i]>
ia[i+1])
{t=ia[i];
ia[i]=ia[i+1];
ia[i+1]=t;
if(ib[i]>
ib[i+1])
{t=ib[i];
ib[i]=ib[i+1];
ib[i+1]=t;
}}EvaRegs.EVAIFR
A.all=0XFF;
Iat=(ia[5]+ia[6]+ia[7]+ia[8]+ia[9]+ia[10]+ia[11]+ia[12])>
3;
Ibt=(ib[5]+ib[6]+ib[7]+ib[8]+ib[9]+ib[10]+ib[11]+ib[12])>
Ia=Iat-2110;
Ib=Ibt-2110;
if(once==0){Ia_fore=Ia;
Ib_fore=Ib;
once=1;
}Ia_now=(Delta*Ia+(8-Delta)*Ia_fore)>
Ib_now=(Delta*Ib+(8-Delta)*Ib_fore)>
Ia_fore=Ia_now;
Ib_fore=Ib_now;
Ic_now=-(Ia_now+Ib_now);
}//******************************************************************////UdUq限幅值限定了最高转速
//******************************************************************//voidI_PI(void){Id_e=Id_given-Id_feed;
//2*Id_feed
Ud=Ud0+Kpd*(Id_e-Id_e0)+Kid*Id_e;
Iq_e=Iq_given-Iq_feed;
//2*Iq_feed
Uq=Uq0+Kpq*(Iq_e-Iq_e0)+Kiq*Iq_e;
if(Ud>
Ud=500;
if(Ud<
Ud=-500;
if(Uq>
2500)
Uq=2500;
if(Uq<
-2500)
Uq=-2500;
Ud0=Ud;
Uq0=Uq;
Id_e0=Id_e;
Iq_e0=Iq_e;
}voidCLARK(void){Ica=(5017*Ia_now)>
12;
Icb=((2896*Ia_now)>
12)+((5793*Ic_now)>
12);
}voidCLARKN(void){Ua=(Upa*3344)>
Ub=((-Upa*1672)>
12)+((Upb*2896)>
Uc=-(Ua+Ub);
if(Ua>
7500)
Ua=7500;
if(Ua<
-7500)
Ua=-7500;
if(Ub>
Ub=7500;
if(Ub<
Ub=-7500;
if(Uc>
Uc=7500;
if(Uc<
Uc=-7500;
}voidPARK(void){Id_feed=((Ica*sintable[index2])>
15)+((Icb*sintable[index1])>
15);
Iq_feed=-((Ica*sintable[index1])>
15)+((Icb*sintable[index2])>
voidPARKN(void){Upa=((Ud*sintable[index2])>
15)-((Uq*sintable[index1])>
Upb=((Ud*sintable[index1])>
15)+((Uq*sintable[index2])>
//***********************************************************************////转子位置角计算由当前T2计数值计算
//***********************************************************************//voidcalcuindex(void){index1=(210*(long)L2)>
//(210*(long)L2)>
10;
两对极电机应改为105;
i++)//一对极(210*(long)L2)>
{if(index1>
=512)
index1=index1-512;
}if(index1<
=384)
index2=index1+128;
index2=index1-384;
}//=====================================================================//T1下溢中断子程序
//=