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.

[参考译文] TM4C1292NCPDT:使用控制器内部 ADC 进行的模拟电压测量与输入模拟电压不匹配

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/690649/tm4c1292ncpdt-analog-voltage-measurement-using-controller-internal-adc-is-not-matching-with-the-input-analog-voltage

器件型号:TM4C1292NCPDT
主题中讨论的其他器件: OPA2342REF2033

你(们)好

我们使用 TM4C1292NCPDT 控制器内部 ADC 来测量电路板中的电压轨。 对于测量3.3V、我们使用两个100k 电阻器将电压分压为一半。

分压信号连接到运算放大器缓冲器(OPA2342UA/2K5、设计为电压跟随 器)、并馈送到控制器内部 ADC (PD4)。

当我们使用万用表(PD4)测量控制器输入引脚处的电压时、我们看到1.6613V、实际上是3.3226的一半。

但 ADC 测量并转换为3.3800V (差值约为60mV)

更少的时间、ADC 测量电压将变为3.4200V (差值约为100mV)、其中控制器的输入保持不变(1.6613V、即电压轨上的3.3226V)

 控制 器的 ADC 基准电压为3.0007V (使用电压基准 IC ISL21010CFH330Z 设计为3V)。

请帮助我们了解我们在这里遗漏的内容。  

谢谢你

Krishna

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

    您能否共享 ADC 配置代码以便我确切了解其配置方式?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Shrikishna、您好!

    让我也尝试更好地了解您的设置。

    您有一个~3.3V 输出、该输出连接到两个100k Ω 电阻器的电阻分压器。 这会导致看到1.6613V 信号(由于电阻器容差、该信号可能会在3.3226的1/2中产生一些误差、对吗?) PD4引脚上的电流。

    在这里、您进行 ADC 转换、然后在转换后乘以系数2以恢复完全电压、这是您返回的3.3800V 结果、对吧?

    如果是、则在 ADC 引脚上测得的真正差值为28.7mV (3.38/2 = 1.69V、这是 ADC 的实际结果、然后1.69-1.6613将为28.7mV)。

    然后、为 ADC 提供了3.0007V 的外部基准。 一个12位 ADC 有4096个计数、所以根据提供的基准、每个计数的电压应该为0.7326mV。 这意味着对于28.7mV 误差、计数会减少39。 其中、ADC 也存在+/- 4计数误差、因此它实际上可能会关闭35个计数、误差小于1%。 不过、1%误差是您的应用所关心的问题、对吧?

    如果是、我想了解有关该系统的以下内容:

    1) 1)您是否在电压输入上使用了示波器来监控信号上的任何噪声? 不清楚测量使用了什么仪器以及问题是否仅仅是由电压纹波引起的。
    2) 2)您是否为 VREFA+输入重复了相同的操作?
    3) 3) ADC 基准使用了什么电容值、它们与器件的接近程度如何?

    我肯定还想了解 ADC 配置、但在考虑这么小的误差时、这些系统级项目也很重要。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、您的理解是正确的。 我们使用了两个100k 欧姆0.1%电阻器来分压。 由此产生的分压电压测量值为1.6613 (在 PD4引脚上)。

    是的、对于转换后的 ADC 电压、我们使用因数为2的倍数进行倍数。

    在一种情况下、与 ADC 输入和 ADC 转换值的真正差值为28.7mV、在另一种情况下为48.7mV (即66个计数、如果我们考虑4个计数的误差、则这将是62个计数)。

    是的、在我们的案例中、62个计数的误差将是一个问题。

    我们使用示波器测量了电压、3.3V 时的纹波最大值为20mV

    由于我们使用的是精密基准 LDO (ISL21010CFH330Z)、因此实际上我们不会观察 VERFA+输入端的纹波。

    我们在 ADC 基准上有一个10uF 和两个0.1uF 电容器滤波器。 放置在距离为160 mills (4mm)的位置。

    谢谢你

    Krishna

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

    uint32_t adcStepConfigs[5]={ADC_CTL_CH15、ADC_CTL_CH7、ADC_CTL_CH3、ADC_CTL_CH2、ADC_CTL_CH1| ADC_CTL_IE | ADC_CTL_END};
    HAL:::TivaADC_SeqConfig adcConfig ={ADC_TRIGGER_PROCESSOR, //.trigger。 0x00000000处理器事件
    HAL:::ADC_PRI0、 //.priority 为零。 最高优先级。
    adcStepConfigs、 //.StepConfigs。 它是上面定义的配置数组。
    array_dim (adcStepConfigs)};//.StepConfigsSize。 这里的值是0x5。
    静态 AdcTiva 板 VoltagesADC (ADC1_base、ADC_SS0、&adcConfig);//使用 ADC 采样序列发生器0 (FIFO 深度8)、注- ADC_SS0 = 0

    #define ADC_CTL_CH1 0x00000001 //输入通道1
    #define ADC_CTL_CH2 0x00000002 //输入通道2
    #define ADC_CTL_CH3 0x00000003 //输入通道3
    #define ADC_CTL_CH7 0x00000007 //输入通道7
    #define ADC_CTL_CH15 0x0000000F //输入通道15

    我们使用 ADC1、其基址 ADC1_base 定义为0x40039000UL。


    2.配置步骤的顺序如下:-
    //禁用序列以确保配置成功
    ADCSequenceDisable (ADC1_base、ADC_SS0);

    //配置采样序列发生器和步骤
    ADCSequenceConfigure (ADC1_base、ADC_SS0、ADC_TRIGGER_PROCESSOR, 0);
    for (int StepNum = 0;StepNum < 5;++StepNum)

    ADCSequenceStepConfigure (ADC1_base、HAL::ADC_SS0、StepNum、pSeqConfig->StepConfigs[StepNum]);//此处的 StepConfigs 是指上面定义的 adcStepConfigs[]



    3、在 ADC 代码的初始化部分、我们对基地址 ADC1_BASE 和序列号0执行以下操作
    ADCIntRegister (ADC1_base、ADC_SS0、ADC1_Interrupt_0);// ADC1_Interrupt_0是将 ADC 原始样本放入数组的中断函数处理程序。
    ADCIntClear (ADC1_BASE、ADC_SS0);
    ADCIntEnable (ADC1_BASE、ADC_SS0);

    //启用序列
    ADCSequenceEnable (ADC1_BASE、ADC_SS0);


    4.每次采样时、我们都会使用以下函数调用。
    ADCProcessorTrigger (ADC1_base、ADC_SS0);


    采样后、ADC 中断发生、计数存储在相应的数组中。 然后使用以下转换将计数转换为电压:-
    伏特=(计数/4095.0f)* 3.0;

    6、要得到实际电压、电压乘以2。
    实际电压=(伏特* 2)


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

    添加到 Ralphs 各种问题;

    您是否尝试启用硬件过采样或调整 TSH 值以匹配 ANIx 输入的阻抗 OPA2342?

    或者、在调整32MHz 的 ADC 时钟分频值后、让您累进2MSPS 采样率。 这些步骤应该为您的精密 VREFA+输入提供更高的精度。

    奇怪的是、我们使用 MCU 内部 VREF 获得了比使用外部 REF2033更高的精度。 REF2033布局似乎假定在接地平面的过孔中放置陶瓷旁路电容器时没有接地噪声。 独立的直流接地总线走线/层可使 MCU 更好地与信号、模拟接地层隔离。 但不要认为这是 ANIx 去耦电容在 MCU 引脚附近的模拟接地层中使用过孔的问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该误差级别远高于我的预期。 我建议(如 BP101建议的那样)尝试使用内部参考来查看这是否会导致改进。 此测试应将问题隔离在输入信号或基准之间。 如果您仍然使用内部基准有偏移、接下来我建议(BP101也建议)尝试增加采样时钟的数量、尤其是当您以32MHz 运行 ADC 时钟时。 虽然运算放大器的输出阻抗应较小、但模拟开关导通电阻(Radc)可能高达2.5K 欧姆。 如果 ADC 时钟速率为16MHz、请尝试使用8个采样时钟;如果 ADC 时钟速率为32MHz、则尝试使用16个采样时钟、以避免之前的采样影响采样保持电容器上的当前采样电压。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

     表值为 Nsh8/TSN (0x2)的奇怪 ADC @2MSPS、32MHz 采样时钟似乎可以为  与 ANIx 输入的大多数阻抗匹配产生更好的采样结果、硬件取平均值为2倍、而 Nsh16/TSN (0x4)则是如此。 采样保持(nsh)寄存   器中所有位的另一个奇怪异常应该具有相同的值、否则如果(TSN)值混合、可能会发生序列发生器死锁。

    值得一提 的是、该海报选择使用 ADC1 SS0、根据经验、ADC0序列发生器在许多方面都已证明是100%可靠。

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

    [引用 user="Shrikrishna K">是的,您的理解是正确的。 我们使用了两个100k 欧姆0.1%电阻器来分压。 由此产生的分压电压测量值为1.6613 (在 PD4引脚上)。[/quot]

    如何测量? DMM 将会错过噪声、而示波器可能不够准确。 在这里、您必须关注0.1us 至0.5uS 范围内的尖峰。 问题得到了您所需的精确度您的"应付能力可能不够好、无法解决问题。

     [引用 user="Shrikrishna K"]2. 由于我们使用的是精密基准 LDO (ISL21010CFH330Z)、因此我们实际上不会观察 VERFA+输入端的纹波。[/QUERP]

    再说一次、是如何测量的? 这里的问题将是10至100MHz 范围内的尖峰。 不过、如果布线较短且直接、并且电容器良好、则您的电容器应足够。

    您提到电阻分压器后面的运算放大器。 运算放大器后面必须有一个电容器、最好也有一个串联电阻器。 为了给采样电容器馈电、馈送电容器的电路必须能够在采样期间对其进行充电或放电(对于2MHz 转换  器、预计该电容器将处于0.25uS 至0.05uS 范围内)。 非常高的带宽。 请注意、该要求与采样率无关。

    如果您不进行进一步测量、一个问题是您是否存在偏移误差或增益误差、这是无法回答的。 因此、您需要在不同的值下进行多次测量。

    TI 举办了一些有关此问题的好研讨会。 一些列在#bookshelf 下

    Robert