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 似乎都配置正确、引脚多路复用似乎也可以。
由于某种原因、我无法读取所有渠道。
我使用的是通道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、我必须要尝试,当我有了,我就来了。
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_八分之一 跳过采样? 为什么现在不删除这一行? 如果您出于任何原因需要在应用中使用它、可以在您了解导致当前问题的原因后再将其添加回去。 最好的做法始终是从简单的配置开始,然后再升级。