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.

[参考译文] TM4C123GH6PM:PWM 触发 ADC 模块 — 在 PWM 高电平和 PWM 低电平的中间位置

Guru**** 2925550 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1580133/tm4c123gh6pm-pwm-triggering-adc-module---on-both-middle-of-pwm-high-and-pwm-low

器件型号:TM4C123GH6PM


您好:

我正在使用 PWM 模块 0(发生器 0)生成 2 个 PWM 信号、但来自同一个发生器。

在 PWM 高电平的中间触发 ADC、其中:

MAP_PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_TR_CNT_LOAD);

和:


MAP_ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_PWM0、0);      
MAP_ADCSequenceConfigure (ADC0_BASE、2、ADC_TRIGGER_PWM0、1);

现在可以正常运行。 但我也想在计数器达到零时触发 ADC、因此 ADC 在导通时间和关断时间的中间同时触发。

I CAN MAP_PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_TR_CNT_LOAD | PWM_TR_CNT_ZERO);


要触发零值和负载值的事件、可以有效地触发 ADC — 但是否可以知道哪个是 ADC? 现在、我们使用了触发器、所以进入了 ADC tru 硬件。  

我知道我们可以创建 CMPA 和 CMPB 来触发中断、然后处理器会触发 ADC。 但鉴于 PWM 的高频率、我想避免这种情况。 是否有办法区分触发器、以便我可以将不同的 ADC 序列附加 到触发器上? 我已经阅读了数据表、Tiva-c 软件手册和源代码。 我认为答案是否定的、但仍决定向论坛提问。

MAP_ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_PWM0、0);

我们需要一种方法来配置序列、其中包含来自 pwm0 的触发信号、但触发信号类型不同。

 

此致、

c.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    我做了一种方法、从中读取 PMW_O_0_RIS、然后检查 PWM_0_RIS_INTCNTLOAD 或 PWM_0_RIS_INTCNTZERO。
    我还通过写入 HWREG (PWM0_BASE + PWM_O_0_ISC)= PWM_0_RIS_INTCNTLOAD 来清除这些寄存器;

    它确实有效、但我不确定是否可以干预类似这样的 PWM 发生器中断状态。 如果 ISR 未被清除、则不起作用。

    我想知道这种方法是否会产生一些影响。

    此致、

    c.

    void ADC0SS1IntHandler(void) {
      PWM_RIS = HWREG(PWM0_BASE + PWM_O_0_RIS);
      MAP_ADCIntClear(ADC0_BASE, 1);
      if(PWM_RIS & PWM_0_RIS_INTCNTLOAD) {
        HWREG(PWM0_BASE + PWM_O_0_ISC) = PWM_0_RIS_INTCNTLOAD;
        MAP_ADCSequenceDataGet(ADC0_BASE, 1, adc_fifo_right_load);
        adc_ss1_load_flag = true;
      } else if(PWM_RIS & PWM_0_RIS_INTCNTZERO) {
        HWREG(PWM0_BASE + PWM_O_0_ISC) = PWM_0_RIS_INTCNTZERO;
        MAP_ADCSequenceDataGet(ADC0_BASE, 1, adc_fifo_right_zero);
        adc_ss1_zero_flag = true;
      }
    }