树莓派PICO ADC读取

Sre*_*esh 0 raspberry-pi-pico

为什么在Raspberry Pi Pico上获取ADC读数时不得到?即使我将ADC引脚接地,模拟读数总是在10到20之间波动。如何将模拟读数减少到零?

tlf*_*g01 6

问题

\n

如何让Rpi Pico做ADC,输出范围从0开始,并且希望没有10到20的波动?

\n
\n

回答

\n
    \n
  1. 我用 google 搜索,发现 How2Electronics 有一个关于 Pico ADC 的新手友好教程,其中包含简短的演示代码(参考文献 1、2。附录 B、C)。

    \n
  2. \n
  3. 演示代码似乎没有 OP 报告的任何问题。所以我决定在我的 Pico 设置中尝试演示代码,看看是否可以重复 OP 的情况。

    \n
  4. \n
  5. 我读过 Pico 数据表,其中说 Pico ADC 的内部偏移约为 30mV,并且可以通过使用 3.0V 的外部电压来减少其偏移(附录 D)。

    \n
  6. \n
  7. 现在OP说他的0V(信号接地)ADC结果总是在10和20之间波动。所以让我计算一下这个10~20偏移是否在Pico数据表的20~30mV内部/固有零偏移之内。由于 Pico ADC 分辨率为 12 位,如果使用 3V3 电源轨作为模拟参考,则本征值为 30mV / 3V * 4096 ~= 30/3000 * 4096 ~= 5 < 10。换句话说,OP 的零偏移似乎是规格的两倍。

    \n
  8. \n
  9. 我还没有验证我一贯狡猾的计算。也许我可以通过向后工作来验证它:如果偏移值为 20/4096,则以 mV 为单位的偏移量是多少。假设模拟参考为 3V3,则偏移量 mV = 3V3 * (20/4096) = 3300mV * 20 / 4096 = 16mV,看起来不错。

    \n
  10. \n
  11. 不管怎样,也许我可以重复OP的测试并与他的零偏移量进行比较。

    \n
  12. \n
  13. 我修改/扩展了 How2Electronics 的演示程序,以执行以下操作:\n(a) 使用三个 ADC 引脚 ADC0、ADC1、ADC2 进行 ADC,(b) 查找最大值、最小值、平均值并打印结果(附录F)。

    \n
  14. \n
  15. 然后,我使用该程序查找连接到 (a) 模拟地、(b) 启用 3V3 的 ADC0、1、2 引脚的输出。ADC 结果总结如下:

    \n

    --- 样本输出 ---\n%Run -c $EDITOR_CONTENT\n名称 = testPicoAdcV01()\n功能 = 测试 Pico ADC 引脚 GP26, 27, 28\n日期 = 2022apr25hkt1111

    \n

    ADC 结果 = [368, 368, 336](ADC0、1、2 连接模拟地)\n最大值 = 368\n最小值 = 336\n平均值 = 357

    \n

    ADC 结果 = [65391, 65519, 65519](ADC0、1、2 连接 3V3)\n最大值 = 65519\n最小值 = 65391\n平均值 = 65476

    \n
  16. \n
\n

(a) 3V3 输入的 ADC 输出平均值为 65476,(b) 模拟接地平均值为 357,或者

\n

ADC 零偏移量 357/65476 = 5.45% ~= 5%,或 3V3 = 3300mV * 5% ~= 165mV。

\n
    \n
  1. 3V3 测量范围的Pico ADC 误差规格为5% 或 150mV(尚未验证)似乎不太好。所以我正在考虑为 Pico Analog Reference 引脚使用外部 3V0 电压基准,希望能够提高精度。我将使用电压基准 IC TL431 来检查它是否良好(附录 H,参考文献 5)。

    \n
  2. \n
  3. 使用 2.5V 外部基准,零偏移已改善至0.4%,但仍然不是很好。我更喜欢使用 AD7705,它具有两个真正的差分输入通道,内置 PGA,并带有板载 LM285-2.5 电压基准的组装模块。

    \n
  4. \n
\n
\n

/ 接着说, ...

\n
\n

参考

\n

(1)如何在Raspberry Pi Pico中使用ADC - How2Electronics,2021年4月21日

\n

(2) Raspberry Pi Pico 完整指南 [引脚分配 + 功能 + ADC (08:56) + I2C + OLED + 内部温度传感器 + DHT11 - How2Electronics

\n

(3) Rpi Pico 数据表 (4.3. 使用 ADC) - Rpi

\n

(4) Raspberry Pi Pico 3.3V_EN 引脚控制电压查询 - EE.SE,提问于 2021jun22,浏览 1k 次

\n

(5) TL431/TL432精密可编程参考IC - TI

\n

(6) LM385B-2.5 2.5V 微功耗电压基准 - TI

\n

(7) Zonri ADS1256 24位采样模块,ADC模块,单/差分输入-速卖通 US$26

\n

(8) AD7705 SPI 2 全差分输入通道 16 位 \xce\xa3-\xce\x94 ADC、PGA 数据表 - Analog Devices

\n

(9) AD7705/TM7705 16位ADC模块,输入增益,可编程SPI接口,(LM285-2.5外部参考电压)- AliExpress US$1.2

\n
\n

/ 接着说, ...

\n
\n

附录

\n

附录 A - Rpi Pico ADC 引脚分配

\n

Rpi Pico ADC 引脚分配

\n
\n

附录 B - 用于测试 ADC 程序 v0.1 的 Rpi Pico 接线

\n
------------------------------------------------------------------------------------\nPin name         Pin #   Connected to\n-------------------------------------------------------------------------------------\nRpi 3V3 Output   36      -\nRpi 3V3 Enable   37      -\nAnalog Gnd       33      Rpi Pico Ground\nAnalog Ref       35      Rpi 3V3\nADC0             26      Rpi Ground\nADC1             27      Rpi 3V3\nADC2             28      2V5\nADC3             -       Not available, connected to Pico internal temperature sensor\n-------------------------------------------------------------------------------------\n
Run Code Online (Sandbox Code Playgroud)\n
\n

附录 C - How2Eloectronics 的 ADC 演示代码

\n

pico adc 演示

\n
\n

附录 D - 如何提高 ADC 性能

\n

Rpi Pico 数据表(4.3. 使用 ADC)- Rpi

\n

4.3. 使用 ADC

\n

RP2040 ADC 没有板载基准,因此使用自己的电源作为基准。

\n

在 Pico 上,ADC_AVDD 引脚(ADC 电源)是通过使用 RC 滤波器(201 欧姆进入 2.2\xce\xbcF)从 SMPS 3.3V 生成的。这是一个简单的解决方案,但有以下缺点:

\n
    \n
  1. 我们依赖 3.3V SMPS 输出精度,这不是很好

    \n
  2. \n
  3. 我们只能做这么多过滤,因此 ADC_AVDD 会有些噪音

    \n
  4. \n
  5. ADC 消耗电流(如果温度检测二极管被禁用,则约为 150\xce\xbcA,但因芯片而异),因此将存在约 150\xce\xbcA 200 = ~30mV *的固有偏移。当 ADC 采样时,电流消耗存在微小差异(约 +20\xce\xbcA),因此偏移也会随着采样和工作温度的变化而变化。

    \n
  6. \n
\n

更改 ADC_VREF 和 3V3 引脚之间的电阻可以减少偏移,但代价是增加噪声 - 这可能没问题,特别是如果用例可以支持多个样本的平均值。

\n

将 SMPS 模式引脚 (GPIO23) 驱动为高电平,强制电源进入 PWM 模式,可以大大减少轻负载时 SMPS 的固有纹波,从而减少 ADC 电源上的纹波。这确实会降低轻负载时电路板的电源效率,因此可以通过再次将 GPIO23 驱动为低电平,在不频繁的 ADC 测量之间重新启用低功耗 PFM 模式。参见第 4.4 节。

\n

通过将 ADC 的第二个通道接地并使用此零测量作为偏移的近似值,可以减少 ADC 偏移。

\n

为了大大提高 ADC 性能,可以将外部 3.0V 分流基准(例如 LM4040)从 ADC_VREF 引脚连接到地。

\n

请注意,如果这样做,ADC 范围仅限于 0-3.0V 信号(而不是 0-3.3V),并且分流基准将通过 200R 滤波电阻器汲取连续电流 (3.3V-3.0V)/200 = ~1.5嘛。

\n

请注意,Pico (R9) 上的 1R 电阻器旨在(可能)帮助分流基准,否则当直接连接到 2.2\xce\xbcF 时,分流基准会变得不稳定。它还确保即使在 3.3V 和 ADC_VREF 短路在一起的情况下也能进行一点滤波(如果您不关心噪声并希望减少固有偏移,则这是有效的做法)。

\n

最后,R7 是一个物理尺寸较大的 1608 公制 (0603) 封装电阻,因此如果用户想要隔离 ADC_VREF 并使用 ADC 电压做自己的事情,例如使用完全独立的电压(例如 2.5五)。请注意,RP2040 上的 ADC 仅在 3.0/3.3V 下合格,但应工作在 2V 左右。

\n
\n

附录 E - 用于启用 3V3 电源的 Pico 3V3 启用引脚

\n

Raspberry Pi Pico 3.3V_EN 引脚控制电压查询 - 2021jun22 提问,浏览 1k 次

\n

pico 3v3 启用引脚

\n
\n

附录 F - 测试 Pico 的 3 个 ADC 引脚 V0.1

\n
programName     = \'testPicoAdcV01()\'\nprogramFunction = \'test Pico ADC pins GP26, 27, 28\'\nprogramDate     = \'2022apr25hkt1111\'\nprogramAuthor   = \'tlfong01\'\nsystemInfo      = \'Chinese Windows 10, Thonny IDE 3.3.13, Python 3.7.9, Rpi Pico\'\n\nimport machine\nimport utime\n \n# *** Configuration *** \n\nadcPinNum0 = 26\nadcPinNum1 = 27\nadcPinNum2 = 28\n\nadcPin0    = machine.ADC(adcPinNum0)\nadcPin1    = machine.ADC(adcPinNum1)\nadcPin2    = machine.ADC(adcPinNum2)\n\nadcPinDict = \\\n    { \n    \'0\' : {\n            \'AdcPinNum\': 0,\n            \'AdcPin\'   : adcPin0,\n          },              \n    \'1\' : {\n            \'AdcPinNum\': 1,\n            \'AdcPin\'   : adcPin1,\n          },   \n    \'2\' : {\n            \'AdcPinNum\': 2,\n            \'AdcPin\'   : adcPin2,\n          },\n    }\n\n# *** Adc Functions ***\n\ndef getAdcResults(adcPinNum):\n    adcPin = adcPinDict[str(adcPinNum)][\'AdcPin\']\n    adcResults = adcPin.read_u16()\n    return adcResults\n\n# *** Sample Test ***\n#adcResults = getAdcResults(adcPinNum = 0)\n#print(adcResults)\n\ndef getAdcResultsList(adcPinNumList):\n    adcResultsList = [0] * len(adcPinNumList)\n    for adcPinNum in adcPinNumList:\n        adcResults = getAdcResults(adcPinNum)\n        adcResultsList[adcPinNum] = adcResults\n    return adcResultsList          \n\n# *** Sample Tests ***\n#adcResultsList = getAdcResultsList([0, 1, 2])\n#print(adcResultsList)\n\ndef printAdcResultsList(adcResultsList):\n    print(\'ADC Results =\', adcResultsList)\n    print(\'Max         =\', max(adcResultsList))\n    print(\'Min         =\', min(adcResultsList))\n    print(\'Avg         =\', (sum(adcResultsList)) / len(adcResultsList))    \n    return\n\n# *** Sample Tests ***\n#adcResultsList = getAdcResultsList([0, 1, 2])\n#printAdcResultsList(adcResultsList)\n\ndef testPicoAdcV01():\n    print(\'Name        =\', programName)\n    print(\'Function    =\', programFunction)\n    print(\'Date        =\', programDate)\n    adcResultsList = getAdcResultsList([0, 1, 2])\n    printAdcResultsList(adcResultsList)    \n    return\n\n# *** Main ***\n\ntestPicoAdcV01()\n\n# *** End of Program ***\n\n# *** Sample Output ***\n\'\'\'\n>>> %Run -c $EDITOR_CONTENT\nName        = testPicoAdcV01()\nFunction    = test Pico ADC pins GP26, 27, 28\nDate        = 2022apr25hkt1102\nADC Results = [208, 20645, 17828]\nMax         = 20645\nMin         = 208\nAvg         = 12893.67\n>>> \n\'\'\'\n# *** End of sample output ***\n
Run Code Online (Sandbox Code Playgroud)\n
\n

附录 G - ADC0、1、2 连接到 (a) 模拟地,(b) 启用 3V3 输出时的 ADC 结果

\n

带有示例输出的完整程序列表

\n
# *** Sample Output ***\n\'\'\'\n>>> %Run -c $EDITOR_CONTENT\nName        = testPicoAdcV01() \nFunction    = test Pico ADC pins GP26, 27, 28\nDate        = 2022apr25hkt1111\n\nADC Results = [368, 368, 336] (ADC0, 1, 2 connected Aanlog Gound) \nMax         = 368\nMin         = 336\nAvg         = 357\n\nADC Results = [65391, 65519, 65519] (ADC0, 1, 2 connected 3V3)\nMax         = 65519\nMin         = 65391\nAvg         = 65476\n>>> \n\'\'\'\n
Run Code Online (Sandbox Code Playgroud)\n
\n

附录 H - 使用 TL431 的 Rpi Pico ADC 外部模拟电压基准

\n

TL431 01

\n
\n

TL431 2/2

\n
\n

附录 I - 使用 TI LM385B25 2V5 电压基准的 Rpi Pico ADC 外部模拟电压基准

\n

LM385B-2.5 微功耗电压基准 - TI

\n
\n

pico adc 2.5V vRef

\n
\n

ADC 参考电压

\n
\n

附录 J - 用于校准 Rpi Pico ADC 引脚的 Zonri ADS1256 24 位 ADC 模块

\n

ads1256 模数转换器

\n
\n

附录 K - 用于校准 Rpi Pico ADC 的 AD7705 16 位 ADC

\n

(8) AD7705 SPI 2 全差分输入通道 16 位 \xce\xa3-\xce\x94 ADC 数据表 - Analog Devices

\n

(9) AD7705 16位ADC模块,输入增益,可编程SPI接口,TM7705-速卖通 US$1.2

\n

ad7705 01a

\n

广告770502

\n

/ 继续在TEAMS 齐思中,...

\n
\n

。结尾

\n