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 的作用就是定时(或在特定触发下)对模拟电压进行采样,并将每个采样点的电压值经过量化和编码后输出一个数字值。
一般步骤:
- 采样:在每个采样时刻使用采样保持电路对输入模拟信号进行快速捕捉,获得瞬间电压值。
- 量化:将采样后的电压值映射到有限离散的电平(量化等级)。例如,一个 10-bit 的 ADC 可以将输入电压范围(0V 到基准电压 Vref)分成 2^10 = 1024 个离散电平。一般单片机最常见的是12bit的分辨率,我们的庐山派使用的主控芯片K230的ADC分辨率是12位的。
- 编码:将量化结果转换为对应的数字二进制码。例如,输入电压接近满量程的一半时,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")
2
3
4
5
6
7
8
9
10
4.2 构造函数
adc = ADC(channel)
参数
channel
: 表示要使用的 ADC 通道号,范围为 [0, 5]。
虽然K230芯片支持六个通道,但是板子上能用的只有四个,原理图和在板子上的实际位置如下:
原理图:
实际位置:
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 大家可以自行去找其他可调电阻,原理是一样的,我这里用这个主要是我目前手头只有这个。且电路等效图如下图右边所示:
我这里把杜邦线都焊接到这个可调电阻上了,同时杜邦线想连接我们的板子也还需要一个FPC-6P转2.54杜邦线转接板和FPC-6P线(无利益相关,只是随便找的商家)。如果你买了屏幕或者HDMI扩展板的话,我们赠送的那一条6P-FPC线也可以使用。
具体连接如下图所示:
将可调电阻的1脚和3脚连入1.8V
和GND
,然后将可调电阻的2脚连入我们的ADC通道,我这里连入的是通道0,大家可以自行修改代码。 在这里借助万用表,接好地,旋转可调电阻,将之旋转到大概0.65V
。运行以下代码。
# 立创·庐山派-K230-CanMV开发板资料与相关扩展板软硬件资料官网全部开源
# 开发板官网:www.lckfb.com
# 技术支持常驻论坛,任何技术问题欢迎随时交流学习
# 立创论坛:www.jlc-bbs.com/lckfb
# 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
# 不靠卖板赚钱,以培养中国工程师为己任
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)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
这个代码有详细的中文注释,这里不再过多解释,实际IDE运行效果如下图所示: