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(;;);
}