在28335里面,使用PWM来触发AD转换,PWM为20K的频率,因此AD转换也是20K的频率,我是想配置为在PWM高电平的中间时刻来触发AD转换中断,但无论我怎么配置,都不能达到我的目标,虽然AD转换中断的频率和PWM频率严格同步了,但AD中断的时刻,始终不是在PWM高电平的中间时刻开始。下面是我的AD和PWM的配置代码,大家帮我看看:
//------------------------------------------------------
//初始化ADC模块
//高速外设时钟HSPCLK = SYSCLKOUT/(2*HISPCP)
//ADC核时钟ADCLK = HSPCLK/(2*ADCCLKPS*(CPS+1))
//采样窗口宽度(周期)SOC = (ACQ_PS+1)*ADCCLK
//------------------------------------------------------
void ADC_init(void)
{
AdcRegs.ADCTRL1.bit.CONT_RUN = 1;//连续转换模式从初始状态开始,对于SEQ1和级联模式从CONV00开始,SEQ2从CONV08开始
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1;//使能在MAX CONVn设置的转换完成后环绕覆盖序列发生器转换结果
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;//双序列发生器模式,SEQ1和SEQ2作为两个8状态序列发生器操作
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0;//SEQ1每一个EOS结束都置位INT_SEQ1中断标志位
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//使能SEQ1中断
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0;//关闭SEQ1软件触发
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;//使能EPWM1SOCA触发ADC
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 1;//设置最大转换通道数
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除SEQ1中断标志位INT_SEQ1
AdcRegs.ADCCHSELSEQ1.all = 0x3210;//SEQ1选择ADCINA0为模拟输入
AdcRegs.ADCCHSELSEQ2.all = 0x7654;
AdcRegs.ADCCHSELSEQ3.all = 0xBA98;
AdcRegs.ADCCHSELSEQ4.all = 0xFEDC;
AdcRegs.ADCREFSEL.bit.REF_SEL = 0;//ADC参考电压,为内部参考
SysCtrlRegs.HISPCP.all = 6;//高速外设时钟预分频系数HISPCP
AdcRegs.ADCTRL3.bit.ADCCLKPS = 10;//ADC核时钟分频器系数ADCCKLPS
AdcRegs.ADCTRL1.bit.CPS = 1;//ADC核预订标器系数CPS
AdcRegs.ADCTRL1.bit.ACQ_PS = 15;//采集窗口
AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3;//ADC带隙电路和参考电路加电
DELAY_US(100000);//延时10MS
AdcRegs.ADCTRL3.bit.ADCPWDN = 1;//ADC模块加电
DELAY_US(500);
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//ADC转换中断允许
EALLOW; //
PieVectTable.SEQ1INT = &Isr_SEQ1_ADC;
EDIS; //
}
//------------------------------------------------------
//初始化PWM模块
//PWM频率=SYSCLK/(2^CLKDIV X 2*HSPCLKDIV X 2*TBPRD)
//------------------------------------------------------
void EPWM1_init(void)
{
EPwm1Regs.TBPRD = 1875;//设置PWM频率,和CLKDIV,HSPCLKDIV组合,得到20K调制频率
EPwm1Regs.TBPHS.half.TBPHS = 1000;//相位置零
EPwm1Regs.TBCTR = 0;//时间基准计数寄存器
//配置时间基准控制寄存器
EPwm1Regs.TBCTL.bit.CLKDIV = 0;//时间基准控制寄存器,设置时间基准时钟预分频位
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;//时间基准控制寄存器,设置高速外设时钟预分频位
EPwm1Regs.TBCTL.bit.SWFSYNC = 0;//0不产生同步脉冲,1产生同步脉冲
EPwm1Regs.TBCTL.bit.SYNCOSEL = 3;//0同步信号源是EPWMxSYNC,3禁止同步信号输出
EPwm1Regs.TBCTL.bit.PRDLD = 0;//启动TBPRD的映射寄存器
EPwm1Regs.TBCTL.bit.PHSEN = 0;//禁止从时间基准寄存器TBPHS加载到时间基准计数器TBCTR
EPwm1Regs.TBCTL.bit.CTRMODE = 2;//设置时间基准计数器模式为递增递减模式
//配置计数比较控制寄存器
EPwm1Regs.CMPCTL.bit.SHDWAMODE= 0;
EPwm1Regs.CMPCTL.bit.LOADAMODE= 2;
//配置动作限定输出A控制寄存器
EPwm1Regs.AQCTLA.bit.CAD = 2;//递减计数匹配时,PWM引脚为高电平
EPwm1Regs.AQCTLA.bit.CAU = 1;//递增计数匹配时,PWM引脚为低电平
//EPwm1Regs.AQCTLA.bit.PRD = 2;
//EPwm1Regs.AQCTLA.bit.ZRO = 1;
//EPwm1Regs.AQCTLA.bit.CBD = 1;
//EPwm1Regs.AQCTLA.bit.CBU = 2;
//配置动作限定输出B控制寄存器
//EPwm1Regs.AQCTLB.bit.CAD = 1;
//EPwm1Regs.AQCTLB.bit.CAU = 2;
//EPwm1Regs.AQCTLB.bit.CBD = 2;
//EPwm1Regs.AQCTLB.bit.CBU = 1;
//配置死区
//EPwm1Regs.DBCTL.bit.IN_MODE = 0;//死区延时信号来至ePWM1A
EPwm1Regs.DBCTL.bit.POLSEL = 0;//置PWM1A和PWM1B在死区模式下的极性
//EPwm1Regs.DBCTL.bit.OUT_MODE = 3;//死区对于上升沿延迟和下降沿延时全使能
//EPwm1Regs.DBRED = 00;//上升沿死区延迟寄存器
//EPwm1Regs.DBFED = 00;//下降沿死区延迟寄存器
//配置事件触发寄存器
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//当PWM为递减匹配高电平递增匹配低电平时TBCTR计数值为0时,启动ADC转换
//反之,当PMW为递减匹配低电平递增匹配高电平时,TBCTR计数值=TBPRD时,启动ADC
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//使能EPWM1A脉冲触发ADC转换
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在第一个事件上生成EPWM1ASCOA脉冲
EPwm1Regs.CMPA.half.CMPA = 800;//计数比较A寄存器
EPwm1Regs.CMPB = 00;//计数比较B寄存器
}