当前位置: 首页 > article >正文

庐山派K230学习日记6 ADC

1 本节介绍​

📝本节您将学习如何通过K230开发板上的ADC引脚获取外部电压,注意电压不得超过1.8V,否则会导致开发板永久损坏。

🏆学习目标

1️⃣了解 模数转换器【ADC】的基本概念。

2️⃣通过外接可调变阻器来改变接入引脚的电压,并通过IDE的端口打印出来实际电压值。

3️⃣TODO:进阶应用【考虑做一个电位器摇杆扩展】(请等待后续更新)

2 名词解释​

名词说明
模数转换器Analog-to-Digital Converter (通常称为:ADC,是一种将模拟形式的连续信号转换为数字形式的离散信号的外围设备)

3 什么是ADC​

模数转换器(Analog-to-Digital Converter,简称 ADC)是一种将模拟信号(一般为连续的电压信号)转换为数字信号(离散的二进制数据)的外围设备。在现代电子系统中,ADC 广泛应用于传感器数据采集、音频处理、工业控制等各种场景。

3.1 基本工作原理​

模拟信号是一个随时间连续变化的量(例如传感器的电压输出),而数字信号只在有限的离散时间点上取值,并且每个取值只能表示在一定量化精度下的数字代码。ADC 的作用就是定时(或在特定触发下)对模拟电压进行采样,并将每个采样点的电压值经过量化和编码后输出一个数字值。

一般步骤

  1. 采样:在每个采样时刻使用采样保持电路对输入模拟信号进行快速捕捉,获得瞬间电压值。
  2. 量化:将采样后的电压值映射到有限离散的电平(量化等级)。例如,一个 10-bit 的 ADC 可以将输入电压范围(0V 到基准电压 Vref)分成 2^10 = 1024 个离散电平。一般单片机最常见的是12bit的分辨率,我们的庐山派使用的主控芯片K230的ADC分辨率是12位的。
  3. 编码:将量化结果转换为对应的数字二进制码。例如,输入电压接近满量程的一半时,10-bit ADC 输出约为 512(0x200)。

3.2 ADC的关键技术指标​

分辨率(Resolution): ADC 输出的数字位数,如 8-bit、10-bit、12-bit、16-bit 等。分辨率越高,可表示的离散电平数越多,对模拟信号的量化精度越高。庐山派开发板使用的K230为12bit的ADC

采样速率(Sampling Rate): 每秒进行采样的次数(如 1kS/s、100kS/s、1MS/s、1GS/s)。采样速率越高,对快速变化的信号跟踪能力越强。庐山派开发板使用的K230主控芯片的采样速率为1MHz

参考电压(Vref): ADC 转换的量程通常由参考电压决定。输入信号应在 0 到 Vref 范围内变化,超出范围可能导致饱和或不正确转换。庐山派开发板在硬件设计中,参考电压由一个LDO提供,同时也供给芯片的RTC部分使用。供电电压为1.8V,所以我们的板子上的ADC接口只支持最高1.8的电压输入。

4 ADC使用指南​

K230 处理器内部集成了一个 ADC(模数转换)硬件模块,提供 6 个独立通道。该模块的采样分辨率为 12 位,即输出范围为 0-4095,采样速率为 1 MHz。

ADC 类属于 machine 模块。

4.1 示例​

from machine import ADC

# 实例化 ADC 通道 0
adc = ADC(0)

# 获取 ADC 通道 0 的采样值
print(adc.read_u16())

# 获取 ADC 通道 0 的电压值(单位为微伏)
print(adc.read_uv(), "uV")

4.2 构造函数​

adc = ADC(channel)

参数

  • channel: 表示要使用的 ADC 通道号,范围为 [0, 5]。

虽然K230芯片支持六个通道,但是板子上能用的只有四个,原理图和在板子上的实际位置如下:

原理图:

图 0


实际位置:

图 1

4.3 read_u16

ADC.read_u16()

功能

获取指定通道的当前采样值。

参数

返回值

返回该 ADC 通道的采样值,范围为 [0, 4095]。

4.4 read_uv

ADC.read_uv()

功能

获取指定通道的当前电压值 (微伏)。

参数

返回值

返回该 ADC 通道的电压值,单位为微伏(uV),范围为 [0, 1800000] 微伏。

5 获取电压​

因为庐山派的ADC引脚不能接入超过1.8V的电压,所以大家在外接设备时一定要注意电压范围。

在这里我的设备就是一个接入了一个2K的可调电阻,在这里我是用的电阻是立创商城的 C720647 大家可以自行去找其他可调电阻,原理是一样的,我这里用这个主要是我目前手头只有这个。且电路等效图如下图右边所示:

图 2

我这里把杜邦线都焊接到这个可调电阻上了,同时杜邦线想连接我们的板子也还需要一个FPC-6P转2.54杜邦线转接板和FPC-6P线(无利益相关,只是随便找的商家)。如果你买了屏幕或者HDMI扩展板的话,我们赠送的那一条6P-FPC线也可以使用。

具体连接如下图所示:

图 3

将可调电阻的1脚3脚连入1.8VGND,然后将可调电阻的2脚连入我们的ADC通道,我这里连入的是通道0,大家可以自行修改代码。 在这里借助万用表,接好地,旋转可调电阻,将之旋转到大概0.65V。运行以下代码。

from machine import ADC
import time

# 实例化 ADC 通道 0,用于读取模拟信号的数字值
adc = ADC(0)

# 主循环,持续运行程序逻辑
while True:
    # 获取 ADC 通道 0 的采样值
    # ADC 采样值是一个无符号 16 位整数,范围为 0 到 65535
    adc_value = adc.read_u16()

    # 获取 ADC 通道 0 的电压值,单位为微伏(uV)
    adc_voltage_uv = adc.read_uv()

    # 将电压值从微伏转换为伏特(V)
    # 1 伏特 = 1,000,000 微伏
    adc_voltage_v = adc_voltage_uv / (1000 * 1000)

    # 打印采样值和电压值
    # 输出格式为 "ADC Value: <采样值>, Voltage: <微伏值> uV, <伏特值> V"
    print("ADC Value: %d, Voltage: %d uV, %.6f V" % (adc_value, adc_voltage_uv, adc_voltage_v))

    # 简单延时 100 毫秒,防止主循环运行速度过快
    time.sleep_ms(100)

这个代码有详细的中文注释,这里不再过多解释,实际IDE运行效果如下图所示:

图 4


http://www.kler.cn/a/470085.html

相关文章:

  • 如何在Windows上编译OpenCV4.7.0
  • 【动态重建】时间高斯分层的长体积视频
  • 基于Centos 7系统的安全加固方案
  • 轻量级通信协议 JSON-RPC 2.0 详解
  • VScode SSH 错误:Got bad result from install script 解決
  • 【AWS SDK PHP】This operation requests `sigv4a` auth schemes 问题处理
  • 深入了解 SSL/TLS 协议及其工作原理
  • 计算机网络 (28)虚拟专用网VPN
  • 期权懂|期权都有哪些存在的风险因素?
  • RAG选择合适的向量数据库,完整案列,使用百川词嵌入模型与向量数据库lanceDB,智谱清言大模型整合
  • 探索 Vue.js 的动态样式与交互:一个有趣的样式调整应用
  • 基于 Python 大数据的民宿酒店推荐管理系统研究
  • 创客匠人老蒋主题演讲:如何构建创始人IP的商业增长闭环?
  • 年会游戏大全 完整版见考试宝
  • 眼见不一定为实之MySQL中的不可见字符
  • 深度学习-79-大语言模型LLM之基于python与ollama启用的模型交互API介绍
  • 使用Python,pypinyin将汉字转为带音调,首字母等多种风格的拼音,自动学习生字词
  • conda/pip基本常用命令理解与整理
  • 鸣潮洛可可养成攻略 雷电云手机怎么刷养成材料
  • 安卓触摸对焦
  • Python应用——将Matplotlib图形嵌入Tkinter窗口
  • 分布式环境下定时任务扫描时间段模板创建可预订时间段
  • Unity学习笔记(七)使用状态机重构角色攻击
  • Qt菜单栏、工具栏、状态栏(右键)
  • Linux(Ubuntu24.04)安装Eigen3库
  • 公共数据授权运营机制建设(六大机制、存在问题、发展路径)