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.

[参考译文] EK-TM4C123GXL:由 PWM 触发的 TM4C123GH6PM ADC (仅上升沿)

Guru**** 2768865 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/1064729/ek-tm4c123gxl-tm4c123gh6pm-adc-trigger-by-pwm-only-rising-edge

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:TM4C123GH6PMTM4C123

我想在 EK-TM4C132GXL 开发板上执行 ADC 计算。 但我想使用 PWM 信号进行该计算。 简而言之、每次 PWM 信号处于上升沿时、我希望 ADC 在该时刻触发并采样、然后继续此过程、但我无法这么做、您能帮我吗?

#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/sysctl.h"
#include "driverlib/adc.h"
#define target_in_blizzard_RB1
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h"
#include "driverlib/gpio.h"
#include "driverlib/pwm.h"


uint32_t ui32ADCAvg=0;
uint32_t ui32ADC0Value[8]={0};
uint32_t ui32Load=0;
int cnt = 0;
void handler_adc (void);

void adc_init (void);
void PWM_init (void);

int main (空)

//将系统时钟设置为80MHz 并启用外设 ADC0和 GPIO 端口 B 的时钟
SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);

//handler_adc();
PWM_init();
adc_init();
while (1)

//清除序列发生器0的 ADC 中断(如果已生成)
//ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[0]);
/*ADCSequenceDataGet (ADC0_BASE,1,\ui32ADC0Value[1]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[2]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[3]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[4]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[5]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[6]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[7]);*/
//触发序列发生器0的 ADC 采样
//ADCProcessorTrigger (ADC0_BASE、1);
//等待程序直到转换未完成
// while (ADCIntStatus (ADC0_BASE、1、false);
//将值存储到 ADC0的序列发生器0中的数组中
//计算读数的平均值


void ADC_init (void)

SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
//SysCtlADCSpeedSet (SYSCTL_ADCSPEED_250kSPS);

//在 ADC0上启用硬件取平均值
ADCHardwareOversampleConfigure (ADC0_BASE、64);//

//配置为使用 ADC0、采样序列发生器0、处理器来触发序列并使用最高优先级
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PWM0、1);
//将 PB4配置为模拟输入引脚
//GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);
//将序列发生器0上的所有8个步骤配置为采样温度传感器

ADCSequenceStepConfigure (ADC0_BASE,1,0,ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE,1,1,ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE,1,2,ADC_CTL_CH0);
//ADCSequenceStepConfigure (ADC0_BASE、1、3、ADC_CTL_CH0);
/*ADCSequenceStepConfigure (ADC0_BASE,1,4,ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE,1,5,ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE,1,6,ADC_CTL_CH0);*/

//在序列发生器0上标记为最后一次转换,并在采样完成时启用中断标志生成
ADCSequenceStepConfigure (ADC0_BASE、1、3、ADC_CTL_CH0|ADC_CTL_IE|ADC_CTL_END);
ADCIntEnable (ADC0_BASE、1);
ADCIntRegister (ADC0_BASE、1、handler_ADC);

//启用序列发生器0
ADCSequenceEnable (ADC0_BASE、1);
//ADCIntClear (ADC0_BASE、0);
//ADCIntEnable (ADC0_BASE、0);
//IntEnable (ADC_INT_SS0);
ADCProcessorTrigger (ADC0_BASE、1);

void PWM_init (void)

//初始化 PB7 M0PWM1
SysCtlPWMClockSet (SYSCTL_PWMDIV_1);//在 SYSCTL.c 中定义的时钟
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);// TM4C123GH6PM 有两个模块(0和1)
//SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);// TM4C123GH6PM 有两个模块(0和1)
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
//GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_7);
GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_6);
GPIOPinConfigure (GPIO_PB6_M0PWM0);
//GPIOPinConfigure (GPIO_PB7_M0PWM1);
//IntEnable (INT_PWM0_0_TM4C123);


PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
ui32Load =(SysCtlClockGet ()/25000);
/*PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、ui32Load);
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、900);
PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT、TRUE);
PWMGenEnable (PWM0_BASE、PWM_GEN_0);*/

PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、ui32Load);
PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_TR_CNT_LOAD | PWM_TR_CNT_ZERO | PWM_INT_CNT_ZERO | PWM_INT_CNT_LOAD |
PWM_INT_CNT_AU | PWM_INT_CNT_AD | PWM_INT_CNT_BU |
PWM_INT_CNT_BD | PWM_TR_CNT_ZERO |
PWM_TR_CNT_LOAD | PWM_TR_CNT_AU | PWM_TR_CNT_AD |
PWM_TR_CNT_BU | PWM_TR_CNT_BD );

PWMGenEnable (PWM0_BASE、PWM_GEN_0);
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、2700);
PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT、TRUE);

void handler_adc (void)

ADCIntClear (ADC0_BASE、1);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[0]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[1]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[2]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[3]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[4]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[5]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[6]);
ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[7]);
CNT++;
ui32ADCAvg =(ui32ADC0Value[0]+ui32ADC0Value[1]+ui32ADC0Value[2]+ui32ADC0Value[3]+ui32ADC0Value[4]+ui32ADC0Value[5]+ui32ADC0Value[6]+ui32ADC0Value[7]+ui32ADC0Value/ADC0Value[7]+ui32ADC0Value8);

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

    您好!

     以下是您编写的代码。 在  ADCSequenceConfigure 中,指定序列发生器0,而在 ADCSequenceStepConfigure 中,指定序列发生器1。  您需要将序列发生器0用于 ADCSequenceStepConfigure。

    //配置为使用 ADC0、采样序列发生器0、处理器来触发序列并使用最高优先级
    ADCSequenceConfigure (ADC0_BASE、 0、ADC_TRIGGER_PWM0、1);
    //将 PB4配置为模拟输入引脚
    //GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);
    //将序列发生器0上的所有8个步骤配置为采样温度传感器

    ADCSequenceStepConfigure (ADC0_BASE, 1,0,ADC_CTL_CH0);
    ADCSequenceStepConfigure (ADC0_BASE, 1,1,ADC_CTL_CH0);
    ADCSequenceStepConfigure (ADC0_BASE, 1,2,ADC_CTL_CH0);

    另外、请注意、由于我们的论坛支持团队正在休假、从今天开始、我们的响应将延迟到明年。  

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

    我还更改了代码的这一部分、但它仍然无法按我的要求工作。 在这里、我要测量 ADC 的 POT 值、但我希望在 PWM 信号每次位于上升沿时测量该测量值。 我在这里缺少一些东西、您能帮些什么吗? 现在、我正在积极测量的值在最大值时约为3400。 通常、我需要在0-4096之间测量此值。 我应该为此添加什么代码?

    #include
    #include
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/debug.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/adc.h"
    #define target_in_blizzard_RB1
    #include "driverlib/rom.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pwm.h"


    uint32_t ui32ADCAvg=0;
    uint32_t ui32ADC0Value[8]={0};
    uint32_t ui32Load=0;
    int cnt = 0;
    void handler_adc (void);

    void adc_init (void);
    void PWM_init (void);

    int main (空)

    //将系统时钟设置为80MHz 并启用外设 ADC0和 GPIO 端口 B 的时钟
    SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);

    //handler_adc();
    PWM_init();
    adc_init();
    while (1)

    //清除序列发生器0的 ADC 中断(如果已生成)
    //ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[0]);
    /*ADCSequenceDataGet (ADC0_BASE,1,\ui32ADC0Value[1]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[2]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[3]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[4]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[5]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[6]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[7]);*/
    //触发序列发生器0的 ADC 采样
    //ADCProcessorTrigger (ADC0_BASE、1);
    //等待程序直到转换未完成
    // while (ADCIntStatus (ADC0_BASE、1、false);
    //将值存储到 ADC0的序列发生器0中的数组中
    //计算读数的平均值


    void ADC_init (void)

    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
    //SysCtlADCSpeedSet (SYSCTL_ADCSPEED_250kSPS);

    //在 ADC0上启用硬件取平均值
    ADCHardwareOversampleConfigure (ADC0_BASE、64);//
    ADCSequenceDisable (ADC0_BASE、1);

    //配置为使用 ADC0、采样序列发生器0、处理器来触发序列并使用最高优先级
    ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_PWM0、1);
    //将 PB4配置为模拟输入引脚
    //GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);
    //将序列发生器0上的所有8个步骤配置为采样温度传感器

    ADCSequenceStepConfigure (ADC0_BASE,1,0,ADC_CTL_CH0);
    //ADCSequenceStepConfigure (ADC0_BASE,1,1,ADC_CTL_CH0);
    //ADCSequenceStepConfigure (ADC0_BASE、1、2、ADC_CTL_CH0);
    //ADCSequenceStepConfigure (ADC0_BASE、1、3、ADC_CTL_CH0);
    /*ADCSequenceStepConfigure (ADC0_BASE,1,4,ADC_CTL_CH0);
    ADCSequenceStepConfigure (ADC0_BASE,1,5,ADC_CTL_CH0);
    ADCSequenceStepConfigure (ADC0_BASE,1,6,ADC_CTL_CH0);*/

    //在序列发生器0上标记为最后一次转换,并在采样完成时启用中断标志生成
    ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH0|ADC_CTL_IE|ADC_CTL_END);
    ADCIntEnable (ADC0_BASE、1);
    ADCIntRegister (ADC0_BASE、1、handler_ADC);

    //启用序列发生器0
    ADCSequenceEnable (ADC0_BASE、1);
    //ADCIntClear (ADC0_BASE、0);
    //ADCIntEnable (ADC0_BASE、0);
    //IntEnable (ADC_INT_SS0);
    ADCProcessorTrigger (ADC0_BASE、1);

    ADCIntClear (ADC0_BASE、0);
    ADCIntEnable (ADC0_BASE、0);
    //IntEnable (ADC_INT_SS0);

    void PWM_init (void)

    //初始化 PB7 M0PWM1
    SysCtlPWMClockSet (SYSCTL_PWMDIV_1);//在 SYSCTL.c 中定义的时钟
    SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);// TM4C123GH6PM 有两个模块(0和1)
    //SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);// TM4C123GH6PM 有两个模块(0和1)
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    //GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_7);
    GPIOPinTypePWM (GPIO_PORTB_BASE、GPIO_PIN_6);
    GPIOPinConfigure (GPIO_PB6_M0PWM0);
    //GPIOPinConfigure (GPIO_PB7_M0PWM1);
    //IntEnable (INT_PWM0_0_TM4C123);


    PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
    ui32Load =(SysCtlClockGet ()/25000);
    /*PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、ui32Load);
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、900);
    PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT、TRUE);
    PWMGenEnable (PWM0_BASE、PWM_GEN_0);*/

    PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
    PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、ui32Load);
    PWMGenIntTrigEnable (PWM0_BASE、PWM_GEN_0、PWM_TR_CNT_LOAD | PWM_TR_CNT_ZERO | PWM_INT_CNT_ZERO | PWM_INT_CNT_LOAD |
    PWM_INT_CNT_AU | PWM_INT_CNT_AD | PWM_INT_CNT_BU |
    PWM_INT_CNT_BD | PWM_TR_CNT_ZERO |
    PWM_TR_CNT_LOAD | PWM_TR_CNT_AU | PWM_TR_CNT_AD |
    PWM_TR_CNT_BU | PWM_TR_CNT_BD );

    PWMGenEnable (PWM0_BASE、PWM_GEN_0);
    PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、2700);
    PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT、TRUE);

    void handler_adc (void)

    ADCIntClear (ADC0_BASE、1);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[0]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[1]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[2]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[3]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[4]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[5]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[6]);
    ADCSequenceDataGet (ADC0_BASE、1、\ui32ADC0Value[7]);
    CNT++;
    ui32ADCAvg =(ui32ADC0Value[0]+ui32ADC0Value[1]+ui32ADC0Value[2]+ui32ADC0Value[3]+ui32ADC0Value[4]+ui32ADC0Value[5]+ui32ADC0Value[6]+ui32ADC0Value[7]+ui32ADC0Value/ADC0Value[7]+ui32ADC0Value8);

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

    一些意见:

    -在 adc_init()中,只在序列发生器1中设置步骤0和1。 您已对几个步骤进行了注释。  

    -在 handler_ADC 中,您尝试从序列发生器1读取八个步骤。 序列发生器1只能采集4个样本。  请参阅以下数据表。  这是第一个问题。 即使您使用支持8个采样的序列发生器0、它也不能在您的代码中工作。 原因是您仅采集两个样本。 因此、只有  ui32ADC0Value[0]和 ui32ADC0Value[1]保存有效数据。 其他则不会。 正如我在原始答复中提到的、如果您想获取8个样本、则需要使用 SS0。  

     -您正在获取  ui32ADC0Value[7:0]中的值的平均值、其中一些值无效。  

     -  请勿调用 ADCHardwareOversampleConfigure(),直到您能够使用基本功能。 此外、如果您使用 的是 ADCHardwareOversampleConfigure、则您已经在使用硬件获取平均值。 为什么要以  8个不同的阶跃对 ADC_CTL_CH0进行测量、然后对其求平均值?

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

    我不会调用 ADCHardwareOversampleConfigure(),在您上面的解释之后,我意识到了错误,但它仍然不能帮助我实现我想要的目标。 您是否了解我的需求?