case 't': //停止 {
Motor_Stop(); break; }
default: break; } }
//******************* // 串口接收/发送判断 //****************** 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];
T_pointer++; //发送缓冲器数组指针+1 if(T_pointer==T_length) {
FlagRegs.bit.Send = 0; T_pointer=0; }
if(T_pointer>=10) {
T_pointer=0;
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]=='z')
{
R_length=R_pointer-1; FlagRegs.bit.Send= 1; FlagRegs.bit.SendEnd=1;
//**************** //接收数据格式调整 //****************
unsigned int Sci_Rx_check(unsigned int i_Rx,unsigned int *p_Rx) {
unsigned long data_Rx;
unsigned int *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); }
//**************** //发送数据格式调整 //****************
if(FlagRegs.bit.Test==1) {
Check_Rxdata(); R_pointer = 0; } }
if(R_pointer== 10)
{
R_pointer = 0; } }
#endif
}
char *Fen_Jie(signed int Send_Temp) {
unsigned int Temp; char s1,s2,s3,s4;
char String_Tmp[6]={0,0,0,0,0,'\\0'}; if(Send_Temp< 0) {
String_Tmp[0]='-'; Send_Temp=-Send_Temp; } else {
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); }
//************** // 数据发送 //**************
void Sci_Send(signed int sci_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[0]='a';
Sci_Tx[1]=*p_send;
Sci_Tx[2]='0';
Sci_Tx[3]=*(p_send+1); Sci_Tx[4]=*(p_send+2); Sci_Tx[5]=*(p_send+3); Sci_Tx[6]=*(p_send+4); Sci_Tx[7]='z'; FlagRegs.bit.Send=1; a2=0; } }
//===================================================================== //电机状态控制
//===================================================================== //******************* // 数据处理
//****************** Protect_Data() {
if(spd_kp<=0)spd_kp=1; //转速环P参数 else if(spd_kp>30000) spd_kp=30000;
if(spd_ki<=0)spd_ki=1; //转速环P参数 else if(spd_ki>30000) spd_ki=30000;
if(id_kp<=0)id_kp=1; //转速环P参数 else if(id_kp>30000) id_kp=30000;
if(id_ki<=0)id_ki=1; //转速环P参数 else if(id_ki>30000) id_ki=30000;
EvaRegs.T1PR =7500; //矢量控制开关频率5K固定 t1per=7500;
EvaRegs.T1CON.all = 0X080C; //连续增减计数 InitAdc_Eva();
//************ //电机停止 Motor_Stop() {
EvaRegs.CMPR1=0; EvaRegs.CMPR2=0; EvaRegs.CMPR3=0;
EvaRegs.ACTR.all=0X0FFF; InitData();
FlagRegs.bit.Openint=0;
}
//************
EvaRegs.T1CON.bit.TENABLE=0; EvbRegs.T3CON.bit.TENABLE=0; }
//************ //电机启动 //************ Motor_Start() {
EvaRegs.ACTR.all=0X0999; FlagRegs.bit.Openint=1; t1per=7500;
EvaRegs.T1PR =7500; //周期寄存器 5khz EvaRegs.T1CON.all = 0X080C; //连续增减计数 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) cap2=7-cap2; else cap2=cap2;
GpioMuxRegs.GPBMUX.bit.CAP4Q1_GPIOB8=1; //将cap456设置为CAP口 GpioMuxRegs.GPBMUX.bit.CAP5Q2_GPIOB9=1; GpioMuxRegs.GPBMUX.bit.CAP6QI2_GPIOB10=1; EvaRegs.T1CON.bit.TENABLE=1; FlagRegs.bit.Vflag=1; }
//===================================================================== //直流无刷电动机驱动双闭环主程序
//===================================================================== //***************** //驱动主程序
//***************** void bldc() {
intruptcount++; speed();
switch((int)cap2)
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库DSP无刷直流电动机驱动控制程序(2)在线全文阅读。
相关推荐: