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.

[参考译文] TM4C123AE6PM:需要有关电压标度中 ADC 值映射的建议。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/579390/tm4c123ae6pm-need-advice-about-adc-value-mapping-in-voltage-scale

器件型号:TM4C123AE6PM
主题中讨论的其他器件:LM4120

大家好、  

我在这里寻求经验丰富的编程人员的一些建议。 我的定制板代码的一个片段读取与中某些电压对应的 ADC 值

我的定制板代码的一个片段读取 与分压器前0-17V 范围内某些电压对应的 ADC 值、我读取0-4096之间的值并将其映射到 相应的电压、然后该电压显示在7段显示屏中。 为了将电压值映射到相应的 ADC 值、我 在电压表中监测到的值和 MCU 输入上的 ADC 值。 使用该值表、我从测量值中创建了某种曲线、因此我使用 了两点之间的线性方程、以便我可以将读取值映射到 测量的电压值。 但这似乎太精确了、这意味着从串联值将该代码放置到第二个电路板时不正确、这意味着相同的输入电压不会在控制器上提供相同的 ADC 读取、至少不会超过整个范围(0-4096)。 我需要以某种方式使其更加可靠 、以便所有系列的电路板都使用相同的代码、并将它们显示正确的电压。 我想我使用的方法是错误的、如果您有一些建议、可能会这样吗?

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

    您的模拟分压电阻容差值可能会建议为1%、强烈建议使用外部+VREFA 精密源。 对于线性电压范围、在同一 PCB 的运行之间获得一定的精度应该不会很困难。 请记住、温度会影响电阻器值、因此我想在合理的范围内将模拟分频器放置在 MCU 附近。

    LM4120或多个其他人提到了该论坛。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 BP101的提示和注意事项。 此外、分压器将增加外部输入电阻。 因此、ADC 所需的采样时间也会增加。 随着源电阻的增加、保持电容器完全充电的时间将增加。 如果采样时间小于完全充电所需的时间、那么 ADC 转换的数字值可以小于实际值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    JC、

    我即将发布有关 ADC 的详细讨论、因此我将回答一些建议、然后再做一个关于您的话题的介绍。

    下面的原理图是我们在一些项目中使用的结果。 电阻器至少为1%-如果您真的想要一个好的测量值、那么以合理的成本找到0.1%的器件并不困难。 电容器需要根据信号上预期的变化速度进行计算-较高的电容器将提供更稳定的读数、但会影响快速变化。 这个用于缓慢变化、例如电池。

    使用电压基准芯片和精密电阻器、您应该会获得非常重复的读数、其中4096个值介于0.00到3.00V 之间。

    现在、在软件侧、您可以根据需要控制读数的频率。 同样、对于慢速值甚至"更稳定的读数"、您可以使用高达64的硬件平均值。 在每个中断上、这将从 ADC 读取转换:

    void ADC0S1IntHandler (void)
    {
    uint32_t ADC0Value[2];
    ROM_ADCIntClear (ADC0_BASE、1);
    MAP_ADCSequenceDataGet (ADC0_BASE、1、ADC0Value); //将硬件 FIFO ADC 缓冲区复制到内存中
    systemconfig.cpuTemp = 147.5 -(75 * system_VREF *(ADC0Value[0]和0xFFF)/ 4096.0f);//以 degC 为单位的浮点温度
    电池电压电平= 4.0f * SYSTEM_VREF *(ADC0Value[1]和0xFFF)/ 4095.0f; //将电池电量存储到全局变量
    中} 

    上面的中断服务例程应该读取一个外部模拟输入和板载温度传感器。

    顺便说一下、我要触发的讨论是12位 ADC 的"最正确"除数是多少:4095或4096? ADC 需要多大的电压电平来生成1 LSB? 在上面的示例中、考虑到3000mV 是整个范围、阶跃数量为4096、很容易假设/理解一个阶跃为73mV。

    但我从来不知道"边界在哪里"。 ADC 是否仅在电压超过3000/4096 = 73mV 一直到146mV 时才读取0x01、还是第一步"值的一半"、以便0x00变为36mV、0x01代表37mV 一直到110mV? 或更易于阅读:

    ADC/范围:
    0x01/0.00mV 至0.73mV
    0x02 / 0.74mV 至0.146mV

    ADC/范围:
    0x01/0.00mV 至0.36mV
    0x02 / 0.37mV 至0.110mV
    (笑声)
    0xFFF/299.64至3000.00mV

    这可能是在 ADC 中讨论第0章的内容、但我从未遇到过明确的答案。 当然、模拟世界并不像这个描述那样遵守"理论限制"、但对于设计目的、其中一个必须是标准...

    谢谢

    布鲁诺

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

    问得好、jc。 具有3.000V 基准电压的理想逐次逼近12位 ADC 将从0mV (或更低)读取0x000至0.73mV、并从0.73mV 至1.46mV 读取0x001。 它将从2.99927V 至3.000V 读取0xFFE、并在3.000V 以上读取0xFFF。 也就是说、理想的 ADC 就像我们在电子101中了解到的理想电阻器、电容器、电感器和晶体管一样。 它们只存在于一个过度简化的 SPICE 模型的虚世界中。

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

    非常感谢大家、我忘了说其他部门负责电子产品、作为程序员、我需要在得到电子产品时处理它。 但 JET、我理解您想要解释的内容。 我尝试使用该计算来转换 ADC 值的电压、过压除数公式计算要测量的输入电压、 它在标度开始时显示正确、但随着电压偏差增大、在标度结束时、我会得到相当大的误差。 因此、我使用不同的方法、测量电压和 ADC 输入值、并使用两点之间的线性方程计算读取 ADC 值时的相应电压、但这似乎并不理想。

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

    您不需要在点之间进行所有这些计算和内插。

    一种更简单的方法:对于电压测量、在某些工程单元中工作非常有用-我建议使用10mV 单元、 为了引入"完整电压范围"的参数定义、例如18V (您需要进行一些保留以允许超范围测量)-又名定义 FSR 1800 (更好的2000、7段显示的3 ½数字单位)。 然后、要显示测量值、只需执行一个操作:Display =(ADC_Result * FSR)/4095。

    无需浮点、在七段显示中、只需在第二个数字之后打开小数点。 显示在终端上、只需 div 100和 modulo 100即可。

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

    Bob、

    感谢您澄清 ADC 上使用的转换值。 我不知道当测得的电压高于基准电压时、ADC 的最高值在某种程度上是"保留"的。 我假设它将是从基准附近的某个值开始的返回值、但仍低于基准...

    理想的世界是分开的、使用浮点数进行"真正理论上最强的转换"、我得出结论、测量的电压是

    V_MEAS =(ADC_VALUE + 0.5)* V_REF /(RES - 1)

    其中:
    V_MEAS =测量电压(V)
    ADC_Value = ADC 返回的数字、在 TM4C 世界中的范围为0至4095
    V_REF =基准电压(V)、或者在上面的讨论中、值3.00000
    RES = ADC 标称分辨率、2^12 = 4096

    顺便说一下、当您提到"0x3FFF 高于3.000V"时、您的答案上有一个小拼写错误。

    另一个需要提及的方面是、我上面的示例"屏蔽寄存器"以只读取最后12位。 这可能是不必要的精度、因为 ADC 绝不会在这20个高位上放置任何东西。 但是、这只是一个提醒、"转换后的值位于返回变量的最后12个位上"。

    正如 Petrei 提到的、JC 不需要任何内插。 ADC 转换是线性的。 如果您没有获得线性结果、那么您的设置中还有其他问题... 也许您有一个过大的电容器、它需要很长时间充电、您进入 MCU 的电压会延迟?

    此致

    布鲁诺

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

    谢谢大家、看起来这是布局方面的问题、我总是从自己开始、所以我以为 我做了一些错误、但有额外的齐纳二极管会产生 MCU 输入中缺失的压降。 删除后、您在此处提供的原始计算结果是正确的。 您向 我解释了 ADC、因此不再有疑问。 谢谢!
    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    布鲁诺
    感谢您抓住我的错误。 我更正了上述帖子、以避免让未来的读者感到困惑。 让我补充一点、来自不同的 E2E 社区、我很高兴看到该社区中经验丰富的用户提供了如此出色的帮助和互动。 感谢您的发帖。 谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bob、
    很高兴我能提供帮助。 我打算在时间允许的情况下继续这样做。
    当然、有经验的用户不会"免费"使用-如果不是其他任何东西、认可已经是一个很好的回报! 但老实说、我们学到了很多、只是尝试帮助! 当然、当我们转向寻求帮助时、我们的问题往往会更快地得到神奇的回答... 因此、这是一个双赢!
    谢谢
    布鲁诺