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.

[参考译文] CCS/EK-TM4C123GXL:ADC 读取不正确

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/598686/ccs-ek-tm4c123gxl-adc-not-reading-properly

器件型号:EK-TM4C123GXL

工具/软件:Code Composer Studio

大家好、

现在、这是一个更复杂的问题(我想)、我花了几个小时尝试使 ADC 正常工作、但没有成功。 我尝试在引脚 PE0至 PE4、PB4和 PB5上读取7个值。 当我在所有引脚上应用3V3时、PE0 PE1 PE2和 PE3正在正常读取3V3、但其他引脚在3V3和随机值之间波动。 当我尝试单独读取某些引脚时、所有引脚都会波动。

我尝试做的事情:

  • 仅启用 ADC0SS0
  • 启用 ADC0 ADC1、两者均为 SS1
  • 将时钟源从 PIOSC 更改为 PLL  (配置为在两者上提供16MHz)
  • TRIGGER_AST_TIMER 更改为 TRIGGER_TIMER
  • 以低速(1Hz)触发 ADC
  • 注释掉  ADCReferenceSet()

我在项目中启用了以下功能:

  • TIMER0、1、2、3、4、5
  • WTIMEER0、2.
  • WTIME1作为边沿捕获引脚 PC6 PC7
  • PWM0、引脚 PB7 PC5 PE5
  • PWM1、引脚 PF1
  • 输出引脚 PB2 PB3 PD0 PD1 PD2 PD3
  • 输入引脚 PA2 PA3 PA4 PA5
  • UART0和 PA0 PA1
  • 休眠 RTC
  • ADC0管脚 PE0 PE1 PE2 PE3
  • ADC1管脚 PE4 PB4 PB5

下面是我用于配置 ADC 的一些示例代码:

内联 void CONFIG_ADC0 (void)
{
MAP_SysCtlPeripheralDisable (SYSCTL_Periph_ADC0);
MAP_SysCtlPeripheralReset (SYSCTL_Periph_ADC0);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
while (!map_SysCtlPeripheralReady (SYSCTL_Periph_ADC0));

MAP_GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);

MAP_ADCReferenceSet (ADC0_BASE、ADC_REF_INT);

MAP_ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_TIMER、0x00);

MAP_ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH0 | ADC_CTL_IE);
MAP_ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH1 | ADC_CTL_IE);
MAP_ADCSequenceStepConfigure (ADC0_BASE、1、2、ADC_CTL_CH2 | ADC_CTL_IE);
MAP_ADCSequenceStepConfigure (ADC0_BASE、1、3、ADC_CTL_CH3 | ADC_CTL_IE | ADC_CTL_END);

ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、25);

MAP_ADCHardwareOversampleConfigure (ADC0_BASE、64);

MAP_ADCSequenceEnable (ADC0_BASE、1);

MAP_IntDisable (INT_ADC0SS1);
MAP_ADCIntDisable (ADC0_BASE、1);
MAP_IntPendClear (INT_ADC0SS1);
MAP_ADCIntClear (ADC0_BASE、1);

MAP_IntPrioritySet (INT_ADC0SS1、0x20);
MAP_IntEnable (INT_ADC0SS1);
MAP_ADCIntEnable (ADC0_BASE、1);
}

内联 void CONFIG_ADC1 (void)
{
MAP_SysCtlPeripheralDisable (SYSCTL_Periph_ADC1);
MAP_SysCtlPeripheralReset (SYSCTL_Periph_ADC1);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
while (!map_SysCtlPeripheralReady (SYSCTL_Periph_ADC1));

MAP_GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_4);
MAP_GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_5);

MAP_ADCReferenceSet (ADC1_BASE、ADC_REF_INT);

MAP_ADCSequenceConfigure (ADC1_BASE、1、ADC_TRIGGER_TIMER、0x00);

MAP_ADCSequenceStepConfigure (ADC1_BASE、1、0、ADC_CTL_CH9 | ADC_CTL_IE);
MAP_ADCSequenceStepConfigure (ADC1_BASE、1、1、ADC_CTL_CH10 | ADC_CTL_IE);
MAP_ADCSequenceStepConfigure (ADC1_BASE、1、2、ADC_CTL_CH11 | ADC_CTL_IE | ADC_CTL_END);

ADCClockConfigSet (ADC1_base、ADC_CClock_SRC_PLL | ADC_CClock_RATE_FULL、25);

MAP_ADCHardwareOversampleConfigure (ADC1_BASE、64);

MAP_ADCSequenceEnable (ADC1_BASE、1);

MAP_IntDisable (INT_ADC1SS1);
MAP_ADCIntDisable (ADC1_BASE、1);
MAP_IntPendClear (INT_ADC1SS1);
MAP_ADCIntClear (ADC1_BASE、1);

MAP_IntPrioritySet (INT_ADC1SS1、0x20);
MAP_IntEnable (INT_ADC1SS1);
MAP_ADCIntEnable (ADC1_BASE、1);
} 

我不知道下一步该做什么。 有什么建议?

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第一个问题、您如何连接您的 A/D 输入? 您是否具有适当的奈奎斯特滤波器?

    其次、您可以在序列中的每个单个 A/D 转换上启用中断。 这几乎肯定是错误的。

    为了进行故障排除、我还会禁用过采样。

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在输入中使用内部3V3和 GND、我没有滤波器、在这种情况下、至少在没有滤波器的情况下、它始终工作(启用更多外设会增加更多噪声? 我很难相信这会对我们产生很大的影响)。

    我在每次模数转换时都启用中断、这意味着始终触发? 因为我将触发器更改为计时器、并使用一系列频率进行测试(1-500Hz)。 我尝试过采样被禁用、似乎有所改善、但仍然波动很大(连续下降到零大约> 20次、然后进入1500、1900、一些随机值、最后达到3300)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    用"examples/Peripherals/adc/"single_ended.c"中的代码(暂时)替换代码是否没有什么意义?

    这种"已知良好的代码"为您的后续尝试建立了一个基准、甚至可能是一个适当的"模型"。    而且——您表现出了一种"扩大"的趋势——并立即采取"一切措施"。   kiss 的方法告诉您:"从高度专注开始-一项任务!"   仅当该任务已经过验证/测试时-您应该"加入该组合"。   (即、您的现有(赦免)"跳跃"-您甚至可以从哪里开始?)

    正如朋友 Robert 所说的-为了让您的结果"漂移/变化"如此之大-"您的"实施方案非常可疑...

    这种"好代码"上的高堆芯片解决了您的问题...

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

    [引用 user="Helder Sales"[报价用户="Helder 销售]我在输入中使用内部3V3和 GND、我没有滤波器、至少在没有滤波器的情况下它始终工作(启用更多外设会增加更多噪声? 我很难相信这会对我们产生很大的影响)。 [/报价]

    我已经看到这会导致 A/D 偶尔返回两个极限值的读数。 为了实现正确的 A/D 操作(即在技术规格范围内持续运行)、必须对 A/D 的输入进行滤波、以避免出现混叠信号。 此外、该滤波器必须向 A/D 输入端呈现低阻抗信号。 A/D 是非常高频的模拟器件。 S/H 的转换时间大约为1/10到1/2、这意味着您需要一个大于10MHz 的带宽来馈送输入、相反、该范围内的信号将影响转换。

    如果您馈送用于 CPU Vcc 的相同3V3、则会在该高频范围内产生噪声。

    除了 A/D 输入、A/D 电源同样必须被过滤并且无噪声。 如果它使用与数字无滤波器相同的电源、它也会在转换中引入噪声、尤其是对于同样用作 A/D 基准的处理器而言。

    TI 提供了一些有关 A/D 转换和适当输入滤波器的良好参考。 如果您搜索 Bookshelf 标签、您将找到对它们的引用。

    [报价用户="Helder Sales"]如果我在每次 A/D 转换时都启用了中断,则表示始终触发?

    否、我是指您在序列中的每个条目中附加的'| IE'。 正如我说过的、这几乎肯定是错误的。

    正如 CB1所建议的、在继续执行更复杂的操作之前、可能有必要确保 TI 提供的示例正常工作。

    Robert

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

    [引用 user="Robert Adsett72">不,我是指您在序列中的每个条目中附加的'| IE'。 正如我说过的、这几乎肯定是错误的。

    正如 CB1所建议的、在继续执行更复杂的操作之前、可能有必要确保 TI 提供的示例正常工作。

    [/报价]

    宾戈! 这就是问题所在。 我想我需要在其他地方找到一些关于这一点的参考、因为建议的示例 CB1仅使用1个输入。 谢谢你。

    [引用 USER="CB1_MOBILE"]

    这种"已知良好的代码"为您的后续尝试建立了一个基准、甚至可能是一个适当的"模型"。    而且——您表现出了一种"扩大"的趋势——并立即采取"一切措施"。   kiss 的方法告诉您:"从高度专注开始-一项任务!"   仅当该任务已经过验证/测试时-您应该"加入该组合"。   (即、您的现有(赦免)"跳跃"-您甚至可以从哪里开始?)

    [/报价]

    实际上、我成功实现了一次 ADC、并使用不同类型的触发器进行了实验。 但是、我怎么知道、随着引脚的增多、这种问题可能会增加? 我何时失去了焦点?

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

    我的朋友-有很多 ADC 示例-在这里介绍-这个论坛。
    此论坛页面顶部的论坛"搜索框"-打开"高度相似的问题和代码示例"的"潘多拉盒型拼版软件"框。    几乎所有这些"示例"都使用多个通道-(即)您可以知道更多的引脚不应每个(调用)都使用"IE"。

    [编辑]: 停止印刷机!   如有疑问-"RTFM"。    4C123手册显示:  (在"真实副本"下方)

    配置采样序列时 、允许在同一序列中多次使用同一输入引脚。   在 ADCSSCTLn 寄存器中、IEn 位可以设置为任意采样组合的 IEn 位、
    如果需要、允许在序列中的每个采样后生成中断。

    因此、较早的"Bingo"奖将在 MCU 手册的前面、它不是吗?   

    现在、我想-就像 Robert 一样-"只有一个序列可以触发中断。"   并且-这种方法已知可以正常工作。   然而-手册清楚地指出了不同的地方!   

    然后、您的相关"中断处理程序"必须与各个 ADC 序列轰炸(或之前)不匹配!

    至于"焦点"-您有"参与 ADC 的许多方面"(即"过采样")-这证明"远远没有焦点"是不是吗?    向"故障/故障混合"添加(仍然)更多(未经验证)器件-不符合焦点的定义。   此外、只需查看所有"开-运行/启用"的功能(ADC 之外的功能)、"绝不确定"可能不会导致有害的交互。   再次-违反焦点...

    正如过去所说的那样、(函数过载) 似乎 是一种强烈的趋势。    (您可能会注意到、我长期以来一直以非常高的速度参与 、以进行如此重要的观察。)    因此、您可能会证明"接受观察结果"并遵守-并注意改进结果。      (另一个"简单提示"-它会!)