воскресенье, 3 февраля 2019 г.

Обвязка ATmega328P

Типовая схема включения любого микроконтроллера содержит ряд компонентов и цепей, обеспечивающих его нормальное функционирование. Совокупность этих компонентов называется обвязкой микроконтроллера. Данная публикация посвящена функциям обвязки и ее особенностям в случае использования AVR микроконтроллера ATmega328P.

Распиновка ATmega328P

Прежде чем приступить к рассмотрению обвязки ATmega328P считаю нужным привести описание его выводов. Когда мы работаем с платами Ардуино, то не задумываемся о соответствии физических выводов микроконтроллера используемым в IDE Arduino обозначениям. Когда же речь идет об отдельном микроконтроллере, то под рукой всегда нужно иметь его распиновку. Поэтому советую сохранить ее:

ATmega328P pinout

Есть еще один интересный прием - это распечатать номера выводов и наклеить получившуюся шпаргалку на микроконтроллер, как показано на следующем фото. Мелковато, но вполне читабельно. PDF файл для печати можно скачать по этой ссылке.

ATmega328P наклейка с обозначениями выводов

Подключение питания

Напряжение питания подается на выводы микроконтроллера VCC и GND и не должно превышать значение, указанное в технической документации. Для ATmega328P верхняя граница рекомендуемого напряжения питания составляет 5,5В, абсолютный максимум - 6В, продолжительная работа при таком напряжении может вывести микроконтроллер из строя.

Для подавления высокочастотных помех в цепи питания рекомендуется устанавливать керамический конденсатор емкостью 0.1мкФ между VCC и GND. Причем располагаться он должен как можно ближе к питающим выводам микроконтроллера для минимизации паразитной индуктивности и сопротивления подводящих проводников.

ATmega328P имеет двойное питание: выводы VCC и GND (выводы 7 и 8) используются для питания цифровых схем микроконтроллера; AVCC и GND (выводы 20 и 22) - для питания аналого-цифрового преобразователя. Даже если вы не собираетесь использовать АЦП, к нему должно быть подведено питание: соедините выводы VCC с AVCC, а цифровую землю с аналоговой. Если же вы планируете использовать АЦП, то в цепь питания следует добавить фильтр для уменьшения помех. Так в даташите рекомендуется соединить AVCC c VCC через индуктивность 10мкГн и с GND через емкость 0.1мкФ. Однако данная рекомендация не выполняется даже в платах Ардуино и вывод AVCC на них просто соединен с VCC.

Подключение питания к ATmega328P
Рекомендуемая схема подключения питания ATmega328P
при использовании встроенного АЦП

Вывод Reset и кнопка сброса

Вывод Reset используется для генерации сигнала сброса микроконтроллера. Во время сброса все регистры ввода-вывода принимают свои начальные значения и выполняется команда, расположенная в векторе сброса (по нулевому адресу). Как правило, это переход на адрес начала программы. Но, если пользовательская программа не использует прерывания, то она может располагаться сразу с нулевого адреса.

Схема начального сброса

Обвязка для предыдущих моделей микроконтроллеров обязательно включала в себя схему начального сброса, состоящую из резистора и конденсатора, которая обеспечивала постепенное нарастание сигнала на входе Reset при включении питания. Таким образом осуществлялся начальный сброс микроконтроллера. Сейчас же схема начального сброса (Power-on-Reset) присутствует, пожалуй, в каждом современном микроконтроллере. Внешняя цепь может потребоваться при наличии особых требований к длительности импульса сброса (в случае медленного нарастания напряжения питания).

Схема начального сброса Power-On Reset
Схема начального сброса микроконтроллера

Номиналы резистора и конденсатора могут отличаться от приведенных на схеме значений и зависят от требуемой длительности импульса сброса.

Обвязка Reset и защита от непреднамеренного сброса

Еще один момент, требующий внимания - это стабилизация сигнала высокого уровня на входе Reset с целью предотвращения непреднамеренного сброса микроконтроллера. В публикации о подтягивающих резисторах я уже рассказывал о проблемах, возникающих, когда цифровой вход не подсоединен ни к питанию, ни к земле: электромагнитные наводки становятся причиной изменения уровня сигнала на этом входе. При его опросе микроконтроллер будет случайным образом фиксировать то высокий, то низкий уровень сигнала. В случае со входом Reset это приведет к непреднамеренному сбросу. Данная проблема решается добавлением в схему подтягивающего резистора, который гарантирует сигнал нужного уровня на входе Reset (в случае с AVR - высокого уровня).

Востребованность подтягивающих резисторов как для входа Reset, так и для обычных линий ввода-вывода, привела к добавлению их в микроконтроллеры. В ATmega328P имеется собственный подтягивающий резистор на входе Reset номиналом 30-60кОм (конкретное значение из указанного диапазона устанавливается на заводе-изготовителе при калибровке). И тут часто возникает вопрос: нужен ли внешний подтягивающий резистор на входе Reset или можно обойтись внутренним. Всё зависит от конкретной ситуации и условий, в которых будет работать микроконтроллер: для любительских, "бытовых" проектов, возможно, будет достаточно встроенного резистора; для устройств, предназначенных для работы в промышленности, в неблагоприятных условиях номинал встроенного резистора может оказаться недостаточен. Это, что называется, слабая подтяжка, в таких случаях цифровой вход подтягивают внешним резистором номиналом в несколько кОм.

Зачастую одного только подтягивающего резистора оказывается недостаточно и для дополнительной защиты от шума в схему добавляется конденсатор. Вход Reset AVR микроконтроллеров имеет собственный фильтр нижних частот. Внешний конденсатор, установленный между выводом Reset и землей, является дополнительной защитой. Однако, его нельзя добавлять в схему, если предполагается внутрисхемное программирование с помощью PDI или DebugWIRE.

В отличие от выводов общего назначения, имеющих защитные диоды и к земле, и к питанию, для входа Reset предусмотрен единственный диод - на землю. Это объясняется тем, что Reset используется для высоковольтного программирования, когда на него подается сигнал 12В. Поэтому если микроконтроллер должен работать в условиях помех от электростатических разрядов (в англоязычной технической документации используется термин ESD - Electrostatic Discharge) и если не планируется использовать высоковольтный программатор, рекомендуется добавить в схему внешний диод между выводом Reset и линией питания.

С учетом всего сказанного рекомендуемая схема обвязки вывода Reset выглядит следующим образом:

Обвязка вывода Reset для защиты от помех


Ну и в конце концов можно обойтись совсем без внешних компонентов, если просто соединить Reset с линией питания. Правда в этом случае вы уже не сможете добавить кнопку сброса и потеряете возможность внутрисхемного программирования.

Кнопка сброса

Если для защиты от случайного сброса микроконтроллера вход Reset подтягивается к питанию (встроенным резистором или внешним для более сильной подтяжки), то для сброса при нажатии на кнопку он должен замыкаться на землю. Нет ничего проще - добавляем кнопку между входом Reset и землей. Если обвязка вывода Reset содержит конденсатор как в вышеприведенной схеме, то для предотвращения его закорачивания через кнопку (что может привести к возникновению помех) разработчики из Microchip рекомендуют добавлять в схему резистор порядка 330Ом:

Подключение кнопки сброса к микроконтроллеру




Подключение резонатора

Кварцевый или керамический резонатор обеспечивают работу встроенного тактового генератора. Резонатор подключается к выводам XTAL1, XTAL2 микроконтроллера. Для его стабильной работы в схему добавляются керамические конденсаторы, номинал которых подбирается в соответствии с рекомендациями производителя резонатора или микроконтроллера. Так в даташите на ATmega328P для резонаторов на 400кГц и выше рекомендуется использовать конденсаторы номиналом 12..22пФ:

Подключение резонатора к микроконтроллеру

При использовании резонатора на 32.768кГц можно задействовать внутренние конденсаторы, подключив их к XTAL1 и XTAL2 установкой фьюзов CKSEL.

При тактировании от внутреннего RC-генератора необходимость во внешнем резонаторе и согласующих конденсаторах отпадает.

Заключение

Итак, большинство компонентов, составляющих типовую обвязку, уже присутствуют в современных микроконтроллерах. Однако, их может оказаться недостаточно для стабильной работы в жестких условиях, в этом случае требуется принятие дополнительных мер. И здесь сложно предусмотреть все возможные ситуации и гарантировать успешную работу того или иного решения. Поэтому лучшая рекомендация - это всегда проверять работу схемы в реальных условиях.

Интересный документ по теме - рекомендации Microchip, которые необходимо соблюдать при проектировании оборудования с использованием микроконтроллеров AVR, ссылка: AN2519 AVR Microcontroller Hardware Design Considerations 

13 комментариев:

  1. Привет!!! Подскажите такой вопрос. Если у меня задействованы выводы 10-13 для своих нужд и мне в будущем понадобится прошить контроллер по SPI не извлекая из платы. Нужно ли снимать с этих пинов обвязку ?? или он прошьется с ней. также косается I2C, RX TX выводов.

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Если устройства на другом конце SPI выводов не будут ими управлять, то проблем с прошивкой по SPI быть не должно. В документе AN2519 AVR Microcontroller Hardware Design Considerations, ссылку на который я дал в конце статьи, рекомендуется в таких случаях подсоединять выводы SPI к другим устройствам через сопротивления 300 Ом (смотрите пункт 4.1.1 Shared Use of SPI Programming Lines).
      Насчет I2C и RX, TX не совсем понятно. Как вы собираетесь их использовать?

      Удалить
    2. Этот комментарий был удален автором.

      Удалить
    3. Я так понял если выводы SPI как OUTPUT то можно прошивать, а если как INPUT то нужно разделить от обвязки резистором или DIP переключателем.
      RX TX если прошивать через USB-UART CH340G.

      Удалить
    4. Нет. Режимы INPUT и OUTPUT, которые вы задали пинам 10-13, актуальны до тех пор, пока вы используете их как простые линии ввода-вывода. И они (режимы) никак не влияют на прошивку микроконтроллера: при входе в режим программирования по последовательному интерфейсу MOSI и SCK автоматически настраиваются на ввод, MISO - на вывод. Помешать программатору могут другие устройства, разделяющие с ним эти выводы, если они будут передавать свои данные в этот момент. В этом случае и нужны резисторы.

      Удалить
    5. Ясно спасибо. значит с RX TX также нужно разделять

      Удалить
    6. С RX, TX смысл тот же: если одновременно с USB-UART CH340G свои данные будет передавать другое UART устройство, то микроконтроллер примет мусор. Ну а обвязка - вряд ли вы обвяжете эти выводы для своих нужд так, что это повлияет на работу модуля USART.
      И да, в крайнем случае всегда можно использовать джамперы/DIP переключатели.

      Удалить
  2. Добрый день, Владимир.
    Впервые тут пишу и не нашёл другого способа как связаться с Вами.
    Ознакомился с вашей темой "Arduino as ISP - программатор из Ардуино". Очень интересно!
    Если у Вас будет возможность: не могли бы Вы создать отдельную тему и рассказать как сделать программатор на базе Arduino DUE? Интересует заливка дампа в память 25-й серии: N25S16. Она как раз на 3.3v В интернете есть пару попыток объяснить что к чему в случае с DUE, но, как правило, дальше разъяснений дело не идёт: никто ничего не пишет. То есть - результатов никаких. А мне очень бы пригодились такие знания.
    Единственное что я понял из всего прочитанного, что AVR-программатор из UNO мне не подойдёт по уровню (5v), а скетчи для AVR не подойдут для ARM.
    Заранее благодарен!

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Статья из этого не получится. Есть некоторые нюансы для разных плат, они упоминаются в скетче ArduinoISP, но в целом не принципиально UNO у вас или DUE.
      Конкретно для DUE в качестве программатора, если не ошибаюсь, нужно использовать Native USB Port, т.к. на нем отсутствует авторесет. Проверить на практике пока не могу. Так что попробуйте, отпишитесь о результатах.

      Удалить
  3. Приветствую.

    Вопросик.
    A328P, 32pin.

    Для прошивки используются выводы 16 и 17.

    Возможно ли эти каналы, после прошивки, использовать как цифровые входы ?
    И возможно ли потом, отключив эти выводы от сигнальных линий, снова прошить МК и снова эти выводы использовать как входные каналы ?

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Можно использовать джамперы или dip переключатели, чтобы при программировании отсоединять другие устройства

      Удалить
  4. А почему вход RESET инверсный? Никак не могу найти информацию об этом, не подскажете, зачем так сделано?

    ОтветитьУдалить
    Ответы
    1. Для современных МК (выполненных по КМОП технологии) нет особых причин использовать тот или иной уровень для сигнала сброса. Это не принципиально.
      Думаю, производители просто придерживаются этого негласного правила - используют низкий уровень в качестве активного для сигнала сброса.

      Удалить