dsp电机代码.docx
《dsp电机代码.docx》由会员分享,可在线阅读,更多相关《dsp电机代码.docx(28页珍藏版)》请在冰豆网上搜索。
![dsp电机代码.docx](https://file1.bdocx.com/fileroot1/2023-1/28/6baa2a79-20a1-4174-9dd2-d97c61198bf8/6baa2a79-20a1-4174-9dd2-d97c61198bf81.gif)
dsp电机代码
#include"DSP281x_Device.h"
#include"DSP281x_Examples.h"
#defineLCD_DELAY_nUS(A)Delay(((((longdouble)A*1000.0L)/(longdouble)6.666667)-18.0L)/14.0L)
voidDelay(unsignedlongloopCnt);
//'''''''''''''''''''''''''液晶显示值/'''''''''''''''''''''''''''''''''''''
externunsignedcharnumber[10];
externunsignedchara,b,c,d,e,biao_zhi;
unsignedcharf;
intNowSpd=0;
longPlace_now_display=0;
//'''''''''''''''''''''''''''end'''''''''''''''''''''''''''''''//
//:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
电机初始化变量定义:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
charmotor_OK=1,shan_qu=0;
//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/*:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
速度变量值定义:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
*/
inttemp=0,temp1=0,temp2=0;
longSatErr_speed=0,
OutPreSat_speed=0;//速度变量值定义
longspeed_now=0,Up_speed=0,speed_error=0,Ui_speed=0;
longspeed_set=0;
//:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
位置环变量定义:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
longPlaceSet=0,PlaceError=0,
Place_now=0,Now_P=0,//圈数
OutPreSat_Place=0;//位置变量值定义
unsignedcharPlaceSetBit=0;//位置设定标志位
//--------------------------------------------------------------------
//:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
空间矢量变量定义:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
intextent_temp=0,extent_temp1=0,extent_temp2=0;//位置变量值定义
unsignedintextent[14]={0x3999,0x2999,0x6999,0x4999,0x5999,0x1999,0x3999,0x2999,0x6999,0x4999,0x5999,0x1999,0x3999,0x2999};//区域数组定义
intextent_i=0,extent_D=0,extent_Q=0,extent_D_1=0;//扇区变量,extent_i,extent_D,extent_Q(extent_Q比extent_D超前90度
//-----------------------------------
externconstintsin_theta[1000];//外部SIN表
externconstintcos_theta[1000];//外部cos表
//cos_theta[theta]为Q15格式,ID,IQ为Q7格式1-128,Id,Iq为LONG型
intt1=0,t2=0,CMPR_temp=1250,theta=0,pwm_temp=0;//turn=0;
longId=0,Iq=0,ID=0,IQ=0,Ualfa=0,Ubeta=0,x=0,y=0,z=0,temp_volue=0;
//===========================电流环变量定义=========================
intAD2_temp=0,Ki_Q_temp=0,Ki_D_temp=0,pwm_x=0,theta_add_60=0;
longIu=0,Iv=0,I_d=0,I_q=0,I_ref_D=0,I_ref_Q=0,I_er_Q=0,
I_er_D=0,I_order_Q=0,
OutPreSat_IQ=0,SatErr_IQ=0,Ui_IQ=0,Up_IQ=0,
OutPreSat_ID=0,SatErr_ID=0,Ui_ID=0,Up_ID=0;
//------------------------------------------------------------------
//longadc_x0=0,adc_x1=0,adc_restul1=0,adc_restul0=0,adc_i=0;
//===========================测试变量==============================
//unsignedintTimeClash=0,timer2_x=0,timer2_x1=0,timer1_test[1000]={0},
//timer2_test[1000]={0},timer3_test[500]={0},//timer4_test[500]={0},
//test_i=0,ICTs=0;
unsignedintTimeClash=0;
externunsignedintIsrTest;
//-------------------------------------------------------------------
//==========================串口程式变量定义==========================
intReceiveTemp=0,SciCommand_i=0,SciCommand_j=0,SetBit=0;
intSpeedSetTemp=0,PlaceEnable=1,SpeedSetAD=0;
longPlaceSetTemp=0,SciCommand[14]={0};
//--------------------------------------------------------------------
////////////////外部中断初始化///////////////////////
voidinit_Xint1(void)
{
EALLOW;
PieCtrlRegs.PIEIER1.bit.INTx4=1;//中断允许
PieCtrlRegs.PIEIFR1.bit.INTx4=0;//清除中断标志
PieCtrlRegs.PIEACK.bit.ACK1=1;
XIntruptRegs.XINT1CR.bit.POLARITY=1;//上升沿触发
XIntruptRegs.XINT1CR.bit.ENABLE=1;
EDIS;
EINT;
}
////////////////ADC初始化/////////////////////
voidinit_ADC(void)
{
//AdcRegs.ADCTRL1.bit.RESET=1;
//AdcRegs.ADCTRL1.bit.RESET=0;
AdcRegs.ADCTRL3.bit.ADCPWDN=1;
LCD_DELAY_nUS(2000);
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;
LCD_DELAY_nUS(2000);
AdcRegs.ADCTRL1.bit.CONT_RUN=1;//连续运行;
AdcRegs.ADCTRL1.bit.CPS=0;
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
AdcRegs.ADCTRL3.bit.ADCCLKPS=3;//25MHZ
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=2;
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0;
AdcRegs.ADCCHSELSEQ1.bit.CONV01=1;
AdcRegs.ADCCHSELSEQ1.bit.CONV02=2;
}
///////////////初始化事件管理器EVA////////////////////
voidInit_Evx(void)
{
//=======定时器3定时中断初始化======================
EALLOW;
EvbRegs.T3PR=9375;//一毫秒
EvbRegs.T3CON.all=0x1340;//8分频
PieCtrlRegs.PIEIER4.bit.INTx4=1;//定时器3周期中断允许
PieCtrlRegs.PIEIFR4.bit.INTx4=0;//清除中断标志位
PieCtrlRegs.PIEACK.bit.ACK4=1;
EvbRegs.EVBIMRA.bit.T3PINT=1;
EvbRegs.EVBIFRA.bit.T3PINT=1;
EDIS;
//-------------------------------------------
//========定时器1下溢中断&(svpwm)初始化====================
EALLOW;
EvaRegs.T1CON.all=0x0842;//定时器1,连续增减,一分频,使能,比较使能,立即重载
EvaRegs.T1PR=1250;//30MHZPWM
EvaRegs.CMPR1=0;//测试用
EvaRegs.CMPR2=0;//测试用
EvaRegs.COMCONA.all|=0X9200;//使能比较操作,使能SVPWM模式,T0下溢重载,PWM比较输出使能
EvaRegs.ACTRA.all=0X0999;//SV正转,PWM1,3,5低有效&pWM2,4,6高有效;
//EvaRegs.EXTCONA.bit.INDCOE=1;//独立输出比较使能
//EvaRegs.GPTCONA.all|=0x0052;
EvaRegs.T1CNT=0;
EvaRegs.EVAIMRA.bit.T1UFINT=1;//下溢中断允许
EvaRegs.EVAIFRA.bit.T1UFINT=1;//清除下溢中断标志位
PieCtrlRegs.PIEIER2.bit.INTx6=1;//下溢中断向量允许
PieCtrlRegs.PIEIFR2.bit.INTx6=0;//清除下溢中断标志
PieCtrlRegs.PIEACK.bit.ACK2=1;
/////////////////QEP初始化////////////////
EvaRegs.T2CON.all=0x1870;
EvaRegs.T2CNT=0x0000;
EvaRegs.T2PR=0xffff;
//------------------------------------------
/*//////////////EVB捕获功能初始化/////////
EvbRegs.CAPCONB.bit.CAP45EN=1;//使能捕捉单元4和5
EvbRegs.CAPCONB.bit.CAP45TSEL=3;//44和5选择定时器3
EvbRegs.CAPCONB.bit.CAP4EDGE=3;//单元4上升和下降沿触发
EvbRegs.CAPCONB.bit.CAP5EDGE=3;//单元5上升和下降沿触发
EvbRegs.EVBIFRC.bit.CAP4INT=1;//复位捕捉4标志位
EvbRegs.EVBIFRC.bit.CAP5INT=1;//复位捕捉5标志位
EvbRegs.EVBIMRC.bit.CAP4INT=1;//允许捕捉中断4
EvbRegs.EVBIMRC.bit.CAP5INT=1;//允许捕捉中断5
PieCtrlRegs.PIEIER5.bit.INTx5=1;//允许捕捉中断4向量
PieCtrlRegs.PIEIER5.bit.INTx6=1;//允许捕捉中断5向量
PieCtrlRegs.PIEIFR5.bit.INTx5=0;//清除捕捉中断4标志位
PieCtrlRegs.PIEIFR5.bit.INTx6=0;//清除捕捉中断5标志位
PieCtrlRegs.PIEACK.bit.ACK5=1;*/
//------------------------------------------
EDIS;
}
///////////////////SCI初始化//////////////////////////////////
voidInitSci(void)
{
EALLOW;
//Send
SciaRegs.SCICTL1.bit.SWRESET=1;
SciaRegs.SCICCR.bit.SCICHAR=7;//取八位数据
SciaRegs.SCICTL1.bit.TXENA=1;//opensend
//Receive
SciaRegs.SCICTL1.bit.RXENA=1;//openreceive
SciaRegs.SCICTL2.bit.RXBKINTENA=1;//允许接收中断
SciaRegs.SCIHBAUD=0x01;
SciaRegs.SCILBAUD=0xE7;//9600
PieCtrlRegs.PIEIER9.bit.INTx1=1;//允许接收中断
PieCtrlRegs.PIEIFR9.bit.INTx1=0;
PieCtrlRegs.PIEACK.bit.ACK9=1;
///////////////功率保护中断初始化////////////////
EvaRegs.EVAIMRA.bit.PDPINTA=1;//PDPINTA中断允许
EvaRegs.EVAIFRA.bit.PDPINTA=1;//PDPINTA中断标志清零
PieCtrlRegs.PIEIER1.bit.INTx1=1;//PDPINTA中断允许
PieCtrlRegs.PIEIFR1.bit.INTx1=0;
PieCtrlRegs.PIEACK.bit.ACK1=1;//
EDIS;
}
//-----------------------------------------------------------
///////////////////电机初始化函数(位置确定)////////////////////////////
voidmotor_init(void)
{
switch(GpioDataRegs.GPADAT.all&0xE000)
{
case0xA000:
shan_qu=0;break;
case0x2000:
shan_qu=1;break;
case0x6000:
shan_qu=2;break;
case0x4000:
shan_qu=3;break;
case0xC000:
shan_qu=4;break;
case0x8000:
shan_qu=5;break;
default:
motor_OK=0;break;
}
extent_D=833*shan_qu+416;
}
//////////////////中虾?
//////////////////////////
interruptvoidMY_XINT1_ISR(void);//T1捕获中断
interruptvoidMY_T3PINT_ISR(void);
interruptvoidMY_T1UFINT_ISR(void);
interruptvoidMY_SCI_ISR(void);
interruptvoidMY_PDPINDA_ISR(void);
//---------------------------------------------------------
voidSciSendChar(unsignedcharSciSendTemp);
voidSciSendString(unsignedchar*x);
voidmain(void)
{
/***********************************************************************/
InitSysCtrl();//初始化系统控制寄存器,PLL,看门狗...
InitGpio();//初始化GPIO工作模式
InitPeripheralClocks();//初始化外设时钟
InitPieCtrl();//初始化PIE寄存器
InitPieVectTable();//初始化PIE中断向量表
motor_init();//电机初始化
if(motor_OK==1)//如果电机工作正常才允许使用
{
init_Xint1();//初始化外部中断1
init_ADC();//初始化ADC
Init_Evx();//初始化事件管理A
}
Init_LCD();//液晶初始化两次
Init_LCD();
InitSci();
EALLOW;
PieVectTable.XINT1=&MY_XINT1_ISR;//外部中断XINT1向量地址
PieVectTable.T3PINT=&MY_T3PINT_ISR;//TIMER3比较中断
PieVectTable.T1UFINT=&MY_T1UFINT_ISR;//time1下溢中断
PieVectTable.RXAINT=&MY_SCI_ISR;//SciInterrupt
PieVectTable.PDPINTA=&MY_PDPINDA_ISR;//PDPINDA
EDIS;
IER=0x0000;
IER=0x010b;//xint1tiufintt3pintrxaint(int1int2int4int9)
IFR=0x0000;
EINT;//开放全局中断
/********************************************************************/
while
(1)
{
if(motor_OK==1)
{
display_a_string(0,0,"NowSpd=");
display_a_string(12,0,"r/m");
if(speed_now>=0)
{
NowSpd=speed_now;
display_a_char(7,0,'+');
}
else
{
NowSpd=-speed_now;
display_a_char(7,0,'-');
}
a=NowSpd/1000;
b=NowSpd%1000/100;
c=NowSpd%100/10;
d=NowSpd%10;
display_a_char(8,0,number[a]);
display_a_char(9,0,number[b]);
display_a_char(10,0,number[c]);
display_a_char(11,0,number[d]);
display_a_string(0,1,"Now_P=");
display_a_string(13,1,"r");
if(Now_P>=0)
{
Place_now_display=Now_P;
display_a_char(6,1,'+');
}
else
{
Place_now_display=-Now_P;
display_a_char(6,1,'-');
}
f=Place_now_display/100000;
e=Place_now_display%100000/10000;
a=Place_now_display%10000/1000;
b=Place_now_display%1000/100;
c=Place_now_display%100/10;
d=Place_now_display%10;
display_a_char(7,1,number[f]);
display_a_char(8,1,number[e]);
display_a_char(9,1,number[a]);
display_a_char(10,1,number[b]);
display_a_char(11,1,number[c]);
display_a_char(12,1,number[d]);
if(SetBit==0)//清除位置信号数组
{
for(SciCommand_j=0;SciCommand_j<14;SciCommand_j++)
{SciCommand[SciCommand_j]=0;}
}
//////////////////返回位置完成信息///////////////////////////////////
if((PlaceError<=2)&&(PlaceError>=-2))//当脉冲数相差+-1时,速度为0
{
if(PlaceSetBit==1)
{