Введение
Добро пожаловать в очередное практическое руководство в блоге Velxio! Сегодня мы погружаемся в АЦП (аналого-цифровой преобразователь) Raspberry Pi Pico. Pico — это мощная маленькая плата, и одна из её самых крутых особенностей — возможность считывать аналоговые напряжения, что идеально подходит для датчиков, потенциометров и многого другого. В этом примере мы будем считывать три внешних аналоговых сигнала с потенциометров, а также получать значение внутреннего датчика температуры. Всё это работает прямо в вашем браузере с помощью SPICE-точной симуляции Velxio.

Разбор схемы
Давайте посмотрим на схему. У нас есть Raspberry Pi Pico (вариант Nano RP2040 в Velxio), подключенный к двум потенциометрам и светодиоду.
Компоненты
- Raspberry Pi Pico (Nano RP2040): Мозг операции.
- Потенциометр A0 (pot-a0): Подключен к GPIO26 (A0). Его средний вывод (SIG) идет на A0, VCC — на 3.3V, а GND — на землю.
- Потенциометр A1 (pot-a1): Подключен к GPIO27 (A1). Та же разводка: SIG на A1, VCC на 3.3V, GND на землю.
- Красный светодиод (led-temp): Подключен к GPIO2 (D2) через токоограничивающий резистор (встроенный в компонент светодиода). Анод (A) идет на D2, катод (C) — на землю.
Детали подключения
- A0 (GP26) подключен к выводу SIG потенциометра pot-a0 синим проводом (
#4488ff). - A1 (GP27) подключен к выводу SIG потенциометра pot-a1 зеленым проводом (
#44cc44). - D2 (GP2) подключен к аноду красного светодиода красным проводом (
#ff4444). - Оба потенциометра используют общую шину 3.3V (красные провода) и землю (черные провода) от Pico.
- Катод светодиода подключен к земле.
Примечание: Выводы АЦП Pico рассчитаны на 3.3V, поэтому мы используем источник питания 3.3V. Потенциометры работают как делители напряжения, обеспечивая переменное напряжение от 0 до 3.3V на своем среднем выводе.
Разбор кода
Теперь давайте рассмотрим код. Он написан на C++ в стиле Arduino для Raspberry Pi Pico.
// Raspberry Pi Pico — Тест чтения АЦП
// Читает аналоговые значения с A0-A2 (GPIO26-28) и внутреннего датчика температуры
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("=== Pico ADC Read ===");
Serial.println("A0=GP26 A1=GP27 A2=GP28 Temp=внутренний");
Serial.println("12-битное разрешение (0-4095), опорное 3.3V");
Serial.println();
analogReadResolution(12);
}
void loop() {
int a0 = analogRead(A0);
int a1 = analogRead(A1);
int a2 = analogRead(A2);
// Внутренний датчик температуры на канале 4
// T = 27 - (V - 0.706) / 0.001721
int tempRaw = analogRead(A3); // Канал 4 отображается на A3 ядром Pico
float voltage = tempRaw * 3.3f / 4095.0f;
float tempC = 27.0f - (voltage - 0.706f) / 0.001721f;
Serial.print("A0: "); Serial.print(a0);
Serial.print(" A1: "); Serial.print(a1);
Serial.print(" A2: "); Serial.print(a2);
Serial.print(" Temp: "); Serial.print(tempC, 1); Serial.println(" C");
delay(1000);
}
Ключевые моменты
analogReadResolution(12): Устанавливает разрешение АЦП в 12 бит (0-4095). АЦП Pico по умолчанию 12-битный, но хорошей практикой является явная установка этого значения.analogRead(A0): Читает напряжение на GPIO26 (A0). Ядро Pico отображает A0 на GPIO26, A1 на GPIO27, A2 на GPIO28, а A3 — на внутренний датчик температуры (канал 4).- Расчет температуры: Внутренний датчик выдает напряжение, которое меняется в зависимости от температуры. Формула
T = 27 - (V - 0.706) / 0.001721преобразует напряжение в градусы Цельсия. Константа 0.706V — это напряжение при 27°C, а 0.001721 В/°C — это крутизна характеристики. - Вывод в Serial: Результаты выводятся каждую секунду.
Ключевые концепции
- Разрешение АЦП: АЦП Pico является 12-битным, что означает возможность представления 4096 дискретных уровней напряжения (от 0 до 4095). Опорное напряжение составляет 3.3V, поэтому каждый шаг равен примерно 0.8 мВ.
- Аналоговое и цифровое: Потенциометры обеспечивают непрерывное напряжение; АЦП преобразует его в цифровое число.
- Внутренний датчик температуры: Удобная функция для контроля температуры чипа без внешних компонентов.
- Делитель напряжения: Потенциометр работает как делитель напряжения, выдавая часть напряжения питания.
Типичные ошибки и советы по отладке
- Неправильное соответствие выводов: Помните, что A0 — это GPIO26, A1 — GPIO27, A2 — GPIO28, а внутренний датчик температуры доступен через A3 (канал 4).
- Плавающие выводы: Если средний вывод потенциометра не подключен, показания АЦП могут быть случайными. Всегда обеспечивайте надежное соединение.
- Монитор порта: Убедитесь, что скорость передачи данных совпадает (115200). В Velxio откройте Монитор порта на панели инструментов редактора.
- Светодиод не мигает: Светодиод в этом примере не управляется кодом; он просто подключен. Чтобы заставить его мигать, нужно добавить вызовы
digitalWrite(D2, HIGH)иdelay().
Предлагаемые расширения
- Добавьте третий потенциометр: Подключите третий потенциометр к GPIO28 (A2) и читайте его в коде.
- Управляйте светодиодом: Используйте показания температуры для включения светодиода, когда она превышает порог.
- Постройте график данных: Используйте Графический плоттер в Velxio для визуализации аналоговых показаний с течением времени.
- Используйте внешние датчики: Замените потенциометры на фоторезистор (LDR) или датчик температуры, например LM35.
Попробуйте сами!
Готовы экспериментировать? Откройте живой пример в Velxio и начните изменять схему или код. Нажмите на ссылку ниже, чтобы запустить симуляцию прямо в вашем браузере.
Запустить пример Pico ADC Read на Velxio
Удачных экспериментов!