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.

[参考译文] TM4C1231D5PZ:同时在两个 ADC 上执行多个 ADC 序列。

Guru**** 2502205 points
Other Parts Discussed in Thread: TM4C1231D5PZ

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1261101/tm4c1231d5pz-multiple-adc-sequences-over-both-adcs-at-the-same-time

器件型号:TM4C1231D5PZ

您好

在 TM4C1231D5PZ 上使用两个 ADC 时都遇到一些问题。
两个 ADC 似乎都配置正确、引脚多路复用似乎也可以。
由于某种原因、我无法读取所有渠道。

我使用的是通道0 - 11和20。
ADC0上的通道0 - 7、ADC 1上的通道8 - 11 + 20。
通道10 + 11 + 20的读数为0 (而在使用示波器或万用表进行测量之后、引脚上肯定会有一些电压)。
它不是0'ish、它只是0。  
看起来 ADC 由于某种原因没有开始工作。

两个 ADC 都按序列0进行配置、并且使用 ADC_TRIGGER_Always。
处理器以80 MHz 的频率运行。

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

    您好!

     我不确定您为什么会在通道10、11和20上测量0。 您可以做三次实验吗?

     关闭 ADC0。 仅使用 ADC1来测量8-11 + 20。  10、11和20是否会得到正确读数?

     关闭 ADC0。 仅使用 ADC1来测量 10、11和20的三个通道? 结果如何。  

     3.仅将 ADC0用于 8 - 11 + 20。 结果是什么?

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

    感谢您的快速回复。

    执行此操作将为我提供相同的输出。 通道10、11和20保持为0、而8和9具有读数。

    2.仅使用通道10、11和20就可以读取10和11

    3.为 ADC0交换 ADC1,为我提供通道的正确读数

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

    尊敬的 Ayrton:

     感谢您收集这些数据点。  

     -您能分享您的代码吗?

     -如何配置时钟? 我想知道它是否与下面的勘误表有关。  

     -你是否有另一个板,你可以重复同样的问题?

     抱歉、您能再尝试两次 实验吗、因为我从未遇到过这样的问题报告?

     -关闭 ADC0并仅使用 ADC1。 使用 ADC1以该顺序 10、11、20、8、9进行采样、而不是8、9、10、11、20。 您是否仍会看到10、11、20等于0、同时正确采样8和9?

     -关闭 ADC0并仅使用 ADC1。 使用 ADC1在   一个序列发生器(例如 SS0)中采样10、11、20,而在另一个序列发生器(例如 SS1)上采样8、9。  您是否仍会看到10、11、20等于0、同时正确采样8和9?

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

    您好

    我在下面添加了代码。 这仅是代码的 ADC 部分。  

    #define MAX_ADC0_CHANNELS       8
    #define MAX_ADC1_CHANNELS       5
    
    #define ADC_5V                  ADC_CTL_CH0
    #define ADC_3V3                 ADC_CTL_CH1
    #define ADC_2V5                 ADC_CTL_CH2
    #define ADC_1V8                 ADC_CTL_CH3
    #define ADC_1V5                 ADC_CTL_CH4
    #define ADC_1V2                 ADC_CTL_CH5
    #define ADC_1V1                 ADC_CTL_CH6
    #define ADC_3V3A                ADC_CTL_CH7
    #define ADC_12V                 ADC_CTL_CH8
    #define ADC_1V8A                ADC_CTL_CH9
    #define ADC_n5V                 ADC_CTL_CH10
    #define ADC_1V                  ADC_CTL_CH11
    #define ADC_1V8B                ADC_CTL_CH20
    
    struct adc_channel {
        uint32_t channel;
        int nominal_voltage_d;
        int nominal_voltage_a;
        int min_voltage;
        int max_voltage;
    };
    
    enum adc0_index {
        _5V,
        _1V,
        _1V8,
        _1V5,
        _1V2,
        _3V3,
        _2V5,
        _1V1
    };
    
    enum adc1_index {
        _3V3A,
        _12V,
        _1V8A,
        _n5V,
        _1V8B
    };
    
    const struct adc_channel adc0[] = {
        {ADC_5V,    _5V_DIGITAL,    _5V_ANALOG,        _5V_DIGITAL - _5V_DIFF,          _5V_DIGITAL + _5V_DIFF},
        {ADC_1V,    _1V_DIGITAL,    _1V_ANALOG,        _1V_DIGITAL - _1V_DIFF,          _1V_DIGITAL + _1V_DIFF},
        {ADC_1V8,   _1V8_DIGITAL,   _1V8_ANALOG,       _1V8_DIGITAL - _1V8_DIFF,        _1V8_DIGITAL + _1V8_DIFF},
        {ADC_1V5,   _1V5_DIGITAL,   _1V5_ANALOG,       _1V5_DIGITAL - _1V5_DIFF,        _1V5_DIGITAL + _1V5_DIFF},
        {ADC_1V2,   _1V2_DIGITAL,   _1V2_ANALOG,       _1V2_DIGITAL - _1V2_DIFF,        _1V2_DIGITAL + _1V2_DIFF},
        {ADC_3V3,   _3V3_DIGITAL,   _3V3_ANALOG,       _3V3_DIGITAL - _3V3_DIFF,        _3V3_DIGITAL + _3V3_DIFF},
        {ADC_2V5,   _2V5_DIGITAL,   _2V5_ANALOG,       _2V5_DIGITAL - _2V5_DIFF,        _2V5_DIGITAL + _2V5_DIFF},
        {ADC_1V1,   _1V1_DIGITAL,   _1V1_ANALOG,       _1V1_DIGITAL - _1V1_DIFF,        _1V1_DIGITAL + _1V1_DIFF},
    };
    
    const struct adc_channel adc1[] = {
       {ADC_3V3A,   _3V3A_DIGITAL,  _3V3A_ANALOG,      _3V3A_DIGITAL - _3V3A_DIFF,      _3V3A_DIGITAL + _3V3A_DIFF},
       {ADC_12V,    _12V_DIGITAL,   _12V_ANALOG,       _12V_DIGITAL - _12V_DIFF,        _12V_DIGITAL + _12V_DIFF},
       {ADC_1V8A,   _1V8A_DIGITAL,  _1V8A_ANALOG,      _1V8A_DIGITAL - _1V8A_DIFF,      _1V8A_DIGITAL + _1V8A_DIFF},
       {ADC_n5V,    _n5V_DIGITAL,   _n5V_ANALOG,       _n5V_DIGITAL - _n5V_DIFF,        _n5V_DIGITAL + _n5V_DIFF},
       {ADC_1V8B,   _1V8B_DIGITAL,  _1V8B_ANALOG,      _1V8B_DIGITAL - _1V8B_DIFF,      _1V8B_DIGITAL + _1V8B_DIFF},
    };
    
    void irq_handler()
    {
    	//handle IRQ
    }
    
    int setup_adc_sequence0(uint32_t adc_base,const struct adc_channel * adc_channels, int channels)
    {
        int i = 0;
    
        ADCClockConfigSet(adc_base, ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_EIGHTH, 1);
    
        for(i = 0; i < channels; i++) {
            if(i != channels - 1)
                ADCSequenceStepConfigure(adc_base, 0, i,  adc_channels[i].channel);
            else
                ADCSequenceStepConfigure(adc_base, 0, i,  adc_channels[i].channel | ADC_CTL_IE | ADC_CTL_END);
        }
    
        ADCSequenceConfigure(adc_base, 0, ADC_TRIGGER ALWAYS, 3);
    
        ADCIntClear(adc_base, 0);
    	ADCSequenceEnable(adc_base, 0);
    
        ADCIntRegister(adc_base, sequence, irq_handler);
    	ADCIntEnable(adc_base, 0);
    
        return 0;
    }
    
    int setup_adc()
    {
        int i = 0;
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC1);
    
        ADCReferenceSet(ADC0_BASE, ADC_REF_INT);
        ADCReferenceSet(ADC1_BASE, ADC_REF_INT);
    
        for(i = 0; i <= 5; i++)
            GPIOPinTypeADC(GPIO_PORTE_BASE, 0x01 << i);
    
        for(i = 4; i <= 7; i++)
            GPIOPinTypeADC(GPIO_PORTD_BASE, 0x01 << i);
    
        GPIOPinTypeADC(GPIO_PORTB_BASE, GPIO_PIN_4);
        GPIOPinTypeADC(GPIO_PORTB_BASE, GPIO_PIN_5);
        GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_7);
    
        setup_adc_sequence0(ADC0_BASE, adc0, MAX_ADC0_CHANNELS);
        setup_adc_sequence0(ADC1_BASE, adc1, MAX_ADC1_CHANNELS);
    
        return 0;
    }
    
    int main(void)
    {
        SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_OSC_INT);
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
    	
        SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_ADC0);
        SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_ADC1);
    	
    	setup_adc();
    	
    	//do other stuff
    	
    	return 0;
    }
    

    在上面的代码中完成时钟配置。
    我使用的主时钟 SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_OSC_INT); 、并通过  ADCClockConfigSet(adc_base, ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_EIGHTH, 1);

    已对3个电路板全部使用 TM4C1231D5PZ 进行了测试。 都遇到相同的问题。

    1. 在这种情况下,10和11是可读的。 其他则不是。
    2、我必须要尝试,当我有了,我就来了。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    ADC0上的通道0 - 7、ADC 1上的通道8 - 11 + 20。

    这不是我在代码中看到的。  

    根据我在以下代码中看到的内容、ADC1的五个通道分别为7、8、9、10和20、而不是8、 9、10、11和20。 您实际上正在跳过 CH11。 我不知道您的代码中是否存在其他问题。  

    常量结构 ADC_CHANNEL ADC1[]={
    ADC_3V3A、_3V3A_digital、_3V3A_analog、_3V3A_digital -_3V3A_diff、_3V3A_digital +_3V3A_diff}、
    adc_12V、_12V_digital、_12V_analog、_12V_digital -_12V_diff、_12V_digital +_12V_diff}、
    ADC_1V8A、_1V8A_digital、_1V8A_analog、_1V8A_digital -_1V8A_diff、_1V8A_digital +_1V8A_diff}、
    adc_n5V、_n5V_digital、_n5V_analog、_n5V_digital -_n5V_diff、_n5V_digital +_n5V_diff}、
    ADC_1V8B、_1V8B_digital、_1V8B_analog、_1V8B_digital -_1V8B_diff、_1V8B_digital +_1V8B_diff}、
    };

    #define ADC_3V3A ADC_CTL_CH7
    #define ADC_12V ADC_CTL_CH8
    #define ADC_1V8A ADC_CTL_CH9
    #define ADC_n5V ADC_CTL_CH10
    #define ADC_1V ADC_CTL_CH11
    #define ADC_1V8B ADC_CTL_CH20

    我知道您是在尝试以 紧凑的方式使用 for 循环来初始化 ADC。 但是、为了调试您的问题、我建议您至少目前按如下所示配置通道。 它可能不是最优雅的方式、但它更具可读性。 您可能需要对 ADC0执行同样的操作。 您可以重复同样的问题吗?  

    ADCSequenceStepConfigure (ADC1_BASE、0、0、ADC_CTL_CH8);//通道8是 SS0的阶跃0。
    ADCSequenceStepConfigure (ADC1_BASE、0、1、ADC_CTL_CH9);//通道9是 SS0的阶跃1。
    ADCSequenceStepConfigure (ADC1_BASE、0、2、ADC_CTL_CH10);//通道10是 SS0的阶跃2。
    ADCSequenceStepConfigure (ADC1_BASE、0、3、ADC_CTL_CH11);//通道11是 SS0的阶跃3。
    ADCSequenceStepConfigure (ADC1_BASE、0、4、ADC_CTL_CH20 | ADC_CTL_IE | ADC_CTL_END)//  

    在您的第73行、为什么要使用 ADC_CLOCK_RATE_八分之一 跳过采样? 为什么现在不删除这一行? 如果您出于任何原因需要在应用中使用它、可以在您了解导致当前问题的原因后再将其添加回去。 最好的做法始终是从简单的配置开始,然后再升级。