(一)ADC的配置
调用库里面函数的即可
InitAdc(); // For this example, init the ADC
AdcOffsetSelfCal();
(二)EPWM的配置
EPWM的触发频率计算
EPWM时钟频率 = 系统时钟频率 / (HSPCLKDIV * CLKDIV );
▲举例
假如系统时钟为60M,寄存器为如下配置
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBCTL.bit.CLKDIV = 0;
则EPWM1的时钟频率为60M / (1*1) = 60M (则每60个时钟周期为1us)
假定我们要配置300KHZ的EPWM1中断频率。
则 单个周期为 1000000us / 300000 = 3.333333333333333us。
则需要60 * 3.333333333333333 = 200个中断周期。( EPwm1Regs.TBPRD = 200)
接下来贴上完整配置代码
周期寄存器: EPwm1Regs.TBPRD
计数扫描模式配置: EPwm1Regs.TBCTL.bit.CTRMODE (向上,向下,向上再向下,冻结)
//若配置为向上再向下,则EPwm1Regs.TBPRD 只需要100就够了
static void initEPWM1(void)
{
EALLOW;
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC on up-count
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; // Set EPwm1 Timer period (周期)
EPwm1Regs.TBCTL.bit.CTRMODE = TB_FREEZE; // Freeze counter (冻结 ,不运行,配置为0则开始运行)
//
// Setup TBCLK
//
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
//
// Setup counter mode
//
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//
// Setup shadowing
//
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
// Interrupt where we will change the Compare Values
//
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on period event
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on every event
EDIS;
}
(三)关联ADC与PWM
EALLOW;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 2; //(配置为AIO2)
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 设置ADC触发模式为 ePWM1 SOCA/C
AdcRegs.INTSEL1N2.bit.INT1SEL = 0; // end of SOC0 will set INT1 flag
AdcRegs.INTSEL1N2.bit.INT1E = 1; // enable INT1 flag
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // make sure INT1 flag is cleared
EDIS;
指定中断函数
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.ADCINT1 = &adc_sample_signal; // ISR for ADCA
EDIS; // This is needed to disable write to EALLOW protected registers
开启总中断
IER |= M_INT1; // Enable int1 (EPwm1)
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // EPwm1/ADC
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
停止ADC采样
EPwm1Regs.ETSEL.bit.SOCAEN = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_FREEZE;
开始ADC采样
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.TBCTL.bit.CTRMODE = 0;