This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我正在尝试触发 ADC、以便在 PWM2B 的下降沿开始转换。 当我在 PWM1B 上触发转换时、我能够生成 ADC 中断并最终从通道10读取一个值(当我置位时:EPwm1Regs.ETSEL.bit.SOCBSEL = 6;和 AdcRegs.ADCSOC0CTL.bit.TRIGSEL=6;
是否有人可以告诉我、该设置中缺少哪些内容可防止 SOC 或 EOC 中断发生? 谢谢你!!
这是我的设置
/*配置 ADC */
EALLOW;
AdcRegs.INTSEL1N2.bit.INT1E = 1; //启用 ADCINT1 *
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //禁用 ADCINT1连续模式*
AdcRegs.INTSEL1N2.bit.INT1SEL = 0; //设置 EOC0以触发 ADCINT1触发*
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0xA; //将 SOC0通道选择设置为 ADCINB2 *
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 8; //设置 SOC0在 EPWM1B 上启动触发器,因为轮询 SOC0先转换,然后 SOC1 */
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; //将 SOC0 S/H 窗口设置为7个 ADC 时钟周期,(6个 ACQPS 加1)*/
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 0; //配置早期中断*
EDIS;
/*假定 ePWM1时钟已在 InitSysCtrl()中启用;*/
EPwm2Regs.ETSEL.bit.SOCBEN = 1; //在 B 组上启用 SOC *
EPwm2Regs.ETSEL.bit.SOCBSEL = 8; //从 CPMB 中选择 SOC,进行向上计数*/
EPwm2Regs.ETPS.bit.SOCBPRD = 0; /*在发生第一个事件时生成脉冲*
/*PWM2:设置周期/占空比/计数模式*/
EPwm2Regs.TBPHS.Half.TBPHS = 0; //PHASE /*将 PHASE 寄存器设置为0 *
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; //TB_ENABLE; //禁用相位加载*
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; /*时钟与 SYSCLKOUT 的比率*
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; //将 PWM2A 设置为零
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在递增计数时按匹配清除 PWM1A *
EPwm2Regs.AQCTLB.bit.ZRO = AQ_SET; //将 PWM1B 设置为零*
EPwm2Regs.AQCTLB.bit.CBU = AQ_CLEAR; //在计数 B 递增时按匹配清除 PWM2B */
EPwm2Regs.CMPB = 180; //设置比较 B 值*/
EPwm2Regs.CMPA.half.CMPA = 250; //设置比较值*
EPwm2Regs.TBPRD =周期; //为 ePWM1设置周期*
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; /*先递增后启动*
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//TB_SYNC_IN;
你好!
我再次回到同一个问题。 我正在尝试使用2个 PWM (在 每个 PWM 的下降沿处于120度相移)来触发同一模拟信号的 SOC。 我使用以下配置:
/*配置 ADC */
EALLOW;
AdcRegs.INTSEL1N2.bit.INT1E = 1; //启用 ADCINT1 *
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //禁用 ADCINT1连续模式*
AdcRegs.INTSEL1N2.bit.INT1SEL = 0; //设置 EOC0以触发 ADCINT1触发*
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0xA; //将 SOC0通道选择设置为 ADCINB2 *
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = ADCTRIG_EPWM1_SOCB;//6; //设置 EPWM1B 上的 SOC0启动触发器,因为轮询 SOC0先转换,然后 SOC1 */
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; //将 SOC0 S/H 窗口设置为7个 ADC 时钟周期,(6个 ACQPS 加1)*/
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 0; //配置早期中断*
EDIS;
/*配置 ADC */
EALLOW;
AdcRegs.INTSEL1N2.bit.INT1E = 1; //启用 ADCINT2 *
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //禁用 ADCINT2连续模式*
AdcRegs.INTSEL1N2.bit.INT1SEL = 1; //设置 EOC1以触发 ADCINT2触发*/
AdcRegs.ADCSOC1CTL.bit.CHSEL =0xA; //将 SOC1通道选择设置为 ADCINB0 *
AdcRegs.ADCSOC1CTL.bit.TRIGSEL= ADCTRIG_EPWM2_SOCB; //设置 EPWM1B 上的 SOC1启动触发器,因为轮询 SOC0先转换,然后 SOC1 */
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; //将 SOC1 S/H 窗口设置为7个 ADC 时钟周期,(6个 ACQPS 加1)*/
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 0; //配置早期中断*
EDIS;
当我获得一个 ISR 时、我会检查设置标志位以查看触发事件的是哪个位、结果是在两个 if 语句中都设置了标志位。
if (EPwm1Regs.ETFlG.bit.SOCB=1)
{
GpioDataRegs.GPBTOGGLE.bit.GPIO32=1;
EPwm1Regs.ETCLR.bit.SOCB = 1;
}
if (EPwm2Regs.ETFlG.bit.SOCB=1)
{
GpioDataRegs.GPBTOGGLE.bit.GPIO32=1;
EPwm2Regs.ETCLR.bit.SOCB = 1;
}
请告诉我缺少配置的内容。
最后、我要做的是触发 CLA、为每个 PWM 触发后采样的三个 ADC 值中的每个值计算 PID 值。 请告知您如何继续。
此致!