如何在树莓派Pico VREF引脚使用外部电压基准(ADAFRUIT LM4040)
树莓派Pico外接LM4040电压基准的实现方案(Arduino IDE/C++ SDK)
首先必须提醒硬件风险:树莓派Pico的VREF引脚输入电压范围为1.0V~VDD(通常是3.3V),禁止输入超过3.3V的电压,否则会损坏硬件。如果你使用的是4.096V输出的LM4040,建议更换为3.3V输出的型号(如LM4040C33),或额外增加分压电路将电压降至3.3V以内。
以下是针对你提到的两个Arduino平台的具体实现方法:
一、Earle F. Philhower的Raspberry Pi Pico/RP2040核心(推荐,蓝牙支持完善)
该核心的analogReference需使用正确参数,或直接操作寄存器配置:
方法1:使用analogReference(适配新版核心)
部分版本的核心支持EXTERNAL_VREF参数,代码示例:
#include <Arduino.h> // 根据LM4040实际输出电压修改,示例为3.3V const float REF_VOLTAGE = 3.3f; const int ANALOG_IN_PIN = A0; void setup() { Serial.begin(115200); while (!Serial); // 等待串口连接 // 配置ADC使用外部VREF引脚作为参考源 analogReference(EXTERNAL_VREF); } void loop() { int adc_value = analogRead(ANALOG_IN_PIN); // Pico ADC为12位分辨率(0-4095),需除以4095.0计算电压 float adc_voltage = (adc_value * REF_VOLTAGE) / 4095.0f; Serial.print("ADC值: "); Serial.print(adc_value); Serial.print(" | 电压: "); Serial.print(adc_voltage, 4); Serial.println(" V"); delay(1000); }
方法2:直接操作RP2040寄存器(兼容所有版本)
如果analogReference编译失败,可直接通过底层寄存器配置:
#include <Arduino.h> #include <hardware/adc.h> const float REF_VOLTAGE = 3.3f; const int ANALOG_IN_PIN = A0; void setup() { Serial.begin(115200); while (!Serial); adc_init(); adc_gpio_init(ANALOG_IN_PIN); // 将引脚配置为ADC输入 adc_select_input(0); // 选择对应通道(A0对应通道0) // 配置ADC使用外部VREF:清除原有REFSEL位,设置为外部参考模式(REFSEL=0b11) adc_hw->cs = (adc_hw->cs & ~ADC_CS_REFSEL_BITS) | ADC_CS_REFSEL(3); } void loop() { uint16_t adc_value = adc_read(); float adc_voltage = (adc_value * REF_VOLTAGE) / 4095.0f; Serial.print("ADC值: "); Serial.print(adc_value); Serial.print(" | 电压: "); Serial.print(adc_voltage, 4); Serial.println(" V"); delay(1000); }
二、Arduino Mbed OS RP2040 Boards核心
该核心的analogReference需使用AR_EXTERNAL参数,代码示例:
#include <Arduino.h> const float REF_VOLTAGE = 3.3f; const int ANALOG_IN_PIN = A0; void setup() { Serial.begin(115200); while (!Serial); // 设置ADC使用外部参考电压 analogReference(AR_EXTERNAL); } void loop() { int adc_value = analogRead(ANALOG_IN_PIN); // Mbed OS下Pico ADC同样为12位分辨率 float adc_voltage = (adc_value * REF_VOLTAGE) / 4095.0f; Serial.print("ADC值: "); Serial.print(adc_value); Serial.print(" | 电压: "); Serial.print(adc_voltage, 4); Serial.println(" V"); delay(1000); }
关键注意事项
- 树莓派Pico的ADC为12位分辨率(输出范围0-4095),而非传统Arduino的10位(0-1023),计算电压时需用4095.0作为分母。
- 若后续测试Pico W蓝牙功能,Earle F. Philhower的核心支持更成熟,优先选择该平台。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

