📄 motor.c
字号:
#include "DSP28_Device.h"
#include "comm.h"
#include "mcbsp.h"
#include "gui_string.h"
#include "motor.h"
#define DATATYPE 0 /* 0代表edit菜单;1代表选项菜单*/
unsigned int i,j;
unsigned int send_flag;
/***************************************************/
interrupt void mrinta_isr(void);
interrupt void t1pint_isr(void);
interrupt void cap_isr(void);
interrupt void t2pint_isr(void);
interrupt void EXint2_isr(void);
void Capinit(void);
void InitEvA(void);
void xnitgpio();
void pidcontrol(int u,int y);
void delay(unsigned int m);
///2008.4.3
Uint16 Speed,OldSpeed=0;
///end
Uint16 test[2000],test1[2000];
Uint16 count=0,CountAverage;
Uint16 nn=0;
Uint16 tt=0;
Uint16 ll=0;
Uint16 Sum=0;
unsigned int dir=1;//电机转动方向
unsigned int start=0;//电机启动停止标志
unsigned int setflag=0;//表示是否进行速度设定
unsigned int sudusendflag=0,xssdbz=0;//速度上传标志和速度显示的计数
unsigned int sdxsjs=0;
//速度到pwm的初始值
unsigned int pwm;//pwm的占空比
float kp=0.003,ki=0.01,kd=0.0;
Uint16 Speedset=3500;
int ek=0,ek1=0,ek2=0;
int du;
float duk;
/***************************************************/
/*******************************************************/
#define menu_num 5 /*通过num来控制输出文字的个数,通过gui_string.sam控制内容。*/
unsigned int Test;
/////////////////////////////////////////////////////////////////////////
unsigned int Edit_result;
unsigned int i,k;
/////////////////////////////////////////////////////////////////////////
unsigned int mcbspx[FRAMLENGTH];
unsigned int mcbspr[FRAMLENGTH];
unsigned int mcbsp_s;
PmcbspForDec psend;
PmcbspForDec preceive;
/************************************************/
void main(void)
{
#if DATATYPE==0
Test =FRAME_DATASEND; //0x1 数据传送帧
#endif
#if DATATYPE==1
Test =FRAME_DATAEND; // 0x3 数据传送结束帧
#endif
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE矢量表*/
InitPieVectTable();
/*初始化PWM*/
InitEvA();
/*GPIO*/
xnitgpio();
/*初始化CAP*/
Capinit();
/*初始化MCBSP外设*/
InitMcbsp();
EALLOW; // This is needed to write to EALLOW protected register
PieVectTable.XINT2=&EXint2_isr;
PieVectTable.CAPINT1=&cap_isr;
//PieVectTable.CAPINT2=&cap_isr;
//PieVectTable.CAPINT3=&cap_isr;
PieVectTable.T1PINT=&t1pint_isr;
//PieVectTable.T2PINT=&t2pint_isr;
//PieVectTable.PDPINTA=&pdpinta_isr;
PieVectTable.MRINTA= &mrinta_isr;
EDIS; // This is needed to disable write to EALL
PieCtrl.PIEIER1.bit.INTx5=1;//XINT2
PieCtrl.PIEIER2.bit.INTx4=1;//T1pint中断
//PieCtrl.PIEIER3.bit.INTx1=1;//T2pint中断
PieCtrl.PIEIER3.bit.INTx5=1;//Cap1中断
//PieCtrl.PIEIER3.bit.INTx6=1;//Cap2中断
//PieCtrl.PIEIER3.bit.INTx7=1;//Cap3中断
//PieCtrl.PIEIER1.bit.INTx1=1;//pdpinta中断
PieCtrl.PIEIER6.bit.INTx5 = 1;//McBSP接受中断
/* 设置IER寄存器 */
IER |= M_INT1;
IER |= M_INT2; // t1pint enable
IER |= M_INT3; // capture enable
IER |= M_INT6;
// Enable global Interrupts and higher priority real-time debug events:
//startmotor();
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
psend=(PmcbspForDec)(&mcbspx[0]);
// Step 6. IDLE loop. Just sit and loop forever (optional):
while(1)
{
switch(Test)
{
case FRAME_DATASEND:
psend->Length=FRAMLENGTH;
psend->Type=FRAME_DATASEND; //0x1 数据传送
psend->Mutul=FRAME_SING;
psend->Data[0]=MOTOR_START; //0xAA30 电机实验开始
mcbsp_tx((unsigned int *)psend);
Test=0;
break;
case FRAME_DATAEND:
psend->Length=FRAMLENGTH;
psend->Type=FRAME_DATAEND; //0x3 数据传送
psend->Mutul=FRAME_SING;
psend->Data[0]=MOTOR_OVER; //0xAA32 电机实验结束
mcbsp_tx((unsigned int *)psend);
Test=0;
break;
default:
break;
}
mcbsp_rx(&mcbspr[0]);
mcbsp_s=mcbsp_status();
if((mcbsp_s == 0xffff)||(mcbsp_s == 3)){
/*通知主机程序通讯出错,准备重发*/
psend->Length = FRAMLENGTH;
psend->Type = FRAME_CMD;
psend->Data[0] = CHECK_ERR;
psend->Mutul = FRAME_SING;
mcbsp_tx((unsigned int *) psend);
}
if(mcbsp_s == 0)
{
preceive=(PmcbspForDec)(&mcbspr[0]);
if(mcbspr[3]==0xaa38)
{
switch(mcbspr[4])
{
case 0xaa35:
{
start=1;
xssdbz=1;
startmotor();break;//启动电机
}
case 0xaa34:
{
start=0;
xssdbz=1;
stopmotor();//停止电机
setflag=0;
break;
}
case 0xaa36:
{
if(start==1)
{
dir=!dir;//换向
stopmotor();
delay(1000);
startmotor();
xssdbz=1;
}
break;
}
default:break;
}
}
if(mcbspr[3]==0xaa37)//pid参数设定
{
xssdbz=1;
Speedset=mcbspr[4];
kp=(float)mcbspr[5]/1000;
ki=(float)mcbspr[6]/1000;
kd=(float)mcbspr[7]/1000;
if(start==1)
setflag=1;//表示开始设定速度,pid
else
setflag=0;
}
}
if((sudusendflag==1)&&(xssdbz==1))//每隔2s上传一次速度
{
sudusendflag=0;
psend->Length = FRAMLENGTH;
psend->Type = FRAME_DATASEND;
psend->Data[0] = 0xaa20;
if(start==0)//电机停止状态下速度为0
Speed=0x0;
psend->Data[1] =Speed;
psend->Mutul = FRAME_SING;
mcbsp_tx((unsigned int *) psend);
}
}
}
interrupt void EXint2_isr(void)
{
Sum+=count;
/*test[nn]=count;//测试用,存储速度值
nn++;
if(nn==1000)
{
nn=0;
}*/
Speed=(10000/count)*30;//计算转速
/////////////2008.4.3
if(Speed>6500)
Speed=OldSpeed;
OldSpeed=Speed;
///////////END 2008.4.3
// Speed=(10000/(count*2))*60;//计算转速
/*ll++;
if(ll==10)
{
CountAverage=Sum/10;
Speed=(10000/(CountAverage*2))*60;//计算转速
Sum=0;
ll=0;*/
test[nn]=Speed;//测试用,存储速度值
test1[nn]=count;//测试用,存储速度值
nn++;
if(nn==1000)
{
nn=0;
}
//}
count=0;
PieCtrl.PIEACK.bit.ACK1=1;//向cpu申请中断
}
interrupt void cap_isr(void)
{
//Speed=(20000/(count*2))*60;//计算转速
test[nn]= count;//测试用,存储速度值
nn++;
if(nn==2000)
{
nn=0;
}
count=0;
EALLOW;
EvaRegs.CAPFIFO.all= 0x01500; // 清空捕捉堆栈
EvaRegs.EVAIFRC.all = 7 ; // 清捕捉中断
EvaRegs.CAPFIFO.all= 0x01500; // 清空捕捉堆栈
// EvaRegs.CAPFIFO.all = 0x01500; // 清空捕捉堆栈
PieCtrl.PIEACK.bit.ACK3=1;//cap1中断向cpu申请中断
EDIS;
}
interrupt void t1pint_isr(void)
{
sdxsjs++;
if(sdxsjs==20000)
{
sudusendflag=1;//速度上传标志置位
sdxsjs=0;
//GpioDataRegs.GPADAT.bit.GPIOA13 =!GpioDataRegs.GPADAT.bit.GPIOA13;//程序运行显示
}//速度上传得计时
tt++;
if(tt==1000)
{
//GpioDataRegs.GPADAT.bit.GPIOA0=!GpioDataRegs.GPADAT.bit.GPIOA0;
if(setflag==1)
{
pidcontrol(Speedset,Speed);//100ms
}
tt=0;
}
count++;
//if(count>=30)
// asm(" nop");
EvaRegs.EVAIFRA.bit.T1PINT=1;//清除中断标志
EvaRegs.EVAIMRA.bit.T1PINT=1;//中断允许
PieCtrl.PIEACK.bit.ACK2=1;//向cpu申请中断
}
interrupt void t2pint_isr(void)
{
count++;
EvaRegs.EVAIFRB.bit.T2PINT=1;//清除中断标志
EvaRegs.EVAIMRB.bit.T2PINT=1;//中断允许
PieCtrl.PIEACK.bit.ACK3=1;//向cpu申请中断
}
//pid控制
void pidcontrol(int u,int y)
{
EALLOW;
ek=u-y;
duk=kp*(ek-ek1)+ki*ek+kd*(ek+ek2-ek1*2);
du=(int)duk;
if(duk>1) duk=1;
if(duk<-1) duk=-1;
pwm-=du;
if(pwm<0x20)
{
pwm=0x20;
}
if(pwm>0x800)
{
pwm=0x800;
}
EvaRegs.T1CMPR = pwm; // 比较
ek2=ek1;
ek1=ek;
EDIS;
}
/**************************************/
interrupt void mrinta_isr(void) // McBSP-A
{
PieCtrl.PIEACK.bit.ACK6 = 1;
if(Mcbsp_RxRdy() == 1)
{
RevBuffer[datarevlength] = McbspRegs.DRR1.all;
datarevlength++;
}
EINT;
}
void delay(unsigned int m)
{
unsigned int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<1500;j++)
{}
}
}
/***********************************************************************/
// No more
/***********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -