This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
main.c #include "F28x_Project.h" __interrupt void adca1_isr(void); __interrupt void epwm1_isr(void); __interrupt void cpu_timer0_isr(void); #include "adc.h" #include "epwm.h" #include "pid.h" #include "timer.h" #define RESULTS_BUFFER_SIZE 256 Uint16 AdcaResults; Uint16 resultsIndex; float V=0; volatile Uint16 bufferFull; Uint16 sum=0,ave=0; extern int PwmValue; void main(void) { InitSysCtrl(); InitGpio(); EPWM1_Init(2000); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; PieVectTable.ADCA1_INT = &adca1_isr; //中断向量表指向中断 EDIS; EALLOW; PieVectTable.EPWM1_INT=&epwm1_isr; EDIS; PieCtrlRegs.PIEIER1.bit.INTx1 = 1; //ADC PieCtrlRegs.PIEIER3.bit.INTx1=1; //EPWM ConfigureADC(); ConfigureEPWM(); SetupADCEpwm(0); Time0_Init(60,500000); PID_M1_Init(); IER |= M_INT1; //使能CPU的INT1 IER|=M_INT3; EINT; ERTM; PieCtrlRegs.PIECTRL.bit.ENPIE = 1; EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; do { EPwm1Regs.ETSEL.bit.SOCAEN = 1; //使能EPWMXSOCA启动ADC EPwm1Regs.TBCTL.bit.CTRMODE = 0; //上升计数 EPwm1Regs.ETSEL.bit.SOCAEN = 0; //关闭转换 EPwm1Regs.TBCTL.bit.CTRMODE = 3; //停止计数 }while(1); } __interrupt void adca1_isr(void) { AdcaResults= AdcaResultRegs.ADCRESULT0; V=(float)3.3*AdcaResults/4096; AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } __interrupt void epwm1_isr(void) { EPwm1Regs.CMPB.bit.CMPB= PwmValue; // EPwm1Regs.CMPA.bit.CMPA=0; EPwm1Regs.ETCLR.bit.INT=1; PieCtrlRegs.PIEACK.all=PIEACK_GROUP3; } timer.c /* * timer.c * * Created on: 2020年7月22日 * Author: 汪 */ #include "timer.h" #include "F2837xD_cputimer.h" #include "pid.h" Uint16 i=0; __interrupt void cpu_timer0_isr(void); extern PIDTypdDef M1PID; extern PIDTypdDef M2PID; int PwmValue=0; extern float V; void Time0_Init(float Freq,double time) { InitSysCtrl(); DINT; IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; PieVectTable.TIMER0_INT = &cpu_timer0_isr; EDIS; InitCpuTimers(); ConfigCpuTimer(&CpuTimer0, 60, 500000); CpuTimer0Regs.TCR.all = 0x4001; InitGpio(); EALLOW; GpioCtrlRegs.GPEMUX1.bit.GPIO133 = 0; GpioCtrlRegs.GPEDIR.bit.GPIO133 = 1; EDIS; IER |= M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; EINT; ERTM; } __interrupt void cpu_timer0_isr(void) { PID_M1_SetPoint(5); PID_M1_SetKp(200); PID_M1_SetKi(0.1); PID_M1_SetKd(0); PwmValue = PID_M1_PosLocCalc(V); if(PwmValue > 2000) PwmValue= 2000; if(PwmValue < -2000) PwmValue = -2000; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //清除中断应答位 } 在开启TIMEO中断后 程序进入
interrupt void ADCA1_ISR(void)
{
// Insert ISR Code here
// To receive more interrupts from this PIE group,
// acknowledge this interrupt.
// PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
// Next two lines for debug only to halt the processor here
// Remove after inserting ISR Code
asm (" ESTOP0");
for(;;);
}