Перейти к содержимому

МК + USB: схема

Время: ~120 мин

Цели урока

  • построить иерархическую схему из двух листов с портами между ними
  • рассчитать нагрузочные конденсаторы кварца по CL из даташита
  • понять, как работает автосброс через DTR, и посчитать длительность импульса
  • подключить питание, развязку и ISP по рекомендациям AVR042

Компоненты выбраны. Теперь собираем их в схему и считаем три вещи, которые нельзя взять «как у всех» без понимания: конденсаторы кварца, цепь автосброса и развязку.

Шаг 1. Структура проекта: два листа и верхний лист

Заголовок раздела «Шаг 1. Структура проекта: два листа и верхний лист»

Создай проект UnoMini.PrjPcb с тремя листами:

  • Top.SchDoc — верхний лист: только символы листов и связи между ними;
  • USB_Power.SchDoc — разъём, предохранитель, защита, CH340C;
  • MCU.SchDoc — микроконтроллер и всё вокруг него.
U_USBUSB_Power.SchDocU_MCUMCU.SchDocUART_TXUART_TXUART_RXUART_RXDTRDTR+5V, GND — глобальные порты питания
Рис. 11.8. Верхний лист проекта: два символа листов (Sheet Symbol), за каждым — свой лист схемы. Между листами идут только три сигнала UART и сброса. Питание +5V и GND — глобальные порты питания, их не тянут через символы. Стрелки на портах показывают направление сигнала.

На верхнем листе: PlaceSheet Symbol, затем в панели Properties символа добавь входы-выходы листа (Sheet Entries) кнопкой Add. Если сначала нарисован символ, лист можно создать из него: правый клик по символу → Sheet Symbol Actions » Create Sheet From Sheet Symbol. На самих листах сигналы выводятся портами: PlacePort. Имя порта должно совпадать с именем входа-выхода на символе.

Как Altium связывает цепи между листами, задаёт параметр Net Identifier Scope в ProjectProject Options, вкладка Options. Для иерархии из листа-родителя и листов-детей подходит Automatic или Hierarchical (урок 9.8).

XS1USB-CA4,B4,A9,B9VBUSA6,B6D+A7,B7D−A5CC1B5CC2A1,B1,A12,B12GNDDA1USBLC6-2SC61IO13IO26IO14IO25VBUS2GNDDD1CH340C5UD+6UD−4V316VCC1GND2TXD3RXD13DTR#7NCF1PTC 0,5 А+5VD+D−R15,1 кОмR25,1 кОмC2100 нФC1100 нФ→ UART_TX← UART_RX→ DTRне подключать
Рис. 11.6. Лист «USB и питание». Каждый вывод CC подтянут к земле своим резистором 5,1 кОм — так источник питания понимает, что подключён потребитель, и подаёт 5 В. D+ и D− проходят сквозь USBLC6-2SC6 (выводы 1↔6 и 3↔4), её ставят вплотную к разъёму. CH340C работает от 5 В: VCC — на +5V с конденсатором 100 нФ, V3 — на отдельный конденсатор 100 нФ. Кварц CH340C не нужен: генератор встроенный.

Что важно на этом листе:

  1. Дублированные контакты USB-C соединяй на схеме: A6 с B6 (D+), A7 с B7 (D−), все четыре VBUS вместе, все четыре GND вместе. Контакты SBU (A8, B8) для USB 2.0 не используются.
  2. CC1 и CC2 — по своему резистору 5,1 кОм на землю.
  3. USBLC6-2SC6 включается «насквозь»: линия D+ заходит на вывод 1 и выходит с вывода 6 (оба — IO1), D− — на 3 и 4 (IO2). Вывод 5 — к VBUS (после или до предохранителя — смотри рекомендации даташита и не забудь, что так защита работает и для шины питания), вывод 2 — на землю.
  4. CH340C в режиме 5 В: VCC (16) на +5V с конденсатором 100 нФ, V3 (4) — на отдельный конденсатор 100 нФ к земле. NC (7) не подключать.
  5. Дифференциальная пара. Назови цепи по шаблону, например USB_D_P и USB_D_N, объяви суффиксы _P/_N в настройках проекта (вкладка Options) и поставь на цепи директиву дифференциальной пары: PlaceDirectivesDifferential Pair[ПРОВЕРИТЬ]. Тогда пара сама попадёт на плату как пара (урок 9.5).
DD2ATmega328P-AU29PC6/RESET7PB6/XTAL18PB7/XTAL220AREF4VCC6VCC18AVCC3GND5GND21GND30PD0/RXD31PD1/TXD15PB3/MOSI16PB4/MISO17PB5/SCK…портыXP3ISP 2×31MISO3SCK5RST2VCC4MOSI6GND+5VC5C6C7C8C5–C7: 100 нФ у выв. 4, 6, 18 · C8: 10 мкФR310 кОмVD1SB1DTR →C4100 нФZQ116 МГцC922 пФ*C1022 пФ*C11100 нФ← UART_TX→ UART_RXMOSIR41 кОмHL2XP3: RST → RESET,VCC → +5V, GND → ⏚
Рис. 11.7. Лист «Микроконтроллер». У каждого вывода питания (4, 6 и 18 AVCC) свой конденсатор 100 нФ, плюс общий 10 мкФ. RESET подтянут к +5V резистором 10 кОм: не меньше 10 кОм, чтобы работал debugWIRE (AVR042). Диод VD1 срезает выброс выше VCC при автосбросе через C4 от линии DTR. Кварц 16 МГц нагружен двумя конденсаторами, каждый на свой вывод (*номинал считается в уроке 11.2.2). Разъём ISP 2×3 — стандартная распиновка Atmel. Выводы портов вынесены на гребёнки и здесь не показаны.

AVR042 требует, чтобы каждая пара выводов питания имела свой конденсатор. У ATmega328P-AU три вывода питания: VCC 4 и 6, AVCC 18. Значит три конденсатора по 100 нФ (C5–C7), каждый у своего вывода, плюс общий 10 мкФ (C8) на шине питания. AREF (20) — через 100 нФ на землю: так опорное напряжение АЦП меньше шумит.

Кварц рассчитан на определённую нагрузочную ёмкость CL — ёмкость, которую «видит» резонатор. Она указана в даташите кварца, например 12, 18 или 20 пФ. Два конденсатора C9 и C10 соединены через землю последовательно, и к ним добавляется паразитная ёмкость Cпар — выводов микросхемы и дорожек:

CL = C9·C10 / (C9 + C10) + Cпар

При C9 = C10 = C получается C = 2·(CL − Cпар). Паразитную ёмкость обычно оценивают в несколько пикофарад (руководства по генераторам, например ST AN2867).

CL кварца Cпар (оценка) C9 = C10 Стандартный номинал
18 пФ 5 пФ 2·(18 − 5) = 26 пФ 27 пФ
20 пФ 5 пФ 30 пФ 30 или 33 пФ
12 пФ 4 пФ 16 пФ 15 или 18 пФ

AVR042 для обычных кварцев от 400 кГц называет диапазон 22–33 пФ. В платах Arduino стоят 22 пФ. Наш расчёт даёт то же по порядку величины, но точный номинал — по CL твоего кварца. Диэлектрик — только C0G (NP0): у него ёмкость почти не меняется от температуры и напряжения (урок 2.2).

Цепь сброса (AVR042):

  • R3 = 10 кОм подтягивает RESET к +5V. Не меньше 10 кОм, иначе не будет работать отладка через debugWIRE.
  • VD1 — диод от RESET к VCC. Внутренней защиты на этом выводе у ATmega328P нет, и диод ограничивает выбросы выше питания.
  • SB1 — кнопка сброса на землю.
  • Конденсатор от RESET на землю не ставим: AVR042 запрещает его при использовании debugWIRE.

Автосброс. Чтобы Arduino IDE могла загрузить прошивку без нажатия кнопки, линия DTR# преобразователя подключена к RESET через C4 = 100 нФ. Когда программа загрузки открывает порт, DTR# падает с 5 В до 0, и этот скачок через конденсатор тянет RESET вниз. Потом C4 заряжается через R3, и RESET возвращается к +5V. Длительность импульса — порядка постоянной времени:

τ = R3 · C4 = 10 кОм · 100 нФ = 1 мс —

этого достаточно для сброса, и загрузчик успевает поймать начало передачи прошивки. Когда DTR# возвращается в 5 В, через C4 на RESET приходит положительный выброс выше VCC — его и срезает VD1.

  • TXD CH340C (2) → RXD микроконтроллера (30), RXD CH340C (3) ← TXD микроконтроллера (31). Линии перекрещиваются. Часто между ними ставят последовательные резисторы около 1 кОм: они ограничивают ток, если оба выхода окажутся включены навстречу (например, когда к выводам D0/D1 что-то подключено снаружи).
  • ISP 2×3 — стандартная распиновка Atmel: 1 — MISO, 2 — VCC, 3 — SCK, 4 — MOSI, 5 — RESET, 6 — GND. Ошибка в ней — классика, сверь с документацией программатора.
  • HL2 на PB5 (D13) через 1 кОм. PB5 — это ещё и SCK: во время прошивки по ISP светодиод мигает, и это нормально.

AVCC (18) подключён к +5V и развязан своим конденсатором. Если в проекте важна точность АЦП, даташит советует питать AVCC через фильтр нижних частот (например, дроссель или резистор с конденсатором). Для учебной платы достаточно отдельного конденсатора рядом с выводом.

Скомпилируй проект (ProjectValidate PCB Project[ПРОВЕРИТЬ]) и разбери все сообщения в панели Messages. Потом пройди чек-лист.

Чек-лист ревью схемы 11.2:

  • Выводы ATmega328P совпадают с таблицей TQFP-32: VCC 4, 6; GND 3, 5, 21; AVCC 18; AREF 20; XTAL 7, 8; RESET 29; RXD 30; TXD 31.
  • AVCC подключён к питанию.
  • TXD ↔ RXD перекрещены.
  • У CH340C: V3 — на конденсатор (режим 5 В), NC свободен.
  • Оба CC — по своему резистору 5,1 кОм.
  • D+/D− через USBLC6 и имеют директиву дифференциальной пары.
  • C9, C10 — C0G, номинал по CL кварца.
  • R3 ≥ 10 кОм, конденсатора RESET → GND нет.
  • Распиновка ISP по стандарту.
  • Порты листов и входы-выходы символов называются одинаково, Validate без ошибок.

🧯 Типичные ошибки

Компьютер видит плату, но прошивка не загружается: avrdude не может синхронизироваться

Почему Автосброс не работает (нет C4, или DTR перепутан с RTS), либо TXD и RXD соединены не накрест.

Как исправить Проверь цепь DTR# → C4 → RESET и перекрёст UART. Временно можно нажимать кнопку сброса в момент начала загрузки.

Кварц не запускается или частота заметно «уехала»

Почему Номинал нагрузочных конденсаторов взят наугад, или стоит диэлектрик X7R/Y5V.

Как исправить Считай C = 2·(CL − Cпар) по даташиту кварца и ставь C0G.

Цепи между листами не соединились

Почему Имя порта на листе не совпадает с именем входа-выхода на символе листа, или неподходящая область видимости имён (Net Identifier Scope).

Как исправить Проверь имена буква в букву и параметр Net Identifier Scope в настройках проекта.

Проверь себя

  1. 1. CL кварца 18 пФ, паразитная ёмкость около 5 пФ. Какие нагрузочные конденсаторы ставить?
  2. 2. Какова примерная длительность импульса автосброса при R3 = 10 кОм и C4 = 100 нФ?
  3. 3. Зачем диод VD1 от RESET к VCC?
  4. 4. Почему подтягивающий резистор RESET не меньше 10 кОм?
  5. 5. Что делать с выводом V3 CH340C при питании 5 В?

Практическое задание~120 мин

  1. Нарисуй иерархический проект из трёх листов по рис. 11.6–11.8.
  2. Посчитай C9 и C10 для выбранного тобой кварца и впиши расчёт в комментарий на схеме (Place » Text Frame или примечание).
  3. Выведи все свободные порты ATmega328P на гребёнки XP1 и XP2 так же, как на Arduino Nano: D0–D13, A0–A7, питание.
  4. Пройди чек-лист ревью и добейся компиляции без ошибок.