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;
那么、您说 ePWM1 SOCB 工作、但 ePWM2 SOCB 不工作?
您能否在 CCS 中上拉"Registers"视图、并确保 ePWM2已加电、并且正确的值正在写入寄存器中? 我不认为您要写入的任何内容受 EALLOW 保护、但我最好仔细检查。
转换是否仍在进行、但仅缺少中断? 还是结果寄存器也不更新?
谢谢、
惠特尼
非常感谢您的帮助! 我成功解决了我的问题。 尽管我仍有疑问:
我有3个 EPWM:PWM1B、PWM2B 和 PWM3B、并且我已经将这些 EPWM 配置为触发 ADC 转换启动(在 EPWMB 通道的下降沿上) 、最终生成 ADC ISR。
我是否可以在 ISR 内部找出是哪个 ePWM (在这三个中的一个)导致了 ADC 转换?
谢谢!
你好!
我再次回到同一个问题。 我正在尝试使用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 值。 请告知您如何继续。
此致!