资讯动态

树莓派 Pico ADC 实战指南:MicroPython 采样、定时采集与滤波校准

发布时间:2026/9/12 19:54:42 来源:尧图企业网站定制
树莓派 Pico 的 ADC说难不难说简单也不简单。很多朋友拿到板子先点个 LED、跑个呼吸灯觉得很顺手一碰到模拟量采集就开始卡壳——读回来的电压为什么一直在跳为什么想在定时中断里读一次 ADC结果板子直接死给你看为什么用热敏电阻测温度算出来跟万用表差了五六度这篇文章不绕弯子直接从 machine.ADC 的 API 用法开始把采样原理、定时采集、ISR 避坑、数据滤波和校准挨个讲透。适合已经能跑 MicroPython 基础程序、正准备做传感器采集或小仪表项目的读者参考。1. 先把硬件看明白Pico 的 ADC 到底长什么样1.1 五个通道的分布GP26 到 GP28外加内部温度传感器树莓派 Pico 这颗 RP2040 芯片内部集成了一个 12 位逐次逼近型 ADC也就是常说的 SAR ADC。芯片上实际有 5 个模拟输入通道但在 Pico 开发板上并不是所有通道都引到了排针上这点很多人会搞混我先列个表说清楚。通道编号对应引脚板载用途建议使用场景ADC0GP26普通模拟输入外接传感器最常用ADC1GP27普通模拟输入外接传感器第二路ADC2GP28普通模拟输入外接传感器第三路ADC3GP29板载接 VSYS 分压监测 USB/电池供电电压谨慎复用ADC4无外部引脚内部温度传感器测芯片温度不推荐当室温计GP26、GP27、GP28 这三个引脚是真正可以自由使用的模拟输入通道用来接热敏电阻、光敏电阻、电位器、简易电压采集这些场景都没问题。GP29 在 Pico 板上已经被分压电阻连接到 VSYS 电源轨上用来监测供电电压如果你想读电池电压可以用它但要注意板上已经有分压网络实际电压需要乘回系数最好对着原理图确认比例。还有一个很容易踩的坑GP23、GP24、GP25 这三个引脚千万不要当成 ADC 用RP2040 上它们没有模拟输入功能。曾经见过朋友把光敏电阻接在 GP24 上软件里怎么配置都不出数最后查原理图才发现接错了。1.2 SAR ADC 的工作原理逐次逼近不是玄学逐次逼近型 ADC 的工作方式可以类比成一个天平称重物的过程。称一个物体的重量时先放最大的砝码如果太重就拿掉换小一号的如果轻了就留着再从剩下的砝码里挑次大的试如此反复直到把精度用尽。SAR ADC 内部就是一个这样的电压天平它从最高位开始依次尝试 1/2 参考电压、1/4 参考电压、1/8 参考电压……每试一次就把结果和输入电压比较一次12 位 ADC 就做 12 次逼近最后拼出一个数字。这个原理听起来很简单但它带出一个非常致命的实际问题——采样保持。ADC 在开始转换之前内部会有一个采样开关把一瞬间的输入电压冻结在内部的采样电容上。开关切过来的瞬间电容相当于一个负载会从信号源抽取一小部分电荷。如果你的信号源阻抗很高电容就充电慢还没充满就开始比较了结果读出来的电压偏低而且会随采样间隔变化飘来飘去。这就是为什么很多新人用 100k 甚至 1M 的分压电阻直接接 ADC 时发现读数一路往下掉或者波动大。RP2040 的 ADC 输入端要求源阻抗尽量低一般建议等效源阻抗不要超过几十 kΩ最稳的办法是加一个运放电压跟随器或者把分压电阻的阻值控制在 10kΩ 级别。1.3 采样周期与转换节奏理论速度和实际速度的区别从数据手册上看RP2040 的 ADC 完成一次转换大约需要 2 微秒左右如果你用 C SDK 配合 DMA确实可以做到连续高速采样。但在 MicroPython 环境里调用一次read_u16()实际耗时远远不止这个数因为 Python 解释器本身有开销函数调用、整数对象构造、底层 C 代码的调度加在一起通常要几十微秒甚至更多。这个差距意味着什么意味着你在 MicroPython 里做连续采样时实际采样频率并不高也不可能靠它去采集音频这类高速信号。但反过来它也带来了一个便利如果你在代码里连续读取很多次 ADC每次读数之间实际上已经有足够的时间让采样电容充满电了所以 MicroPython 场景下源阻抗带来的问题相对没那么严重但依然存在特别是接高阻传感器时。真正需要注意的是如果一条采集代码跑得非常快比如在循环里不加任何延时连续读取 100 次这时候相邻两次采样之间采样保持电容可能没有完全恢复读数会比正常值偏小。我的习惯是批量采样时在每次读数之间插入几十微秒的延时给电容留出充电时间后面讲滤波的时候会给出完整代码。2. machine.ADC 的打开方式API 拆解2.1 创建 ADC 对象用 Pin 还是用通道号MicroPython 的 machine 模块提供了 ADC 类创建 ADC 对象有两种常见写法from machine import ADC, Pin # 方式一传入 Pin 对象语义清楚推荐 adc0 ADC(Pin(26)) # 方式二传入通道编号0 对应 GPIO26 adc0 ADC(0)这两种写法是等价的ADC(0)里的 0 指的是 ADC 通道 0也就是 GP26。很多教程里写ADC(26)这个写法在树莓派 Pico 上并不是标准用法虽然某些魔改固件里碰巧能跑但它依赖固件内部把整数当 GPIO 编号处理的扩展逻辑换个固件可能就报错了。我建议养成用ADC(Pin(26))的习惯代码可读性好也不容易被固件差异坑到。创建对象时如果传入了不存在的通道MicroPython 一般会抛出ValueError或TypeError。如果你运行代码时碰到这类报错第一件事就是确认自己的引脚编号有没有写错尤其是把 GP26 写成 36 这种低级错误。2.2 三种读值方法read、read_u16 和 read_uv 怎么选在 Pico 的 MicroPython 固件中ADC 对象主要提供两个读值方法read_u16()和read_uv()。部分版本还保留了一个read()方法但返回值的意义在不同固件间不统一我的建议是只用前两个。read_u16()返回一个 0 到 65535 的整数表示模拟电压相对于参考电压的比例。这个方法最直观也是大多数示例代码用的。read_uv()直接返回微伏单位的电压值省去手动换算适合对电压数值比较敏感的场景。用法很简单raw adc0.read_u16() # 返回 0~65535 volt_uv adc0.read_uv() # 返回微伏比如 1650000 表示 1.65V # 手动换算电压read_u16 的结果映射到 0~3.3V volt raw / 65535 * 3.3这里有一个非常重要的知识点read_u16()虽然返回的是 16 位的值但 RP2040 的 ADC 本身只有 12 位分辨率。MicroPython 在底层会把 12 位结果左移 4 位塞进一个 16 位整数里。换句话说这个返回值的最低 4 位恒为 0实际有效分辨率为 12 位。你不可能通过 Python 层把 12 位的硬件读出 16 位的精度这一点心里要有数。read_uv()方便是方便但它的计算基准是 Pico 板上的 3.3V 参考电压。如果板子供电质量一般或者 3.3V 实际偏离了标称值这个方法的读数也会有系统偏差。追求绝对精度的时候还是要用标准电压源做一个校准这个我在第五部分会专门讲。2.3 电压换算与量程陷阱Pico 的 ADC 输入量程是 0 到 3.3V超过 3.3V 可能会损坏引脚低于 0V 也一样危险。这个限制决定了你不能直接把 5V 传感器的输出接到 Pico 上除非先用分压电阻把电压降到 3.3V 以下。分压电路很简单两个电阻串联中间抽头接 ADC 输入。假设你要把一个 0~5V 的信号降到 0~3.3V可以选 10kΩ 和 20kΩ 两个电阻串联5V 经两个电阻分压后ADC 端最高电压大约是 3.33V留了一点余量。需要注意的是分压后的等效源阻抗是 10k 和 20k 的并联大概是 6.67kΩ这个值对 Pico 的 ADC 来说还可以接受但如果你把两个电阻都放大 10 倍等效源阻抗就变成 66.7kΩ读数就会开始发飘了。还有一点要留意Pico 的 ADC 参考电压直接取自主电源的 3.3V而这个 3.3V 轨在板子上同时也给其他外设供电。当你驱动舵机、电机、大功率 LED 时3.3V 轨上的电压会波动ADC 读数自然跟着跳。后面讲实操的时候我会专门提这个坑。3. 实战定时温度采集从传感器到温度值3.1 NTC 热敏电阻与分压电路设计做温度采集最简单可靠的低成本方案就是 NTC 热敏电阻。它本质上是一个随温度变化阻值的电阻常温下阻值变化率比较明显用分压电路就能转换成电压信号非常适合配合 Pico 的 ADC 使用。我的建议选型是 10kΩ 25°C、B 值 3950 的 NTC 热敏电阻这个型号市面上最多资料也全B 值公式算起来熟门熟路。电路连接方式如下3.3V 引脚接一个 10kΩ 固定电阻叫它 R_refR_ref 的另一端接 NTC 的一端NTC 的另一端接 GNDR_ref 和 NTC 的连接点引出导线接到 Pico 的 GP26 上。这样组成了一个简单的分压网络。NTC 的阻值随温度变化中间节点的电压也会随之变化。温度升高时NTC 阻值下降节点的电压跟着下降温度降低时反之。ADC 读到的就是节点电压。为什么要让分压电阻和 NTC 的标称阻值接近因为温度变化时电压变化最明显的区域正好在电阻值接近的区域。如果 R_ref 选 100kΩ 配 10kΩ 的 NTC虽然也能工作但温度变化引起的电压变化幅度小很多相当于把宝贵的 ADC 分辨率先损耗了一部分。10k 配 10k 可以保证在 25°C 附近节点电压接近 1.65V正好落在 ADC 量程的中间线性区。还有一个容易忽略的问题NTC 是电阻器件通电流就会发热。流过 NTC 的电流越大自身发热越明显测量误差越大。在 3.3V、10kΩ 串联电路下常温电流大约 0.165mANTC 上的功耗不到 0.3mW自热效应可以忽略。如果你把分压电阻换到 1kΩ电流增加到毫安级自热误差可能就到了零点几度甚至更高精密测温时要格外注意。3.2 从电压到温度B 值公式推导分压电路输出的是电压要变成温度还需要两步换算先把电压还原成 NTC 的阻值再用阻值计算出温度。第一步根据分压关系反推 NTC 阻值。设 ADC 读到的电压为 V_a供电电压为 VccNTC 阻值为 R_ntcV_a Vcc * R_ntc / (R_ref R_ntc)反推得到R_ntc R_ref * V_a / (Vcc - V_a)第二步用 B 值公式把阻值换算成温度。B 值公式是R_ntc R_25 * exp(B * (1/T - 1/T0))其中 R_25 是 25°C 下的标称阻值10kΩT0 是 25°C 对应的开尔文温度 298.15KB 是热敏电阻的 B 值常数。把公式两边整理得到温度表达式T 1 / (1/T0 (1/B) * ln(R_ntc / R_25))算出来的温度 T 是开尔文温标减掉 273.15 就是摄氏度。写成 MicroPython 函数很简洁import math R_REF 10000 R_25 10000 B 3950 T0 298.15 def adc_to_temp(raw, vcc3.3): v_a raw / 65535 * vcc if v_a vcc: return -999 r_ntc R_REF * v_a / (vcc - v_a) temp_k 1 / (1 / T0 math.log(r_ntc / R_25) / B) return temp_k - 273.15代码里之所以要判断v_a vcc是因为 R_ntc 的计算式里出现了分母如果 ADC 读到满量程说明 NTC 短路到高电平了直接除会出错返回一个异常值出来。这里要提醒一句B 值公式本质上是一个近似公式它对同一颗 NTC 在整个温度区间内的拟合精度不是均匀的在 25°C 附近误差较小温度离得越远误差越大。如果你的测温范围很宽、对精度要求高可以考虑用更精确的 Steinhart-Hart 三参数方程或直接查厂家提供的阻值-温度表做插值。不过我做了这么多年项目实际场景里 B 值公式加两点校准已经能满足绝大多数 0~100°C 范围的测量需求了。3.3 定时采样的三种方案sleep、Timer、线程温度采集通常不需要高速连续采样隔几百毫秒甚至几秒采一次就够了。这时候怎么安排采样节奏就成了一个实际的设计问题。我见过不少人一上来就用time.sleep()卡主循环这在纯采集场景下没问题但一旦你还要同时按键、显示、通信问题就来了。三种主流方案对比方案是否阻塞主循环定时精度实现复杂度适用场景sleep 主循环阻塞一般最低只采集不做其他事Timer 回调 标志位不阻塞较高中等采集同时处理 UI/通信后台线程不阻塞一般较高特殊场景慎用sleep方案最直观一个 while 循环里采样、计算、打印、sleep 就行但它的问题是sleep 期间整个程序都停住了如果睡眠时间较长你按一个按键都要等半天才有反应。Timer方案是更优雅的做法。MicroPython 的machine.Timer可以设定周期触发回调函数时间到了系统会打断当前代码跳进回调执行完毕后继续原来的任务。回调里只做一件事——置一个标志位主循环检测到标志位再去处理采集和计算逻辑。这样主循环能保持响应定时也没有被阻塞的风险。线程方案理论上可以但 MicroPython 的_thread在 RP2040 上要多占一块内存而且两个线程同时访问同一个全局变量时容易出竞争问题对初学者非常不友好。我不建议为了定时采集这种轻任务去开线程成本大于收益。3.4 完整代码一个最小但可靠的温度记录器把前面的内容串起来写一个带定时采样的温度记录器它在后台用 Timer 定时 1 秒触发一次主循环实时处理按键和显示from machine import ADC, Pin, Timer import math import time # ---- 配置参数 ---- R_REF 10000 R_25 10000 B 3950 T0 298.15 adc ADC(Pin(26)) timer Timer() flag [0] # 用列表存标志ISR 里只改元素更稳妥 # ---- 温度换算 ---- def adc_to_temp(raw, vcc3.3): v_a raw / 65535 * vcc if v_a vcc or v_a 0: return -999 r_ntc R_REF * v_a / (vcc - v_a) temp_k 1 / (1 / T0 math.log(r_ntc / R_25) / B) return temp_k - 273.15 # ---- 定时回调只置标志 ---- def tick(t): flag[0] 1 timer.init(freq1, modeTimer.PERIODIC, callbacktick) # ---- 主循环 ---- while True: if flag[0]: flag[0] 0 raw adc.read_u16() temp adc_to_temp(raw) print(当前温度: {:.2f} C.format(temp)) # 这里可以继续写按键扫描、OLED 刷新等任务 time.sleep_ms(10)这段代码里定时回调中的flag[0] 1极其轻量不会给中断系统带来压力。主循环每 10ms 巡检一次标志位一旦发现被置位就执行采集和温度计算。即使你偶尔在主循环里处理耗时任务也只是让采集延后几十毫秒不会影响系统的稳定性更不会把中断系统拖垮。4. ISR 避坑指南为什么不能在中断里直接读 ADC4.1 MicroPython 中断回调是半软半硬的很多新手拿到 Timer 后脑子里冒出的第一个想法就是既然定时到了要采集那直接在回调函数里读 ADC、算温度、打印结果不就行了吗省得主循环里还要轮询多干净。我劝你千万别这么干至少不要在回调里做全部流程这是我在实际项目里踩过最深的一个坑。MicroPython 的 Timer 回调虽然是用 Python 写的但它在底层运行在硬件中断上下文里和主循环那种用户态环境不同。在中断上下文中有诸多限制不能做会阻塞的操作、不能触发垃圾回收、不能分配大块内存。Python 每构造一个整数对象、每拼接一次字符串、每 push 一次列表都可能触发内存分配轻则影响实时性重则直接抛出MemoryError导致系统卡死。4.2 在 ISR 里读 ADC 会发生的两件坏事第一件read_u16()这种 Python 层的调用内部会经历一系列对象分配和底层函数调用。如果恰好碰到需要垃圾回收的时机在中断里执行内存分配和回收有大概率把整个 MicroPython 运行时搞崩。表现就是程序突然停住串口没有任何输出复位才恢复。这种故障最可怕的地方在于——它不是必现的而是偶发的可能跑十分钟好好的突然来一下排错能排到怀疑人生。第二件如果你的传感器不是直接接在 Pico 内部 ADC 上而是通过 I2C 或 SPI 接口外挂的 ADC 芯片在中断里发起一次 I2C 读取就更危险了。I2C 单次传输需要等待从机应答整个操作耗时可能达到几百微秒甚至毫秒级。这段时间里中断一直占用着 CPU定时器的下一次中断可能被延迟其他依赖实时性的任务全部受到影响。要是从机还处于忙状态I2C 等待重试的时间更不可控整个系统的节奏都会乱掉。所以不管是从稳定性还是从实时性角度ISR 里直接做 ADC 采集都是得不偿失的做法。4.3 正确姿势标志位 主循环消费正确的做法很简单中断回调只负责通知主循环到点了而真正耗时的采样、计算、打印动作全部放在主循环里做。我前面温度记录器的代码用的就是这种模式。但是这里还有一个进阶的问题布尔标志位模式在极端情况下会丢中断。假设你的定时器 1ms 触发一次而主循环处理一次采集加打印需要 5ms那主循环刚处理完一个标志位下一次中断早就来了。flag 还是 1主循环处理完这一轮后再等下一轮才能感知到新的中断——中间 5 个采样周期就这么白白丢了。在这种情况下更稳的是改成累积计数模式回调里每次对计数器加一主循环每次处理一个计数值这样即使主循环处理不过来计数器也会把所有触发次数都记下来处理完一个再来一个不会丢事件。from machine import ADC, Pin, Timer import time adc ADC(Pin(26)) timer Timer() counter [0] # 预分配的计数器容器 def tick(t): counter[0] 1 timer.init(freq10, modeTimer.PERIODIC, callbacktick) while True: if counter[0] 0: counter[0] - 1 raw adc.read_u16() print(raw) time.sleep_ms(5)如果定时频率很高、主循环处理不过来计数器会一直涨上去这本质上就是一个最简单的生产者-消费者模型。当计数值持续快速增长时说明你的采集频率和主循环处理能力已经失衡了可以选择降低中断频率或者把采集任务拆成更小的工作单元。再强调一遍凡是涉及print()、文件写入、字符串格式化、sleep()、列表追加这些操作的代码一律不要放进 ISR。回调函数里唯一允许做的事情就是修改一个预分配好的变量或列表元素。5. 把数据变可信漂移、噪声与滤波5.1 数据漂移的几个源头ADC 读数跳、数据漂移是所有玩模拟采集的人都会碰到的问题。很多新人第一反应是ADC 坏了其实绝大多数漂移都不是 ADC 本身的问题而是外围环境在捣鬼。第一个来源是电源电压变化。Pico 的 ADC 参考电压是 3.3V这个 3.3V 如果波动了ADC 读出来的电压值也会跟着波动哪怕你的被测信号一点没变。插上 USB 供电拉一个舵机观察 ADC 读数瞬间跳动就是这个原因。第二个来源是分压电阻的温度漂移。普通贴片电阻的温漂可能在 ±100ppm/°C 甚至更高如果你把板子放在温度变化大的环境里分压电阻本身阻值变了读数自然就偏了。追求长期稳定性的话选温漂小的金属膜电阻会是更好的选择。第三个来源是信号源阻抗。前面提过的采样电容充电问题阻抗越高充电越慢读数越容易受采样时序影响。这也是为什么工业仪表里模拟输入前面一定会加一个运放缓冲。第四个来源是电磁干扰。Pico 这种开放排针的板子模拟输入引线如果和 PWM 舵机线、电机线走在一起容易耦合噪声。传感器线用双绞线或者屏蔽线能明显改善。5.2 滤波三种简单有效的软件方法硬件上优化是根治但在原型阶段先用软件滤波快速把数据稳定下来往往是性价比最高的做法。这里分享三个我用得最多的滤波方法全部是纯 Python直接抄就能用。中位值滤波专门对付偶发尖峰。连续采 5 到 11 次排序后取中间值效果是能完美滤掉突发性的异常值比如一次松动的接触不良产生的毛刺。缺点是采集多次会有时间开销。def median_read(adc, count7): samples [] for _ in range(count): samples.append(adc.read_u16()) time.sleep_us(100) samples.sort() return samples[len(samples) // 2]滑动平均适合抑制随机噪声。维护一个固定长度的窗口每次循环丢最旧值、加最新值取平均。窗口越大越平滑但响应越慢。温度采集这种缓变量用 8 到 16 的窗口都合适。def moving_average(new_value, buf, window8): buf.append(new_value) if len(buf) window: buf.pop(0) return sum(buf) / len(buf)一阶低通滤波代码最简洁但效果不输前面两种。它本质是一个极简的 IIR 滤波器用一个系数 alpha 控制新旧数据的权重alpha 越大跟随越灵敏alpha 越小输出越平滑。温度采集我一般取 0.1 到 0.3。alpha 0.2 filtered 0 def lowpass(new_value): global filtered filtered alpha * new_value (1 - alpha) * filtered return filtered我的实际经验是中位值滤波加一阶低通组合效果最好。先用中位值剔除毛刺再加低通平滑随机噪声。注意采样间隔大时低通滤波的时间常数也大初始阶段从 0 开始爬升需要一段时间程序启动后可以丢弃前几个滤波输出或者把初值直接设为第一轮采样的值。5.3 校准从两点到三点软件滤波解决的是波动问题校准解决的是准确问题。即便你把电路搭得完美滤波做得再漂亮Pico 内部 ADC 本身还存在偏移误差和增益误差。出厂时芯片没有按更高精度标准校准每颗芯片之间都有个体差异。两点校准是最常用的方式。准备一个可调稳压电源给 ADC 输入加两个已知电压比如 1.000V 和 3.000V用万用表确认实际电压值再读取 ADC 测得的电压。假设 ADC 测得值分别是 1.023V 和 3.064V那么偏移量 offset 和增益 gain 可以算出来offset 1.023 - 1.000 0.023Vgain (3.064 - 1.023) / (3.000 - 1.000) 1.0205校准公式就是真实值 (测量值 - offset) / gain。在代码里把校准参数放到adc_to_temp前面对v_a先做校准再计算温度def calibrate(v_measured): offset 0.023 gain 1.0205 return (v_measured - offset) / gain两点校准能有效修正线性的偏移和增益误差。如果 ADC 的非线性比较明显或者测温跨度很大可以做三点校准在低温、中温、高温各取一个校准点然后用分段线性插值代替单一直线校准。这个方法本质上是把整条 ADC 特性曲线拆成多段斜率不同的直线每一段里都按两点校准来处理。还有一个细节校准参数最好保存成配置文件写在代码顶部或者存到 Flash 里。每次换板子、换传感器都重新校准把参数写进代码里会被 Git 记录方便追溯。6. 常见问题速查与我的经验6.1 常见问题速查表现象可能原因解决方案读数上下乱跳无规律接线接触不良、干扰检查杜邦线改用焊接/屏蔽线加滤波读数明显比实际电压低源阻抗过高采样电容充不满降低分压电阻阻值加运放缓冲中断回调里读 ADC 后死机ISR 中有耗时分配操作回调只置标志主循环处理采集温度值整体偏高或偏低分压电阻或 NTC 参数不匹配用万用表实测校准接舵机/电机后读数乱跳3.3V 电源被拉偏独立供电模拟部分加滤波电容打印温度时串口卡顿print 太频繁降低打印频率批量输出6.2 几个让我记忆深刻的实际问题最后分享三个我实际踩过的坑都是网上很难查到的细节希望对你有帮助。第一个是 GP29 被 VSYS 占用的坑。有次做电池供电的项目想用第四个 ADC 通道读另一个传感器接上去发现读数一直在 2V 左右晃动怎么接都像电压源。查原理图才发现 GP29 在板子上已经被分压电阻绑到了 VSYS 上我的传感器相当于并接在一个固定分压网络里读数当然不对。从那以后我每次都先查 Pico 的原理图再规划引脚。第二个是使用 PMW 控制舵机时ADC 数据被干扰得面目全非。当时给机械臂加了一个舵机驱动舵机一转动温度读数直接跳了十几度。我一开始以为是滤波不够疯狂加算法后来发现舵机消耗电流太大把板子上的 3.3V 拉得上下颠簸ADC 参考源也跟着颠读到的当然不准。最终方案是舵机单独供电ADC 输入端加 100nF 去耦电容问题立刻消失。很多软件问题其实是电源问题排查顺序应该是电源、硬件、软件。第三个是关于 NTC 分压电阻阻值选的教训。有次图省事手边只有 100kΩ 电阻就直接拿来做分压。结果发现温度从 0°C 到 50°C 的变化ADC 读数只变了不到 300 个数分辨率惨不忍睹最后换回 10kΩ 才恢复。选分压电阻要和 NTC 标称值匹配这句话不是随便说说的它直接决定了你整个温度测量的分辨率和线性度。树莓派 Pico 的 ADC 功能其实并不复杂它就是一个 12 位、多通道、带内部温度传感器的模数转换器真正让人头疼的是外围电路设计和软件细节。把这篇文章里 API 选择、定时采集模式、ISR 约束、滤波校准这几件事理顺你的模拟量采集项目基本就能告别玄学走线稳步调试。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价