📄 main_dsp_pwm.c
字号:
#include "DSP28_Device.h"
//void InitGpio(void);
//void InitSystem(void);
interrupt void T3_Compare_isr(void);
interrupt void T1_Compare_isr(void);
interrupt void ADC_FIR_INT_ISR(void);
int ADCRESULT0=0,ADCRESULT1=0,ADCRESULT2=0,PRECMP=0;
short int tem=0,forward=0,backward=0,STP=0,slow=0;
void main(void)
{
InitSysCtrl();
InitGpio();
InitPieCtrl();
InitPieVectTable();
IntAdc();
EALLOW;
PieVectTable.T3CINT = &T3_Compare_isr;
PieVectTable.T1CINT = &T1_Compare_isr;
PieVectTable.ADCINT = &ADC_FIR_INT_ISR;
EDIS;
PieCtrlRegs.PIEIER2.bit.INTx5 = 1;
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
PieCtrlRegs.PIEIER4.bit.INTx5 = 1;
IER|=3;
EINT;
ERTM;
EvaRegs.T1PR=37500;//外部晶振为30MHZ,锁相环倍频为5达150MHZ,HISPCP分频系数为2
EvaRegs.T1CNT=0; //HSPCLK==》75MHZ,1/75M*37500=0.0005S对应2KHZ
EvaRegs.T1CON.all=0x1002;//0x1002=0001 0000 0000 0010b,连续增,内部时钟不分频(HSPCLK),TECMPR使能比较,TENABLE=0禁止定时器
EvaRegs.T1CMPR=PRECMP; //0.5占空比
EvaRegs.GPTCONA.bit.TCOMPOE=1; //T1/T2驱动T1PWM/T2PWM
EvaRegs.GPTCONA.bit.T1PIN=2; //高有效
EvaRegs.GPTCONA.bit.T2TOADC=2; //由T2周期启动ADC
EvaRegs.EVAIMRA.bit.T1CINT=1; //使能比较中断
EvaRegs.T1CON.bit.TENABLE=0; //暂不开定时器
EvaRegs.T2CON.all=0x0000; //T2禁止
EvaRegs.T2CNT=0;
EvaRegs.T2PR=1499; //1/75MHZ*1499=0.00002S对应50KHZ
EvaRegs.T2CON.all=0x1040; //0x1040=0001 0000 0100 0000b,连续增,使能定时器2
EvbRegs.T3PR=37500;//外部晶振为30MHZ,锁相环倍频为5达150MHZ,HISPCP分频系数为2
EvbRegs.T3CNT=0; //HSPCLK==》75MHZ,1/75M*37500=0.0005S对应2KHZ
EvbRegs.T3CON.all=0x1002;//0x1002=0001 0000 0000 0010b,连续增,内部时钟不分频(HSPCLK),TECMPR使能比较,TENABLE=0禁止定时器
EvbRegs.T3CMPR=PRECMP; //0.5占空比
EvbRegs.GPTCONB.bit.TCOMPOE=1; //T3/T4驱动T3PWM/T4PWM
EvbRegs.GPTCONB.bit.T3PIN=2; //高有效
EvbRegs.EVBIMRA.bit.T3CINT=1; //使能比较中断
EvbRegs.T3CON.bit.TENABLE=0; //暂不开定时器
while(1)
{
EALLOW;
SysCtrlRegs.WDKEY=0xAA;
EDIS;
if((GpioDataRegs.GPBDAT.all&&0x0030)==0x0020) //前进按钮
{
tem=1;
Delayus(20);
if((GpioDataRegs.GPBDAT.all&&0x0030)==0x0020)
{
if(tem==1)
{
forward=1;
backward=0;
STP=0;
}
else tem=0;
}
}
if((GpioDataRegs.GPBDAT.all&&0x0030)==0x0010) //前进按钮
{
tem=1;
Delayus(20);
if((GpioDataRegs.GPBDAT.all&&0x0030)==0x0010)
{
if(tem==1)
{
forward=1;
backward=0;
STP=0;
}
else tem=0;
}
}
if(GpioDataRegs.GPBDAT.bit.GPIOB3==0) //停止按钮
{
tem=1;
Delayus(20);
if(GpioDataRegs.GPBDAT.bit.GPIOB3==0)
{
if(tem==1)
{
forward=0;
backward=0;
STP=1;
slow=0;
}
else tem=0;
}
}
if(GpioDataRegs.GPADAT.bit.GPIOA0==0) //刹车
{
tem=1;
Delayus(20);
if(GpioDataRegs.GPADAT.bit.GPIOA0==0)
{
if(tem==1)
{
slow=1;
}
else tem=0;
}
}
else slow=0;
if(forward==1)
{
GpioDataRegs.GPBDAT.bit.GPIOB1=1;
EvaRegs.T1CON.bit.TENABLE=1; //PWM开
EvbRegs.T3CON.bit.TENABLE=1;
}
if(backward==1)
{
GpioDataRegs.GPBDAT.bit.GPIOB2=1;
EvaRegs.T1CON.bit.TENABLE=1; //PWM开
EvbRegs.T3CON.bit.TENABLE=1;
}
if(slow==1)
{
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=1;
if(ADCRESULT0>4095)
PRECMP=37500;
else if(ADCRESULT0<2389)
PRECMP=0;
else
PRECMP=22*(ADCRESULT0-2389);
}
else
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;
if(STP==1)
{
GpioDataRegs.GPBDAT.bit.GPIOB1=0;
GpioDataRegs.GPBDAT.bit.GPIOB2=0;
EvaRegs.T1CON.bit.TENABLE=0;
EvbRegs.T3CON.bit.TENABLE=0;
}
}
}
interrupt void T1_Compare_isr(void)
{
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
EvaRegs.EVAIFRA.bit.T1CINT=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP2;
}
interrupt void T3_Compare_isr(void)
{
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
EvbRegs.EVBIFRA.bit.T3CINT=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP4;
}
interrupt void ADC_FIR_INT_ISR(void)
{
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1;
ADCRESULT0=AdcRegs.RESULT0>>4;
ADCRESULT1=AdcRegs.RESULT1>>4;
ADCRESULT2=AdcRegs.RESULT2>>4;
}
//===========================================================================
// No more.
//=========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -