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 触发 Tiva C ADC

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/785521/tm4c123gh6pm-tiva-c-triggering-adc-by-pwm

器件型号:TM4C123GH6PM

你好。 我有带 TM4C123GH6PM MCU 的定制板和用于驱动 BLDC 电机的 drv835。 我需要在低侧 MOSFET 处于运行状态时测量电流。 我将 PWM 设置为向上/向下计数模式。 我认为、PWM 应该为 ADC 生成触发事件、然后计数器的值等于零。 有我的初始化代码:

void PWM_Init(){
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_PWM0));
PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、PWM_PERIOD);

PWMGenConfigure (PWM0_BASE、PWM_GEN_2、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_2、PWM_PERIOD);

PWMGenConfigure (PWM0_BASE、PWM_GEN_3、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_3、PWM_PERIOD);


PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_INT_CNT_ZERO);

PWMGenEnable (PWM0_BASE、PWM_GEN_0);
PWMGenEnable (PWM0_BASE、PWM_GEN_2);
PWMGenEnable (PWM0_BASE、PWM_GEN_3);


PWMSyncTimeBase (PWM0_BASE、PWM_GEN_0_BIT | PWM_GEN_2_BIT | PWM_GEN_3_BIT);
PWMOutputState (PWM0_BASE、(PWM_OUT_0_BIT | PWM_OUT_4_BIT | PWM_OUT_6_BIT)、true);

}

void ADC_Init(){
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
//
//等待 ADC0模块准备就绪。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0));
//
//启用第一个采样序列发生器以捕获通道0的值
//发生处理器触发。
//
ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_PWM0、0);
ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH1);
ADCSequenceStepConfigure (ADC0_BASE、1、2、ADC_CTL_CH2 |
ADC_CTL_IE | ADC_CTL_END);

ADCIntRegister (ADC0_BASE、1、handler_ADC);

ADCIntEnable (ADC0_BASE、1);

ADCSequenceEnable (ADC0_BASE、1);

}
void handler_ADC (void)
{
unsigned int state = ADCIntStatus (ADC0_BASE、0、true);
ADCIntClear (ADC0_BASE、0);
//TODO
} 

因此、PWM 按预期工作。 但 ADC 没有。 我想获取中断、然后 ADC 完成测量、并从 ADC FIFO 加载结果。 我不知道如何解决这个问题。 我找不到有关此问题的示例。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不清楚您的问题。 如果在 handler_ADC 中放置一个断点、CPU 是否会在那里停止? 您是否更新了矢量表中的矢量处理程序_ADC? 矢量表位于 startup_ccs.c 文件中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没关系。 我看到您使用 ADCIntRegister 注册 handler_ADC。 仍请澄清问题所在。 如果在那里放置一个断点、CPU 是否转到 handler_adc。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我在 ADC 处理程序中放置了断点、但它从不会在那里停止。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试为 PWM0_GEN0模块添加以下行。

    IntEnable (INT_PWM0_0);

    还要确保在下面的某个位置启用 CPU 处理器中断。
    IntMasterEnable();
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它无法解决问题
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还添加
    内部使能(INT_ADC0SS1)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我找到了答案。 它需要启用 PWM 模块中的触发器、而不是中断。

    PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_TR_CNT_ZERO); 

    下一个问题是如何获得每3个通道的结果?  我不确定采样序列的正确设置。

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

    看起来该处理程序工作正常。

    静态 uint32_t 结果[3];
    
    void handler_adc (void)
    {
    ADCIntClear (ADC0_BASE、1);
    
    ADCSequenceDataGet (ADC0_BASE、1、结果);
    ADCSequenceDataGet (ADC0_BASE、1、Results + 1);
    ADCSequenceDataGet (ADC0_BASE、1、Results + 2);
    
    }