ATmega328P, RP2040 или ESP32-C3: какой микроконтроллер выбрать
Три самых доступных микроконтроллера любительских плат решают разные задачи. ATmega328P — 5-вольтовая логика, EEPROM и сон от 0,1 мкА. RP2040 — два ядра, 264 КБ ОЗУ, USB и программируемые блоки ввода-вывода PIO. ESP32-C3 — Wi-Fi и Bluetooth LE в одном чипе. Сравниваем их по даташитам и даём правила выбора.
Обновлено Редакция GAW
ATmega328P, RP2040 и ESP32-C3 стоят на самых распространённых недорогих платах: Arduino Uno и Nano, Raspberry Pi Pico и платах вроде ESP32-C3-DevKitM-1. Это три разных поколения и три подхода: 8-разрядный микроконтроллер с флеш-памятью в кристалле и питанием 5 В, двухъядерный Cortex-M0+ без своей флеш-памяти и с программируемым вводом-выводом, система на кристалле с радио. Ниже — сравнение по критериям, которые чаще всего решают выбор.
Коротко
- 5 В
- только ATmega328P: питание 1,8–5,5 В
- ОЗУ
- 2 КБ / 264 КБ / 400 КБ
- Радио
- Wi-Fi и Bluetooth LE — только ESP32-C3
- USB-устройство
- только RP2040: USB 1.1 хост и устройство
- Сон
- 4,2 мкА с WDT, 0,1 мкА без / 0,18 мА (ядро) / 5 мкА
- Флеш-память
- 32 КБ в кристалле / внешняя / в корпусе или внешняя
Сравнение по даташитам
Числа — из даташитов Microchip DS40002061B, Raspberry Pi RP2040 и Espressif ESP32-C3 v2.4, номера таблиц — в источниках. Токи типовые; условия у производителей разные, поэтому они указаны прямо в ячейках.
| ATmega328P | RP2040 | ESP32-C3 | |
|---|---|---|---|
| Ядро | 8-разрядное AVR | 2 × Cortex-M0+ | RISC-V, одно ядро |
| Частота | до 20 МГц при 4,5–5,5 В, до 10 МГц при 2,7 В | до 133 МГц (200 МГц при 1,15 В на ядре) | до 160 МГц |
| ОЗУ | 2 КБ | 264 КБ | 400 КБ (16 КБ — кэш) |
| Флеш-память | 32 КБ в кристалле | внешняя QSPI, до 16 МБ | 4 или 8 МБ в корпусе у части версий, иначе внешняя |
| EEPROM | 1 КБ | нет | нет |
| Питание выводов | 1,8–5,5 В | 1,62–3,63 В | 3,0–3,6 В |
| Вход 5 В | да, при питании 5 В | нет: до IOVDD + 0,3 В | нет: до VDD + 0,3 В |
| Ввод-вывод | 23 линии | 30 GPIO | 22 GPIO (16 у ESP32-C3FH4X) |
| Ток вывода | до 40 мА предельно | 2, 4, 8 или 12 мА по настройке | 40 мА вытекающий, 28 мА втекающий при наибольшей силе |
| АЦП | 10 бит, 6 или 8 каналов, ±2 LSB тип. (VREF = 4 В, 200 кГц), до 15 тыс. отсчётов/с | 12 бит, 4 входа, ENOB 8,7 бита, 500 тыс. отсчётов/с | 12 бит, до 6 каналов, ±10…35 мВ после калибровки в диапазоне до 2500 мВ, 100 тыс. отсчётов/с |
| USB | нет | USB 1.1 хост и устройство | USB Serial/JTAG (COM-порт и отладка) |
| Радио | нет | нет | Wi-Fi 802.11b/g/n, Bluetooth 5 LE |
| Особые блоки | — | 8 автоматов PIO | TWAI (CAN 2.0), шифрование и Secure Boot |
| Ток в работе | 5,2 мА (8 МГц, 5 В) | только график (рис. 172) и демонстрационные программы (табл. 637) | 23 / 28 мА (160 МГц, периферия выкл. / вкл., радио выкл.) |
| Пик тока | — | — | 335 мА (передача 802.11b, 21 дБм) |
| Сон | Power-down при 3 В: 4,2 мкА со сторожевым таймером, 0,1 мкА без него | DORMANT: ядро DVDD 0,18 мА | Deep-sleep с таймером RTC 5 мкА |
| Температура | −40…+85 °C | −40…+85 °C (корпус) | −40…+105 °C |
Ток RP2040 в работе даташит даёт в двух видах: таблицей для демонстрационных программ при 48 МГц и в режиме BOOTSEL (табл. 637) и графиком тока ядра DVDD от частоты для типового чипа, который на обоих ядрах считает БПФ (рис. 172). Одного числа, сравнимого с другими столбцами, там нет, поэтому в таблице — ссылка на эти данные, а значения с графика мы не снимаем. Ток сна RP2040 в таблице — это только ток ядра DVDD; на плате к нему добавляются стабилизатор и флеш-память.
Питание и уровни: 5 или 3,3 В
ATmega328P работает от 1,8 до 5,5 В, и на Arduino Uno и Nano он питается от 5 В. Поэтому 5-вольтовые модули — HC-SR04, реле с транзисторным входом, ЖК-индикаторы на HD44780 — подключаются к нему напрямую. RP2040 и ESP32-C3 питают выводы от 3,3 В, и вход выше питания на 0,3 В для них уже за пределами нормы (табл. 625 и 5-4). Для 5-вольтового сигнала нужен делитель или преобразователь уровней; выход 3,3 В при этом многие 5-вольтовые входы понимают, но это надо проверить по их даташиту.
Плате на ESP32-C3 нужен источник, который отдаёт не меньше 0,5 А (табл. 5-2): при передаче Wi-Fi чип потребляет 335 мА. ATmega328P на 8 МГц и 5 В берёт 5,2 мА, и ему хватит любого стабилизатора.
Память и программа
У ATmega328P 2 КБ ОЗУ: этого хватает для опроса датчиков и управления, но не для сетевого стека или буфера дисплея. RP2040 и ESP32-C3 — 32-разрядные, с сотнями килобайт ОЗУ; на них работают MicroPython, графические библиотеки и TLS. Программа ATmega328P хранится во флеш-памяти в кристалле. RP2040 своей флеш-памяти не имеет вообще: программа исполняется из внешней микросхемы QSPI через кэш, а в ПЗУ зашит загрузчик UF2, который показывает плату компьютеру как флешку. У ESP32-C3 флеш-память либо в корпусе (версии FH4, FH4X, FH8X), либо внешняя.
У ATmega328P есть 1 КБ EEPROM — побайтно перезаписываемая память для настроек. У RP2040 и ESP32-C3 настройки хранят во флеш-памяти, страницами, с учётом износа.
АЦП
Если сравнивать в милливольтах при опорном 3,3 В, три АЦП ближе друг к другу, чем кажется по разрядности. 10-разрядный АЦП ATmega328P с типовой погрешностью ±2 LSB (при опорном 4 В и тактовой 200 кГц, табл. 29-15) даёт около ±6,4 мВ при опорном 3,3 В (наш расчёт: 2 · 3,3 / 1024). ESP32-C3 после калибровки — ±10 мВ в диапазонах до 1300 мВ и ±35 мВ до 2500 мВ (табл. 5-6); выше 2500 мВ калиброванного диапазона нет, тогда как ATmega328P и RP2040 измеряют до опорного напряжения. RP2040 даёт 12 разрядов, но по измерениям Raspberry Pi эффективных — 8,7 бита (табл. 627), а на кодах 512, 1536, 2560 и 3584 у него пики дифференциальной нелинейности (эрратум RP2040-E11, обхода нет). Быстрее всех RP2040 — 500 тыс. отсчётов в секунду; ATmega328P при полном разрешении — до 15 тысяч.
USB и PIO
У RP2040 настоящий контроллер USB 1.1 с режимами хоста и устройства: на нём делают USB-клавиатуры, мыши, MIDI- и аудиоустройства. У ESP32-C3 встроенный USB — контроллер USB Serial/JTAG: через него прошивают, открывают COM-порт и отлаживают, но произвольное USB-устройство на нём не сделать. У ATmega328P USB нет; на Arduino Uno его роль играет отдельный микроконтроллер ATmega16U2.
Второе отличие RP2040 — блоки PIO: восемь маленьких автоматов, которые исполняют свою программу и сами двигают выводы. На них делают протоколы, которых нет в аппаратной периферии: светодиоды WS2812, VGA, дополнительные UART, квадратурные энкодеры.
Радио
Wi-Fi 802.11b/g/n и Bluetooth 5 LE из трёх чипов есть только у ESP32-C3. К ATmega328P и RP2040 радио подключают отдельным модулем — по SPI или UART. Для RP2040 у Raspberry Pi есть плата Pico W с беспроводным модулем. Сравнение радиотехнологий — в статье «Беспроводные технологии для микроконтроллеров».
Сон и батарейка
Сравнивать токи сна нужно при одинаковом способе пробуждения. Чтобы просыпаться по времени, ATmega328P оставляет включённым сторожевой таймер и в режиме Power-down потребляет 4,2 мкА при 3 В (табл. 29-8), ESP32-C3 в Deep-sleep с таймером RTC — 5 мкА (табл. 5-9): почти одинаково. Если устройство будит только внешний сигнал — кнопка, геркон, выход датчика, — ATmega328P без сторожевого таймера потребляет 0,1 мкА. Оба годятся для устройств, которые месяцами работают от батареек. У RP2040 в режиме DORMANT только ядро берёт 0,18 мА (табл. 637) — в 36 раз больше, чем весь ESP32-C3 в Deep-sleep (наш расчёт: 180 / 5). Это не значит, что Pico нельзя питать от батареи, но годы работы от пары элементов AA с ним не получить. Время работы по среднему току — в калькуляторе времени работы от батареи.
Правила выбора
- Нужен Wi-Fi или Bluetooth LE — ESP32-C3.
- Логика и модули на 5 В без преобразователей — ATmega328P.
- USB-устройство (клавиатура, MIDI) или протокол, которого нет в периферии — RP2040 с USB 1.1 и PIO.
- Сон от батарейки, а будит только внешний сигнал (кнопка, геркон, датчик) — ATmega328P: 0,1 мкА в Power-down без сторожевого таймера. С пробуждением по времени ATmega328P (4,2 мкА) и ESP32-C3 (5 мкА) близки.
- Больше 2 КБ ОЗУ и 32-разрядные вычисления — RP2040 или ESP32-C3; с радио — ESP32-C3, с USB-устройством — RP2040.
- Если ни одно условие не выполнено, хватит ATmega328P: для него больше всего примеров, а плату под него выбирают по статье «Arduino Uno, Nano или Pro Mini».
Если задача выросла из любительских плат — нужны CAN, точный АЦП, управление двигателями и 5-вольтовые входы при сотнях килобайт памяти, — посмотрите сравнение «ESP32 или STM32».
Типичные ошибки
- Подключать 5-вольтовый модуль к Pico или ESP32-C3 напрямую. Входы рассчитаны на 3,3 В; превышение больше чем на 0,3 В выходит за нормы даташита.
- Ждать от 12-разрядного АЦП RP2040 точности 12 разрядов. Эффективных — 8,7, и на четырёх кодах есть скачки.
- Делать USB-клавиатуру на ESP32-C3. Его USB — только COM-порт и JTAG.
- Питать ESP32-C3 от слабого стабилизатора. Пик 335 мА при передаче Wi-Fi вызывает просадку и перезагрузку.
- Считать Pico батарейной платой. Даже в DORMANT ядро RP2040 берёт 0,18 мА, а стабилизатор и флеш-память на плате добавляют своё.
Частые вопросы
Что выбрать новичку: Arduino на ATmega328P, Raspberry Pi Pico или ESP32-C3?
Если устройство должно выходить в Wi-Fi или говорить со смартфоном по Bluetooth — плату на ESP32-C3. Если вокруг датчики и модули на 5 В, а программа простая, — Arduino Uno или Nano на ATmega328P. Raspberry Pi Pico выбирают, когда нужны USB-устройство, много ОЗУ или нестандартный протокол на выводах через PIO.
Можно ли подключать к RP2040 и ESP32-C3 модули на 5 В?
Напрямую нельзя. По табл. 625 даташита RP2040 и табл. 5-4 даташита ESP32-C3 напряжение на входе не должно превышать питание выводов больше чем на 0,3 В, то есть примерно 3,6 В. Сигнал 5 В подают через делитель или преобразователь уровней. ATmega328P работает от 5 В и принимает такие сигналы без преобразования.
Какой из трёх чипов лучше для работы от батарейки?
ATmega328P или ESP32-C3. Если устройство просыпается по времени, они близки: ATmega328P в Power-down со сторожевым таймером потребляет 4,2 мкА при 3 В, ESP32-C3 в Deep-sleep с таймером RTC — 5 мкА. Если будит только внешний сигнал, ATmega328P без сторожевого таймера потребляет 0,1 мкА. У RP2040 в самом экономном режиме DORMANT одно только ядро берёт 0,18 мА, то есть в 36 раз больше, чем весь ESP32-C3 в Deep-sleep.
Можно ли сделать на Raspberry Pi Pico USB-клавиатуру, а на ESP32-C3 — нет?
Да. У RP2040 есть контроллер USB 1.1 с режимами хоста и устройства, поэтому на нём делают клавиатуры, мыши, MIDI-устройства. У ESP32-C3 встроенный USB — это контроллер USB Serial/JTAG: виртуальный COM-порт и отладка, а не произвольное USB-устройство. У ATmega328P USB нет вовсе.
У какого чипа АЦП точнее?
В милливольтах — близко, но диапазоны разные. ATmega328P даёт 10 бит с типовой погрешностью ±2 LSB (Microchip указывает её при опорном 4 В и тактовой АЦП 200 кГц), это около ±6,4 мВ при опорном 3,3 В и измерении до самого опорного. ESP32-C3 после калибровки — ±10 мВ до 1300 мВ и ±35 мВ до 2500 мВ, а выше 2500 мВ калиброванного диапазона нет. RP2040 даёт 12 бит, но эффективных разрядов 8,7, и на четырёх кодах у него пики дифференциальной нелинейности.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B, 2020) — с. 1–3 — 8-разрядное ядро AVR, 32 КБ флеш-памяти, 1 КБ EEPROM, 2 КБ SRAM, 23 линии ввода-вывода, питание 1,8–5,5 В, −40…+85 °C, 0–20 МГц при 4,5–5,5 В; разд. 24.1 — АЦП 10 бит, ±2 LSB, до 15 тыс. отсчётов/с при полном разрешении, 6 каналов в SPDIP и 8 в TQFP и VQFN; табл. 29-8 — Active 8 МГц при 5 В 5,2 мА тип., Power-down при 3 В 4,2 мкА тип. со сторожевым таймером и 0,1 мкА тип. без него; табл. 29-15 — абсолютная погрешность 2 LSB тип. при VREF = 4 В, тактовой АЦП 200 кГц; разд. 29.1 — 40 мА на вывод предельно
- Raspberry Pi Ltd. RP2040 Datasheet (build-date 2025-02-20, build-version 3184e62) — разд. 1 — два ядра Cortex-M0+ до 133 МГц (200 МГц при 1,15 В на ядре), 264 КБ SRAM, внешняя флеш-память QSPI до 16 МБ, 30 GPIO, из них 4 — входы АЦП, USB 1.1 хост и устройство, 8 автоматов PIO, 16 каналов ШИМ, загрузчик UF2 в ПЗУ; табл. 624 — корпус −40…+85 °C; табл. 625 — VIH при 3,3 В от 2 В до IOVDD + 0,3 В, выходной ток 2, 4, 8 или 12 мА по настройке; табл. 627 — АЦП 12 бит, ENOB 8,7 бита; табл. 634 — IOVDD 1,62–3,63 В, USB_VDD 3,135–3,63 В; табл. 637 — ток ядра DVDD в DORMANT 0,18 мА, в SLEEP 0,39 мА тип., остальные строки — демонстрационные программы и BOOTSEL; рис. 172 — график тока DVDD от частоты при вычислении БПФ на обоих ядрах; эрратум RP2040-E11 — пики DNL на кодах 512, 1536, 2560 и 3584
- Espressif Systems. ESP32-C3 Series Datasheet, version 2.4 — Features — одно ядро RISC-V до 160 МГц, 400 КБ SRAM, 22 GPIO (16 у ESP32-C3FH4X), Wi-Fi 802.11b/g/n, Bluetooth 5 (LE), USB Serial/JTAG, TWAI, два АЦП 12 бит до 6 каналов, Deep-sleep 5 мкА; табл. 1-1 — флеш-память в корпусе 4 или 8 МБ у части версий, −40…+105 °C; табл. 5-2 — питание 3,0–3,6 В, источник от 0,5 А; табл. 5-4 (3,3 В, 25 °C) — VIH не выше VDD + 0,3 В, IOH 40 мА, IOL 28 мА при наибольшей силе выхода; табл. 5-5 — 100 тыс. отсчётов/с; табл. 5-6 — после калибровки ±10 мВ до 1300 мВ и ±35 мВ до 2500 мВ; табл. 5-7 — пик передачи 802.11b 21 дБм 335 мА; табл. 5-8 — Modem-sleep 160 МГц 23 / 28 мА; табл. 5-9 — Light-sleep 130 мкА, Deep-sleep 5 мкА
Нашли ошибку?
Смотрите также
- ATmega328PРаспиновка, фьюзы, Optiboot, периферия, питание, схема и код на C
- RP2040: выводы и функции GPIO30 GPIO: выводы QFN-56, функции F1–F9, АЦП, QSPI, SWD, питание, токи
- ESP32-C3: выводы и GPIO22 GPIO: функции, свободные и занятые выводы, флеш-память, strapping, USB, JTAG, токи
- PIO RP2040Автоматы PIO: устройство, 9 команд, задержка, side-set, FIFO, частота, пример
- Raspberry Pi Pico40 контактов, функции GPIO, питание, АЦП, BOOTSEL и SWD
- ESP32-C3-DevKitM-130 контактов, 15 GPIO, АЦП, обвязка загрузки, USB, RGB-светодиод на GPIO8
- Arduino и AVRЧто делают init(), millis(), analogWrite(), analogRead() и загрузчик
- Согласование уровнейПрямое соединение, делитель, диоды, MOSFET-транслятор, I²C на BSS138
- Arduino Uno, Nano или Pro MiniРазмер, USB, питание, 3,3 и 5 В, объём скетча, сон: три платы на ATmega328P
- ESP32 или STM32Радио, 5 В, сон, АЦП, память, USB: четыре чипа и правила выбора