海纳百客

海纳百客

树莓派 Pico 上 ADC(数模转换器)的使用

吃瓜阿阳

友情提示点击顶部放大镜 可以使用站内搜索 记住我们的地址 www.hainabaike.com

在之前的教程中,我们已经明白在树莓派 Pico 上使用了数字输入、输出。数字输入的值是低电平或高电平,程序中表现为 0 或者 1 的二进制状态。

树莓派 Pico 还可以接受另一种类型的输入信号:模拟量输入。模拟输入被用于从音量控制到气 体、湿度和温度传感器的所有东西,它们通过一个被称为模拟-数字转换器(ADC)的部件工作。

在本教程中,你将学习如何使用 Pico 上的 ADC,以及如何接入其内部温度传感器来构建一个数据记录温度的小工具。

需要使用:
树莓派 Pico
任何颜色的 LED
330Ω 电阻
一个 10kΩ 电位器
公对公跳线若干
microUSB 数据线

将 Pico 连接到树莓派或其他运行 Thonny MicroPython IDE 的计算机。

模数(模拟-数字)转换器

树莓派 Pico 的 RP2040 微控制器是一种数字设备,得益于内置了模数转换器(ADC),Pico 在不依赖外部硬件的条件下真正理解一个模拟信号(例如连续的光谱)。

ADC 有两个关键特征,它的分辨率(以数字位来衡量)和它的通道(或如何测量)。它可以同时接受和转换许多模拟信号。Pico 中的 ADC 的分辨率是 12 位,这意味着它可以将模拟信号转换为数字信号作为一个数字范围从 0 到 4095,也就是 2 的 12 次方。

由于在 MicroPython 中,ADC 被转换为 16 位范围的数字,即从 0 到 65535。为了与其他不同分辨率的 ADC 统一,Pico 上的 ADC 也参考了同样的值域。

树莓派 Pico 的引脚中,支持 ADC 输入的引脚有 GP26、GP27 和 GP28。也被命名为 GP26_ADC0、GP27_ADC1 和 GP28_ADC2,对应的模拟通道分别是 0、1、2。另外还有一 ADC 通道,连接到了 RP2040 内置的温度传感器。在后面的内容中我们会用到。

读取电位器

拿起你的电位器,把它翻过来,你会看到它有三个插脚。中间的引脚和 Pico 的 GP26_ADC0 连通,另外两个脚中任意一个和 Pico 的 3V3 引脚连通即可。如图所示。

打开 Thonny 并新建一个程序:

import machine
import utime

potentiometer = machine.ADC(26) 

这里配置引脚 GP26_ADC0 以模数转换器来工作。为了持续从引脚读取数据,设置一个循环:

while True:
	print(potentiometer.read_u16())
	utime.sleep(2)

在这个循环中,会持续读取和打印读取到的值。

读取模拟输入与读取数字输入几乎完全相同,除了一点:读取数字输入时使用 read(),但读取模拟输入时使用 read_u16()。最后一部分 u16 只是提示你,接收到的不是二进制0或1的结果,而是一个无符号的 16 位整数,即 0 到 65535 之间的整数。

点击 Run 按钮并将程序保存为 potentiometer.py。观察 Shell 区域,你将看到程序打印出一个很大的可能超过 60000 的数字。

试着在一个方向上转动电位器,此时数字将上升或下降,取决于你转动旋钮的方向和你在电路中使用的外部引脚。如果反方向转动,数值会向相反的方向改变。

不管你怎么转动它,数值永远不会接近 0。这是因为电位器只有两条引脚相连,就像一个被称为 可变电阻器或变阻器的组件。变阻器是一个你可以改变值的电阻器,拿 10kΩ 的电位器为例,在 0Ω 和 10000Ω 之间。电阻越高,电压越低。

电位器的工作原理是有一个内部导电条,连接到两个外部引脚,一个刷头连接到内部引脚(如图所示)。当你转动旋钮时,刷头就会靠近一端,而远离另一端。刷头和 3V3 之间的距离越远,电阻就越高;距离越近,电阻就越低。

电位器是非常有用的组件,但有一个缺点:无论在哪个方向转动旋钮,永远都不会得到 0 或者接近 0 的值。这是因为 10kΩ 的电强度不足以将 3V3 引脚的电压降至 0V。除非寻找更高阻值的电位器来替代它,或者把现有的电位器连接起来作为分压器。

作为分压器的电位器

电位器上未使用的引脚并不是用来看的,在电位器上加一个引脚连接到电路上将完全改变了电位 器的工作方式。以图上所示,搭建新的电路即可将电位器作为分压器来工作。

单击 Run 按钮,重新启动程序。再次转动电位器旋钮,向一个方向,然后向另一个方向。注意打印到 Shell 区域的值。与之前不同,它们现在会分别趋近 0 和趋近 65535。这是为什么呢?

这是由于另一端引脚接地,电位器的刷头即成了分割一整个电位器阻值的工具。65535 意味着「全电压」。

回到你的程序,在循环上面添加以下内容:

conversion_factor = 3.3 / (65535)

这就建立了一种数学方法,将 ADC 给出的数字转换成与实际电压相当的近似值。第一个数字是引脚可以期望的最大可能电压 3.3V,从 Pico 的 3V3 引脚获得。第二个数字是模拟输入读数所能达到的最大值 65535。

总的来说,转换因子是由「3.3 除以 65535」产生的数字,也就是最大可能电压除以模拟数字转换器的值域。

设置好转换因子后,只需在程序中使用它。回到你的循环,并编辑它:

while True:
	voltage = potentiometer.read_u16() * conversion_factor
	print(voltage)
	utime.sleep(2)

循环中的第一行通过模拟输入引脚读取电位器的读数,并将其乘以之前在程序中设置的转换因子,将结果存储为可变电压。然后,该变量将被打印到 Shell 区域,代替你之前使用的原始读取。

此时代码如下:

import machine
import utime
potentiometer = machine.ADC(26)
conversion_factor = 3.3 / (65535)

while True:
	voltage = potentiometer.read_u16() * conversion_factor
	print(voltage)
	utime.sleep(2)

点击 Run 按钮。从一个方向转动电位器,然后再从另一个方向转动。观察被打印到 Shell 区域的数字,你会看到,当电位器一路都是一种方式,数字非常接近于零;如果是另一种情况,则非常接近 3.3。这些数字代表了引脚所读取的实际电压,当你转动电位器的旋钮时,你就可以平滑地将电压在最小值和最大值(0V 到 3.3V)之间划分了。

祝贺你!你现在知道了如何将电位器既作为可变电阻又作为分压器连接起来,以及如何将模拟输入既作为原始值又作为电压读取!

    标签:

    发布评论 条评论)

    评论列表