
导语:
ADC采样的触发采样方式很多:定时器、外部中断、ePWM、EOC等。而在电机控制中ADC采样时刻的选择直接影响电流重构的精度,利用ePWM丰富的SOC功能,可以方便利用控制周期,选择ADC采样点。本期我们做一个ePWM_ADC例程,利用PWM的PRD事件触发ADC采样,ADC采样结束后进入ADC中断。
ePWM_ADC时序如下图:

其中ePWM采用up-down三角计数模式,CAU时置高,CAD时置低。当TBCTR=TBPRD时产生SOCA信号触发ADC采样,采样后EOC触发中断。
本程序继续中科昊芯Core_DSC28027核心板,相关资料可以在中科昊芯官网下载
http://www.haawking.cn/kfb
运行效果:
其中CH1为中断运行时间,CH2为ePWM1输出。

例程主要代码:
//
// 主函数:
//
int main(void)
{
//
// Step 1. Initialize System Control:
//
InitSysCtrl(); //120Mhz
//
// Step 2. Initialize GPIO:
//
GpioConfig();
//
// Step 3. Clear all interrupts and initialize PIE vector table:
//
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0X0000;
InitPieVectTable();
EALLOW;
PieVectTable.ADCINT1 = &AdcIsr;
EDIS;
//
// Step 4. Initialize all the Device Peripherals:
//
ePwmConfig();
AdcConfig();
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
IER |= M_INT1;
EINT;
ERTM;
while(1)
{
}
return 0;
}
//
// ADC中断函数:
//
__interrupt void AdcIsr()
{
GpioDataRegs.GPASET.bit.GPIO2 = 1;
AdcCount ++;
DELAY_US(1);
AdcNum = AdcResult.ADCRESULT0;
GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
AdcRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
//
// ePWM配置函数
//
void ePwmConfig()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EPwm1Regs.TBCTL.bit.SYNCOSEL = 0;
EPwm1Regs.TBCTL.bit.PHSEN = 1;
EPwm1Regs.TBPHS.half.TBPHS = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = 2; //向上向下计数模式设置为CTR的计数方式 2
EPwm1Regs.TBCTL.bit.PHSEN = 0;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.TBCTL.bit.CLKDIV = 0;
EPwm1Regs.TBCTL.bit.FREE_SOFT = 1;
EPwm1Regs.TBPRD = 1200;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.CMPA.half.CMPA =600;
EPwm1Regs.CMPB = 600;
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;
EPwm1Regs.TZSEL.bit.CBC6 = 1;
EPwm1Regs.TZCTL.bit.TZA = 2;
EPwm1Regs.TZCTL.bit.TZB = 2;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.ETSEL.bit.SOCASEL = 2;
EPwm1Regs.ETPS.bit.SOCAPRD = 1;
EPwm1Regs.ETCLR.bit.SOCA = 1;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
}
//
// ADC配置函数:
//
void AdcConfig()
{
InitAdc();
EALLOW;
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1;
AdcRegs.ADCSAMPLEMODE.all=0;
AdcRegs.ADCCTL1.bit.INTPULSEPOS=1; //中断脉冲产生:在ADC转换结果产生之后
AdcRegs.ADCSOC0CTL.bit.CHSEL=1;
AdcRegs.ADCSOC0CTL.bit.TRIGSEL=5;
AdcRegs.ADCSOC0CTL.bit.ACQPS=6;
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1;
AdcRegs.INTSEL1N2.bit.INT1CONT=1;
AdcRegs.INTSEL1N2.bit.INT1SEL=0; //EOC1 TRIG
AdcRegs.INTSEL1N2.bit.INT1E=1;
EDIS;
}
关于中科昊芯
“智由芯生 创享未来”,中科昊芯是数字信号处理器专业供应商。作为中国科学院科技成果转化企业,瞄准国际前沿芯片设计技术,依托多年积累的雄厚技术实力及对产业链的理解,以开放积极的心态,基于开源指令集架构RISC-V,打造多个系列数字信号处理器产品,并构建完善的处理器产品生态系统。产品具有广阔的市场前景,可广泛应用于数字信号处理、工业控制及电机驱动、数字电源、消费电子、白色家电等领域。
