文章目录

  • 什么是ADC
  • RP2040 ADC技术参数
  • ADC大致框架图
  • 【MicroPython】machine.ADC类函数详解
  • 代码实现
  • 如果我们需要使用PWM精准的控制LED的亮度,就需要反馈
  • 但是LED的亮度是一个模拟变量,MCU不能直接处理模拟信号
  • 我们需要将其转换为数字信号才能进行处理

什么是ADC

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

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

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

  • 常见的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引脚

ADC大致框架图

ADC的大致流程为:

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

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

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

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

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

通用ADC输入电压计算公式如下:

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

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

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

将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

from machine import Pin,ADC
import utimeADC0 = 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教程

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

  1. 微雪树莓派PICO笔记——1.基础介绍

    文章目录 基础硬件 原理图讲解 电路图重点讲解 点灯实操 基础硬件 长度51mm,宽度21mm,板厚1mm pcb使用了沉金工艺,所以引脚都做了半孔设计,即可焊接2.54mm的排针,也可以直接焊在主板 ...

  2. 微雪树莓派PICO笔记——3.PWM(脉冲宽度调制)

    文章目录 什么是PWM PWM的应用 RP2040 PWM框架图 PWM流程图 PWM内部框架图 [MicroPython]machine.PWM类函数详解 代码实现 什么是PWM 脉冲宽度调制 (P ...

  3. 微雪树莓派PICO笔记——7. SPI(串行外设接口)

    文章目录 SPI简介 硬件连接 通讯协议详解 RP2040 SPI 主要参数 RP2040 SPI 逻辑框图 machine.SPI类函数详解 例程地址 代码示例 代码实现 SPI简介 SPI全称为串 ...

  4. 微雪树莓派PICO笔记——5. UART (异步收发传输器)

    文章目录 通讯协议 UART UART详解 RP2040 UART参数 UART流程图 函数详解 例程地址 码代码 通讯协议 MCU如果要说话需要约定一定的规则,这些规则,我们称为通信协议 常见的有U ...

  5. 微雪树莓派PICO笔记——6. I2C(集成电路总线)

    文章目录 简介 协议详解 RP2040 I2C主要参数 函数讲解 内存操作 软件I2C 例程地址 实操 程序讲解 简介 I2C 集成电路总线,一种串行通信总线,使用多主从架构 由飞利浦公司在20世纪8 ...

  6. stm32学习笔记 ADC模拟数字转换器 ADC模数转化器详解

         一.为什么要使用ADC模拟数字转换器     STM32主要是数字电路,数字电路只有高低电平,没有几V电压的概念,所以如果想要读取电压值,就需要借助ADC模数转化器来实现.可以说ADC是模拟 ...

  7. STM32单片机(七)ADC模拟数字转换器----第二节:ADC模数转换器练习1(AD单通道)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分:建议先学习51单片机,其是STM32等高级单片机的基础:这样再学习STM32时才能融会贯通. ☀️ 专栏适 ...

  8. STM32 深入模拟数字转换器ADC

    ADC 是现实世界和数字化世界的的桥梁 1.ADC整体思路 2.STM32 ADC模块结构 3.单次单通道ADC1 软件触发 4.规则组多通道转换 a.不使用DMA b.使用DMA c.EXTI Li ...

  9. [树莓派]PICO基础使用_微雪OLED显示

    简介 Raspberry Pi Pico是具有灵活数字接口的低成本,高性能微控制器板.它集成了Raspberry Pi自己的RP2040微控制器芯片,运行速度高达133 MHz的双核Arm Corte ...

最新文章

  1. 对于容器环境来说 全栈监控究竟意味着什么?
  2. 【Spark Summit East 2017】BigDL:Spark上的分布式深度学习库
  3. 老BOJ 13 K-based Numbers
  4. acwing2019. 拖拉机(最短路径)
  5. android 联系人批量插入,GitHub - Atinerlengs/InsertDemo: android 简单的批量插入通话记录、联系人、短信demo...
  6. 命名实体识别以及词性自动标注
  7. 图片区域帧差法识别物体_matlab
  8. 上市公司回购股票是利好还是利空?
  9. 设置代理_PC客户端爬虫,这样设置代理就对了
  10. python 导入自己写的类_Python3.7模块的定义、导入、优化操作图文完全详解,附视频教程...
  11. flutter 弹幕插件_Flutter 实现虎牙/斗鱼 弹幕效果
  12. 爬虫mm131明星照片
  13. XP连接网络计算机未启动服务,网络不存在或尚未启动/以及局域网互访的解决办法...
  14. 两独立样本非参数检验的Mann-whitneyU检验
  15. 无法定位程序输入点于动态链接库(更新)
  16. Yolov5学习笔记(1)——训练出自己的模型
  17. 7.22版本服务器维护,7月22日服务器例行维护公告
  18. python/sympy求解矩阵方程
  19. 数字化赋能三农 农行、邮储如何保“质”更保“智”?
  20. 使用RPA有什么好处

热门文章

  1. Android系统签名文件转换为keystore文件
  2. Newtonsoft.Json序列化库
  3. 计算机专业必备:用python实现自动shua课,简直不要太爽
  4. Altium Designer(AD)安装教程
  5. IP地址之无分类编址CIDR
  6. 14. 深度解读ARM新架构:大核进取、小核摆烂?
  7. 南京邮电大学汇编语言程序设计实验一:汇编语言语法练习与代码转换
  8. 要求统计给定整数M和N区间内素数的个数,并对所有素数求和。
  9. KVM虚拟化管理工具之virtsh(三)
  10. java计算机毕业设计ssm基于大数据的汽车流量监控cvej1(附源码、数据库)