Перейти к содержанию

Пины Arduino и выводы микроконтроллера

Выберите плату и вывод — инструмент покажет, какой порт микроконтроллера за ним стоит, номер вывода в корпусе, таймер и частоту ШИМ analogWrite(), номер прерывания attachInterrupt() и тот же код на регистрах AVR. Карта собрана из исходников ядра Arduino и сверена с даташитами Microchip.

Исходные данные

Плата

номер Arduino, порт, функция микросхемы или номер вывода корпуса

Показать

ATmega328P, 16 МГц, загрузчик на 115 200 бит/с. Выводы и функции микросхемы — на странице ATmega328P.

Результат

Arduino Uno, вывод D13
PB5
ATmega328P: SCK, PCINT5
Вывод микросхемы
19 (DIP-28), 17 (TQFP-32)
Прерывание по изменению
PCINT5
Роль в ядре Arduino
SPI SCK, LED_BUILTIN

Выводы Arduino Uno

20 из 20

ArduinoПортDIP-28TQFP-32ШИМПрерываниеФункции
PD0230Serial RX, RXD
PD1331Serial TX, TXD
PD24320 → INT0INT0
PD351OC2B, 490,2 Гц1 → INT1OC2B, INT1
PD462XCK, T0
PD5119OC0B, 976,6 ГцOC0B, T1
PD61210OC0A, 976,6 ГцOC0A, AIN0
PD71311AIN1
PB01412CLKO, ICP1
PB11513OC1A, 490,2 ГцOC1A
PB21614OC1B, 490,2 ГцSPI SS, SS, OC1B
PB31715OC2A, 490,2 ГцSPI MOSI, OC2A, MOSI
PB41816SPI MISO, MISO
PB51917SPI SCK, LED_BUILTIN, SCK
(14)PC02323ADC0
(15)PC12424ADC1
(16)PC22525ADC2
(17)PC32626ADC3
(18)PC42727I2C SDA, ADC4, SDA
(19)PC52828I2C SCL, ADC5, SCL

D13: функции Arduino и регистры

/* Arduino */
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
int level = digitalRead(13);

/* Registers: PB5 */
DDRB |= (1 << 5); /* output */
PORTB |= (1 << 5); /* high */
uint8_t high = (PINB >> 5) & 1;

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

Номера выводов Arduino — это не номера ножек микроконтроллера. Пин 13 Arduino Uno — это линия PB5 микросхемы ATmega328P, пин A4 — линия PC4, а у Arduino Mega даже номера прерываний не совпадают с номерами прерываний микроконтроллера. Инструмент сводит обе нумерации: каждому пину — порт, вывод корпуса, функции, таймер ШИМ, прерывание и код на регистрах.

Коротко

  • Uno и Nano: D0–D7 — PD0–PD7, D8–D13 — PB0–PB5, A0–A5 (D14–D19) — PC0–PC5 микроконтроллера ATmega328P.
  • ШИМ: у Uno и Nano — пины 3, 5, 6, 9, 10, 11; на 5 и 6 частота 976,6 Гц, на остальных 490,2 Гц.
  • Прерывания: у Uno и Nano — пины 2 и 3 (INT0, INT1), у Mega — 2, 3, 18–21 с другой нумерацией attachInterrupt().
  • Nano: A6 и A7 — только аналоговые входы.
  • Mega 2560: SPI на 50–53, I²C на 20 и 21, A8–A15 — порт K.

Как пользоваться

  1. Выберите плату: Arduino Uno, Nano или Mega 2560.
  2. Найдите вывод по номеру Arduino (13, A4), по порту (PB5), по функции микросхемы (OC1A, SDA, PCINT5) или по номеру вывода корпуса. Фильтр над таблицей оставляет только выводы с ШИМ, АЦП, прерываниями или интерфейсами.
  3. Нажмите на вывод в таблице. Справа — всё о нём, под таблицей — код: вызовы Arduino и то же самое на регистрах.

Номера выводов корпуса даны для микросхем ATmega328P в корпусах DIP-28 и TQFP-32 и ATmega2560 в корпусе TQFP-100 по данным Microchip. Плата и выбранный вывод хранятся в адресе страницы — ссылкой можно поделиться.

Откуда берётся карта выводов

Ядро Arduino хранит соответствие в файле pins_arduino.h своего варианта платы: массивы номер → порт, номер → бит и номер → таймер. У Uno и Nano вариант один и тот же (у Nano добавлены два аналоговых входа), у Mega — свой на 70 цифровых выводов. Функции порта, которые ядро не использует (выходы второго канала таймера, PCINT, вход компаратора), и номера выводов корпусов взяты из атласа микроконтроллеров — из описаний Microchip, сверенных с даташитами. Тесты проверяют, что источники согласны: у каждого пина с ШИМ микросхема выводит нужный выход сравнения OCnx, у каждого пина с прерыванием — нужный вход INTn.

Частота ШИМ

Функция analogWrite() не настраивает таймер, а только подключает выход сравнения и записывает скважность в регистр OCRnx. Таймеры настраивает init() при запуске скетча: делитель 64 у всех, Timer0 — в режиме Fast PWM, остальные — Phase Correct PWM с 8-битным счётом. Частоты по формулам даташита ATmega328P:

fFast PWM=fclkN⋅256=16 МГц64⋅256=976,6 Гц,fPhase Correct=fclkN⋅510=490,2 Гц.f_\text{Fast PWM} = \frac{f_\text{clk}}{N \cdot 256} = \frac{16\ \text{МГц}}{64 \cdot 256} = 976{,}6\ \text{Гц}, \qquad f_\text{Phase Correct} = \frac{f_\text{clk}}{N \cdot 510} = 490{,}2\ \text{Гц}.

Timer0 заодно отсчитывает millis() и delay(): прерывание по его переполнению приходит каждые 64 · 256 тактов, при 16 МГц — каждые 1024 мкс. Если поменять его делитель ради другой частоты ШИМ, собьются все задержки скетча. Другой таймер можно перенастроить свободно, только пропадёт ШИМ analogWrite() на его выводах. Делители и период под нужную частоту считает калькулятор таймера.

Прерывания

attachInterrupt() принимает номер прерывания ядра, а не номер пина и не номер INTn. У Uno и Nano всё совпадает: пин 2 — прерывание 0 — INT0, пин 3 — 1 — INT1. У Mega 2560 номера ядра сохранены для совместимости с Uno, а за ними стоят другие входы:

Пин MegaattachInterruptВход ATmega2560Порт
20INT4PE4
31INT5PE5
212INT0PD0
203INT1PD1
194INT2PD2
185INT3PD3

Поэтому номер всегда получают через digitalPinToInterrupt(pin). Кроме того, у многих выводов есть прерывание по изменению уровня PCINT: у Uno и Nano — у всех линий портов B, C и D, у Mega — у порта B, части порта J, порта K и линии PE0. Ядро его не использует, но оно доступно через регистры PCICR и PCMSKn; номер PCINT инструмент показывает для каждого пина.

Arduino Mega 2560

У Mega четыре аппаратных UART: Serial на пинах 0 и 1, Serial1 — на 19 и 18, Serial2 — на 17 и 16, Serial3 — на 15 и 14. SPI выведен на пины 50–53, а не на 10–13, как у Uno, а I²C — на 20 и 21, а не на A4 и A5. Шилд для Uno, который берёт SPI с пинов 11–13, на Mega без перемычек к пинам 50–52 работать не будет. Аналоговые входы A0–A7 — порт F, A8–A15 — порт K; для каналов 8–15 analogRead() ставит бит MUX5 в регистре ADCSRB.

Ограничения

  • Только платы на ATmega328P и ATmega2560 с ядром Arduino AVR: Uno, Nano (ATmega328P) и Mega 2560. Leonardo, Micro, Nano Every и Uno R4 построены на других микроконтроллерах и устроены иначе.
  • Расположение разъёмов на плате, питание и схема платы здесь не показаны — для этого будут страницы плат.
  • Клоны повторяют карту выводов, если используют тот же микроконтроллер и вариант ядра. Отличаться может загрузчик: для Nano в ядре есть вариант «ATmega328P (Old Bootloader)» со скоростью загрузки 57 600 бит/с вместо 115 200.

Частые вопросы

Какому выводу микроконтроллера соответствует пин 13 Arduino Uno?

Пин 13 — это линия PB5 микроконтроллера ATmega328P: вывод 19 в корпусе DIP-28 и 17 в корпусе TQFP-32. Ядро Arduino назначает его встроенному светодиоду (LED_BUILTIN), а у микроконтроллера это ещё и линия SCK интерфейса SPI. На регистрах вывод переключают битом 5 регистров DDRB, PORTB и PINB.

Какие пины Arduino Uno поддерживают ШИМ?

Шесть: 3, 5, 6, 9, 10 и 11. За ними стоят выходы сравнения таймеров OC2B, OC0B, OC0A, OC1A, OC1B и OC2A. После init() ядра все таймеры работают с делителем 64, поэтому при 16 МГц на выводах 5 и 6 (Timer0, режим Fast PWM) частота ШИМ — 976,6 Гц, а на остальных (режим Phase Correct PWM) — 490,2 Гц.

Почему на выводах 5 и 6 частота ШИМ выше?

Их обслуживает Timer0, который ядро Arduino запускает в режиме Fast PWM: период — 256 тактов таймера, частота 16 МГц / (64 · 256) = 976,6 Гц. Timer1 и Timer2 работают в режиме Phase Correct PWM, где счётчик идёт вверх и вниз, период — 510 тактов и частота 490,2 Гц. Timer0 же отсчитывает millis() и delay() по своему переполнению, поэтому его делитель лучше не менять.

Какие пины Arduino Mega поддерживают внешние прерывания?

Шесть: 2, 3, 18, 19, 20 и 21. Номера attachInterrupt() у них не совпадают с номерами прерываний микроконтроллера: пин 2 — прерывание 0 и INT4, пин 3 — 1 и INT5, пин 21 — 2 и INT0, пин 20 — 3 и INT1, пин 19 — 4 и INT2, пин 18 — 5 и INT3. Чтобы не ошибиться, номер берут через digitalPinToInterrupt(pin).

Можно ли использовать A6 и A7 на Arduino Nano как цифровые выводы?

Нет. У ATmega328P в корпусе TQFP-32 это отдельные входы ADC6 и ADC7 без линии порта, поэтому pinMode(), digitalWrite() и digitalRead() с ними не работают — только analogRead(). В ядре Arduino для Nano им даны номера 20 и 21, но в таблице портов этих номеров нет.

Чем digitalWrite() отличается от записи в регистр PORT?

digitalWrite() по номеру пина находит в таблицах порт и бит, выключает ШИМ, если пин подключён к таймеру, и меняет бит при запрещённых прерываниях. Запись PORTB |= (1 << 5) делает только последнее. Поэтому регистры удобны, когда нужно быстро переключать вывод, а digitalWrite() — когда важна переносимость между платами.

Источники

  1. Arduino. ArduinoCore-avr, коммит 11b9130 (github.com/arduino/ArduinoCore-avr) — variants/standard, eightanaloginputs и mega/pins_arduino.h — порт и бит каждого номера Arduino, таймеры ШИМ, аналоговые входы, выводы SPI, I2C и светодиода, digitalPinToInterrupt; cores/arduino/WInterrupts.c — какое прерывание INTn стоит за номером attachInterrupt; wiring.c — режимы и делители таймеров после init(), millis() от Timer0; wiring_analog.c и wiring_digital.c — что делают analogRead(), analogWrite() и digitalWrite(); boards.txt — микроконтроллер, частота и скорость загрузчика. Файлы распространяются по LGPL-2.1, на сайте — только факты о выводах
  2. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B — функции выводов и их номера в корпусах; 15.7.3 и 15.7.4 — частота Fast PWM fclk/(N·256) и Phase Correct PWM fclk/(N·510)
  3. Atmel. ATmega640/1280/1281/2560/2561 datasheet, 2549Q–AVR–02/2014 — функции выводов ATmega2560 и их номера в корпусе TQFP100
  4. Microchip. ATmega Series Device Support (ATmega_DFP) 3.6.299 — описания устройств atdf: выводы и сигналы ATmega328P и ATmega2560, по которым построены страницы атласа; лицензия Apache-2.0
Встроить калькулятор на свой сайт

Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах

<iframe src="https://gaw.ru/embed/arduino-pins/" title="Пины Arduino и выводы микроконтроллера" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/arduino-pins/">Пины Arduino и выводы микроконтроллера</a> — GAW.ru</p>
Автоподстройка высоты рамки

Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.

<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>

Обновлено .

Нашли ошибку в расчёте?