微雪树莓派PICO笔记——4. ADC(模拟数字转换器)

本文详细介绍了RP2040芯片上的ADC模块,包括ADC的基本原理、类型及技术参数,并通过MicroPython实例展示了如何读取模拟信号及温度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 如果我们需要使用PWM精准的控制LED的亮度,就需要反馈
  • 但是LED的亮度是一个模拟变量,MCU不能直接处理模拟信号
  • 我们需要将其转换为数字信号才能进行处理

什么是ADC

模拟数字转换器 (Analog Digital Converter)

![[Pasted image 20220922155847.png]]

作用:将时间连续,幅值也连续的模拟信号转换为时间离散,幅值也离散的数字信号

![[Pasted image 20220922160329.png]]

基本原理:把输入的模拟信号按规定的时间间隔进行采样,并与一系列标准的电压进行比较,使其对应的二进制数值逐次收敛,直至输入电压与内部比较电压一致时为止,然后输出代表该电压的二进制值

  • 常见的ADC类型
  1. 逐次逼近型ADC
    • 根据基准电压生成一系列电压,与输入电压逐个比较,获取最接近输入电压的编码值
    • 速度中等,精度较高,较为常见
  2. 并联比较型ADC
    • 根据基准电压生成一系列电压,同时进行比较,获取最接近输入电压的编码值
    • 速度较快,精度较快,是用于高速,低分辨率的场合
  3. 区别
    • 好比CPU,GPU,前者可以单独处理比较高难度事件,后者并行处理比较简单的事件

RP2040 ADC技术参数

  1. ADC类型:逐次逼近型ADC(SAR ADC)
  2. 转化速率:500KS/s(使用内部独立48M时钟)
  3. 分辨率:12bit
  4. ADC输入通道:
    • 通道0-3为GPIO通道(GPIO26-29)
    • 通道4为内部温度传感器通道

注意:在Pico上GPIO29并未引出引脚,而是用于检测VSYS电压,故PICO上的ADC引脚
![[Pasted image 20220922195836.png]]

ADC大致框架图

![[Pasted image 20220922200037.png]]

ADC的大致流程为:

模拟信号通过模拟信号多路选择器进入到比较器的一端

  • 假如我们需要采集ADC通道0的电压,也就是GPIO26引脚上的电压
  • 其会通过模拟信号多路选择器进到比较器的一端
    ![[Pasted image 20220922200509.png]]

所谓的DAC就是将基准电压平分成2的N次方份

若我们的分辨率是12bit,那么基准电压会被平均分成4096份
逐次比较控制器准备就绪后,在开始转换信号到来后开始工作
其输出,逐次比较控制信号(SAR control signals)
控制比较器将输入电压和生成的内部电压进行逐次比较
逐次比较控制器将会记录比较结果
然后再比较完成后输出最为接近输入电压所对应的二进制值,这就完成了一次ADC转化

![[Pasted image 20220922201545.png]]

模拟的信号最大值由IO口供电I0VDD决定,而不是基准电压ADC_AVDD

通用ADC输入电压计算公式如下:
![[Pasted image 20220922202700.png]]

基准电压乘上ADC读取数值再除以分辨率等于ADC输入引脚的输入电压
代入Pico中的参数,简单推得ADC输入电压计算公式如下:
![[Pasted image 20220922203316.png]]

3.3乘上ADC读数值除以4096
等于ADC输入引脚电压,单位为V

官方提供的片内温度传感器计算公式

![[Pasted image 20220922203438.png]]

将ADC读取电压值代入即可得到当前温度

【MicroPython】machine.ADC类函数详解

  • machine.ADC(id):
    • ADC对象构造函数,并初始化对应的ADC通道。
    • id:可为GPIO(PIN)对象,也可为ADC通道;

ADC对象构造函数,作用为初始化对应ADC通道。 参数ID为使用的ADC通道,可以使用Pin对象,也直接指定ADC通道,

使用Pin对象时,指定的GPIO需要支持ADC功能,即GPIO26-29;

使用指定ADC通道,通道0-3 对应GPIO26-29,通道数4则是对应内部温度传感器。

  • ADC.read_u16():
    • 读取对应通道ADC数值

read_u16函数,其作用读取对应通道ADC,并返回读取数值 数值;

这里需要注意一点,该函数返回值并不是直接返回ADC读取的数值,而是处理过的数值,其数值范围为0-65535;

故ADC电压计算公式应为:

Vin =\frac{3.3*ReadData}{65535}Vin=655353.3∗ReadData​

ADC读取电压为3.3乘上返回值除以65535,单位为V

此文章仅针对RP2040 MicroPython固件,以源码为准,本文根据编写时官方源码编写,用于为初学者提供便利,仅供于参考,如有能力者建议自行查询MicroPython源码

代码实现

准备器件:

  • pico 1
  • 蓝白电位器 1
  • 双公头杜邦线若干

原理图:

  • 把蓝白电位器的1脚连接到3.3V
  • 2脚连接到GND
  • 3脚连接到GPIO26
    ![[Pasted image 20220922204949.png]]

from machine import Pin,ADC
import utime


ADC0 = ADC(Pin(26))  # 通过GPIO26初始化ADC
sensor_temp = ADC(4) # 指定初始化ADC通道4,其对应片内温度传感器



while True:
    read_voltage = ADC0.read_u16()*3.3/65535   # 读取ADC通道0的数值并根据ADC电压计算公式得到GPIO26引脚上的电压
    read_temp_voltage = sensor_temp.read_u16()*3.3/65535    # 计算出ADC通道4上的电压
    temperature = 27 - (read_temp_voltage - 0.706)/0.001721   # 温度计算公式,即可计算出当前温度
    print("ADC0 voltage = {0:.2f}V \t\t  temperature = {1:.2f}℃ \r\n".format(read_voltage, temerature))    # 将GPIO26上的电压输出到控制台,将当前温度输出到控制台
    utime,sleep_ms(1000)



这个程序实现了每秒读取一次GPIO26上的电压,并使片内温度传感器采集温度

调节一下蓝白电位器,可以看到电压的变化

将比较冷的物体接触一下芯片会发现温度的变化
微雪PICO教程

### 树莓派4B串口通信配置与实现 #### 1. 环境准备 树莓派4B支持多种方式的串口通信,通常可以通过UART接口与其他设备(如STM32、传感器等)进行数据交换。为了确保正常工作,需先完成基本设置。 下载并安装`raspi-config`工具来调整系统参数[^2]: ```bash wget http://archive.raspberrypi.org/debian/pool/main/r/raspi-config/raspi-config_20200727_all.deb sudo dpkg -i raspi-config_20200727_all.deb ``` 运行`raspi-config`进入配置界面,禁用登录shell以便释放硬件UART资源用于其他用途: ```bash sudo raspi-config ``` 导航至 `Interfacing Options -> Serial Port` 并关闭串行控制台登录功能[^3]。 #### 2. GPIO引脚分配 对于树莓派4B,默认GPIO针脚布局如下表所示: | 功能 | Pin号 | |------------|-------| | TXD (发送) | PIN8 | | RXD (接收) | PIN10 | 注意:当连接外部设备时,请务必确认电压匹配问题,部分模块可能仅接受3.3V信号电平[^1]。 #### 3. Python示例程序 下面提供一段基于PySerial库读写串口的数据交互代码片段: 首先需要安装pyserial包: ```bash pip install pyserial ``` 随后编写Python脚本处理具体逻辑: ```python import serial import time def read_data(): ser = serial.Serial('/dev/ttyS0', baudrate=9600, timeout=1) while True: if ser.in_waiting > 0: data = ser.readline().decode('utf-8').rstrip() print(f'Received Data: {data}') if __name__ == "__main__": try: read_data() except KeyboardInterrupt: pass ``` 上述例子展示了如何持续监听来自指定端口的消息流,并将其打印到标准输出中。 #### 4. 注意事项 在实际操作过程中可能会遇到一些常见错误或者异常情况,比如权限不足无法访问设备文件等问题,则可通过赋予适当权限解决: ```bash sudo chmod 666 /dev/ttyS0 ``` 另外,在调试阶段推荐借助minicom之类的终端仿真软件辅助排查潜在故障点。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值