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;//ADCPieCtrlRegs.PIEIER3.bit.INTx1=1;//EPWMConfigureADC();ConfigureEPWM();SetupADCEpwm(0);Time0_Init(60,500000);PID_M1_Init();IER |= M_INT1; //使能CPU的INT1IER|=M_INT3;EINT;ERTM;PieCtrlRegs.PIECTRL.bit.ENPIE = 1;EALLOW;CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;EDIS;do{EPwm1Regs.ETSEL.bit.SOCAEN = 1;//使能EPWMXSOCA启动ADCEPwm1Regs.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(;;);
}
Susan Yang:
请您私信一下您的程序,我们会在开发板测试后给您回复。
另外您现在使用的自己的板子?
Susan Yang:
回复 user6394136:
很高兴能帮到您