DSP无刷直流电动机驱动控制程序Word格式文档下载.docx
《DSP无刷直流电动机驱动控制程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《DSP无刷直流电动机驱动控制程序Word格式文档下载.docx(48页珍藏版)》请在冰点文库上搜索。
//9转速过零标志
Uint16Mode:
3;
//10-12保留
Uint16Dshow:
//13保留
Uint16Sign:
//14当前转向标志
};
unionFlag_Reg{
Uint16all;
structFlag_Bitsbit;
}FlagRegs;
//全局变量
//串口通信变量
unsignedintSci_Rx[8]={0,0,0,0,0,0,0,0};
//接收数据数组
unsignedintSci_Tx[8]={0,0,0,0,0,0,0,0};
//发送数据数组
charT_pointer=0;
//发送数据数组指针
charR_pointer=0;
//接收数据数组指针
charT_length=1;
//发送数据长度
charR_length=0;
//接收数据长度
chara2=0;
//控制参数
unsignedintspd_kp=0;
//转速环P参数
unsignedintspd_ki=0;
//转速环I参数
unsignedintid_kp=0,id_ki=0;
//电流PI参数
signedintspd_given=0;
//转速给定
signedintspd_given1=0;
signedintspd_given2=0;
//控制变量
unsignedintcap1=0;
//前次换向标志位
unsignedintcap2=0;
//本次换向标志位
unsignedintintruptcount=0;
//定时器1下溢中断次数
unsignedintspeed_given=1000;
signedintIdc_given2=0;
//算得本次电流给定值
signedintspeed_e1=0;
//前次转速误差
signedintspeed_e2=0;
//本次转速误差
signedintIa_e1=0;
//前次电流误差
signedintIa_e2=0;
//本次电流误差
chart2first=0;
signedintCOMP2=0;
//装比较寄存器值
//转速反馈
charSpd_Data=0;
//滤波计数
intspeed_counter=0;
//速度环计数器
unsignedintcap_a;
//本次捕获单元数据
unsignedintcap_b;
//上次捕获单元数据
longcap_c;
//捕获单元数据差
signedintBLDC_SPD[10]={0,0,0,0,0,0,0,0,0,0};
//转速滤波
signedintspd_fd_q1=0;
//转速反馈临时变量
unsignedintspd_fd_q0=0;
//转速检测值
charcc=0;
//电流反馈
unsignedintia[6]={0,0,0,0,0,0};
//A相电流反馈值
unsignedintib[6]={0,0,0,0,0,0};
//B相电流反馈值
signedintia_fd=0,ib_fd=0;
//电流反馈
signedintTemp_filter=0;
//临时变量
unsignedintt1per=0;
//周期寄存器数值
//临时变量
signedlonglong1_tmp=0;
signedlonglong2_tmp=0;
signedintu16_tmp1=0;
signedintu16_tmp2=0;
//子程序声明
interruptvoidt1uf_int(void);
interruptvoidcap_int(void);
voidAd(void);
voidspeed(void);
//计算速度
voidIa_PI(void);
//电流环调节Ia
voidspeed_PI(void);
//速度环调节
voidbldc(void);
voidCheck_Rxdata(void);
voidSci_Send(signedintsci_delay);
char*Fen_Jie(signedintSend_Temp);
unsignedintSci_Rx_check(unsignedinti_Rx,unsignedint*p_Rx);
signedintDIV_CAL(longsignedintdividend,signedintdivisor);
unsignedintU_DIV_CAL(longunsignedintudividend,unsignedintudivisor);
//主程序开始
voidmain(void)
{
//控制寄存器初始设置
InitSysCtrl();
//初始化系统
DINT;
//关全局中断
IER=0x0000;
IFR=0x0000;
InitPieCtrl();
//初始化PIE中断
InitPieVectTable();
//初始化PIE中断矢量表
InitGpio();
//初始化Gpio输入输出口
InitEv();
//初始化Eva的T和T2
InitAdc_Eva();
//初始化AD
InitData();
EALLOW;
//ThisisneededtowritetoEALLOWprotectedregisters
PieVectTable.T1UFINT=&
t1uf_int;
//T1下溢中断地址
PieVectTable.CAPINT4=&
cap_int;
PieVectTable.CAPINT5=&
PieVectTable.CAPINT6=&
EDIS;
//ThisisneededtodisablewritetoEALLOWprotectedregisters
PieCtrl.PIEIER2.bit.INTx6=1;
//T1下溢中断使能
PieCtrl.PIEIER5.bit.INTx5=1;
PieCtrl.PIEIER5.bit.INTx6=1;
PieCtrl.PIEIER5.bit.INTx7=1;
IER|=M_INT2;
//EnableCPUInterrupt2
IER|=M_INT4;
//EnableCPUInterrupt4
IER|=M_INT5;
//EnableCPUInterrupt5
EvbRegs.EVBIMRC.bit.CAP4INT=1;
EvbRegs.EVBIMRC.bit.CAP5INT=1;
EvbRegs.EVBIMRC.bit.CAP6INT=1;
EvbRegs.CAPCONB.all=0x36FF;
NOP;
EvbRegs.CAPCONB.all=0xB6FF;
EINT;
//使能全局中断INTM
ERTM;
//EnableGlobalrealtimeinterruptDBG
//等待中断(中断之外的时间内进行LCD的发送和接收)
for(;
;
)
{
SCI_CTL();
}
}
//串口控制
//*************
//接收数据检测
//************
voidCheck_Rxdata()
switch(Sci_Rx[0])
case'
m'
:
//转速给定和转速在线更新
v'
FlagRegs.bit.Vflag=1;
if(Sci_Rx[1]=='
-'
FlagRegs.bit.Sign1=0;
//转速为负值
spd_given1=Sci_Rx_check(4,Sci_Rx);
else
FlagRegs.bit.Sign1=1;
//转速为正值
spd_given1=Sci_Rx_check(3,Sci_Rx);
if(Sci_Rx[0]=='
FlagRegs.bit.Sign2=FlagRegs.bit.Sign1;
FlagRegs.bit.Sign=FlagRegs.bit.Sign1;
break;
}
s'
//启动
Sci_Tx[0]='
a'
Sci_Tx[1]='
+'
Sci_Tx[2]='
0'
Sci_Tx[3]='
Sci_Tx[4]='
Sci_Tx[5]='
Sci_Tx[6]='
Sci_Tx[7]='
z'
spd_given=spd_given1;
Protect_Data();
Motor_Start();
FlagRegs.bit.Send=1;
T_length=8;
T_pointer=0;
t'
//停止
Motor_Stop();
default:
//*******************
//串口接收/发送判断
//******************
SCI_CTL()
if((SciaTx_Ready()==1)&
&
(FlagRegs.bit.Send==1))//发送数据准备好并且软件使能发送
{
if(FlagRegs.bit.Test==0)//SCI测通状态
SciaRegs.SCITXBUF=Sci_Rx[T_pointer];
T_pointer++;
//发送缓冲器数组指针+1
if(T_pointer==R_length)
{
FlagRegs.bit.Test=1;
FlagRegs.bit.Send=0;
T_pointer=0;
}
}
else//SCI非测通状态
SciaRegs.SCITXBUF=Sci_Tx[T_pointer];
//发送缓冲器数组指针+1
if(T_pointer==T_length)
FlagRegs.bit.Send=0;
if(T_pointer>
=10)
FlagRegs.bit.Send=0;
}
R_pointer=0;
#if!
SCIA_INT
if(SciaRx_Ready()==1)//接收数据准备好
FlagRegs.bit.SendEnd=0;
FlagRegs.bit.Send=0;
Sci_Rx[R_pointer]=SciaRegs.SCIRXBUF.all;
R_pointer++;
if(Sci_Rx[R_pointer-1]=='
)
R_length=R_pointer-1;
FlagRegs.bit.Send=1;
FlagRegs.bit.SendEnd=1;
if(FlagRegs.bit.Test==1)
Check_Rxdata();
R_pointer=0;
if(R_pointer==10)
R_pointer=0;
}
#endif
}
//****************
//接收数据格式调整
unsignedintSci_Rx_check(unsignedinti_Rx,unsignedint*p_Rx)
unsignedlongdata_Rx;
unsignedint*p_tmp_Rx=p_Rx+i_Rx;
data_Rx=1000*(*p_tmp_Rx)+100*(*(p_tmp_Rx+1))+10*(*(p_tmp_Rx+2))+(*(p_tmp_Rx+3))-53328;
return(data_Rx);
//发送数据格式调整
char*Fen_Jie(signedintSend_Temp)
{
unsignedintTemp;
chars1,s2,s3,s4;
charString_Tmp[6]={0,0,0,0,0,'
\0'
if(Send_Temp<
0)
String_Tmp[0]='
Send_Temp=-Send_Temp;
{
String_Tmp[0]='
s1=((long)Send_Temp*2097)>
>
21;
if(s1>
=10){s1=9;
Temp=Send_Temp-s1*1000;
s2=((long)Temp*5253)>
19;
if(s2>
=10){s2=9;
Temp=Temp-s2*100;
s3=((long)Temp*3277)>
15;
if(s3>
=10){s3=9;
s4=Temp-s3*10;
if(s4>
=10){s4=9;
String_Tmp[1]=s1+48;
//千位
String_Tmp[2]=s2+48;
//百位
String_Tmp[3]=s3+48;
//十位
String_Tmp[4]=s4+48;
//个位
return(String_Tmp);
}
//**************
//数据发送
voidSci_Send(signedintsci_delay)
//串口数据发送
char*p_send=0;
a2++;
if((a2>
=sci_delay)&
(FlagRegs.bit.Send==0)&
(FlagRegs.bit.SendEnd==1))
p_send=Fen_Jie(spd_fd_q0);
Sci_Tx[1]=*p_send;
Sci_Tx[3]=*(p_send+1);
Sci_Tx[4]=*(p_send+2);
Sci_Tx[5]=*(p_send+3);
Sci_Tx[6]=*(p_send+4);
a2=0;
//电机状态控制
//数据处理
Protect_Data()
if(spd_kp<
=0)spd_kp=1;
elseif(spd_kp>
30000)spd_kp=30000;
if(spd_ki<
=0)spd_ki=1;
elseif(spd_ki>
30000)spd_ki=30000;
if(id_kp<
=0)id_kp=1;
elseif(id_kp>
30000)id_kp=30000;
if(id_ki<
=0)id_ki=1;
elseif(id_ki>
30000)id_ki=30000;
EvaRegs.T1PR=7500;
//矢量控制开关频率5K固定
t1per=7500;
EvaRegs.T1CON.all=0X080C;
//连续增减计数
//电机停止
//************
Motor_Stop()
EvaRegs.CMPR1=0;
EvaRegs.CMPR2=0;
EvaRegs.CMPR3=0;
EvaRegs.ACTR.all=0X0FFF;
FlagRegs.bit.Openint=0;
EvaRegs.T1CON.bit.TENABLE=0;
EvbRegs.T3CON.bit.TENABLE=0;
//电机启动
Motor_Start()
EvaRegs.ACTR.all=0X0999;
FlagRegs.bit.Openint=1;
//周期寄存器5khz
EvbRegs.T3PR=0xffff;
//周期寄存器
EvbRegs.T3CON.all=0X170C;
//连续增减计数
EvbRegs.EVBIMRA.all=0X0000;
//T3下溢使能
EvbRegs.EVBIFRA.all=0X0FFFF;
//清中断标志位
GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=0;
//将cap456设置为io口
GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=0;
GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10=0;
cap2=GpioDataRegs.GPBDAT.all&
0x0700;
//记录cap4-6初始状态
cap2=cap2>
8;
cap2=cap2&
0x0007;
if(FlagRegs.bit.Sign==1)ca