Среди людей, увлекающихся электроникой, одним из самых популярных этюдов является изготовление гусеничного робота. Этой теме посвящена масса статей, в том числе и на Хабре. Обилие руководств, схем и статей привело меня к мысли, что это будет не так уж трудно, и мне тоже захотелось самому изготовить такую прекрасную самоделку. Можно сказать, что мне не повезло — в процессе работы я столкнулся с массой проблем, связанных с наличием двигателей. В конце концов все эти проблемы мне удалось решить, но это заняло очень много времени. В данной статье я предлагаю несколько советов по проектированию схем, содержащих двигатели, на базе микроконтроллеров AVR. В практической полезности всех этих советов мне пришлось убедиться на собственном опыте. Многие советы, как мне кажется, подойдут и для других микроконтроллеров.
Скажу сразу, что когда я приступил к этому проекту, мой опыт в электронике был минимален. Arduino к тому моменту у меня была уже довольно давно, так что я купил гусеницы и двойные редукторы Tamiya, микросхему L293NE (драйвер двигателей) и за пару вечеров смастерил шильдик для Arduino c которым этот «робот» бодро бегал по комнате (правда совершенно бестолково).
Но мне хотелось большего. Раздражала необходимость таскать за собой отдельную батарейку «Крона» для питания Arduino. Да и сам факт использования Arduino (прошу прощения у его поклонников!) оставлял неприятное чувство — все равно, что собрать машинку из конструктора (зато из Arduino получается вполне удобный программатор для AVR — им я и пользовался).
У меня была Atmega8, модуль Bluetooth, ультразвуковой датчик расстояния, трехосный акселерометр, микросхемы L293NE и 74HC595 и целое множество резисторов, конденсаторов и светодиодов всех сортов и расцветок, а также фоторезистор, потенциометр и электромагнитный генератор звука. Я поставил себе задачу питать двигатели и логическую часть от одного источника — четырех аккумуляторов формата AA 1.2V. Я видел радиоуправляемые танки, питающиеся от такого источника, так что у меня не было сомнений, что это возможно.
Я нарисовал схему напечатал плату и собрал ее. Написал тестовую прошивку, убедился в том, что лампочки мигают, Bluetooth подключается, пищалка пищит — и решил дать тестовый пуск двигателей. И погрузился в захатывающий мир работы с AVR в сильношумящем окружении.
Коллекторные двигатели ведут себя неприлично. Они шумят в широком диапазоне частот, а ток пуска и заклинивания в разы превышает номинальный ток при оптимальной нагрузке. В работе моей системы это выразилось в двух проявлениях:
- Cпонтанная перезагрузка МК при включении двигателей. Она проявлялась чаще при включении двух двигателей одновременно, и особенно при использовании ШИМ. Просадку напряжения было видно невооруженным глазом по уменьшению яркости диодов;
- Сбои в работе МК. Зависание, пропуск кусков программы, спонтанное увеличение или уменьшение тактовой частоты.
Устранение этих проблем заняло у меня полтора года (не непрерывной работы конечно!). В итоге все заработало, правда всю систему пришлось переделать заново.
Все собранные ниже соображения наверняка в том или ином виде присутствуют в Интернете. Моей основной целью было собрать все советы воедино: если бы такая статья попалась бы мне на глаза раньше, это сэкономило бы мне много времени, денег и душевного спокойствия.
Итак, советы.
- Делайте развязку питания
В момент пуска двигатели потребляют гораздо больше тока, чем в нормальном режиме. Например, для двигателей, которые использую я, пусковой ток составляет 1А. Это приводит к тому, что в при запуске происходит мгновенная просадка напряжения, часто достаточная для перезагрузки микроконтроллера. Чтобы побороть эту просадку необходимо осуществить развязку питания диодом Шоттки и большим конденсатором.
Линия Vcc питает всю логическую часть схемы, а силовая часть драйвера двигателя запитана от батарейки непосредственно (самая верхняя линия на рисунке). Когда напряжение питания падает, диод закрывается, и ток от конденсаторов идет только на линию Vcc, что нам и требуется. Емкость конденсатора должна быть достаточной, чтобы поддерживать питание логики на время просадки. Мне хватило двух конденсаторов по 4,7мФ. Последовательно включенная индуктивность превращает всю конструкцию в LC-фильтр. - Разделяйте землю на аналоговою и цифровую части
На предыдущем рисунке видно, что земля разделяется на две ветки, AGND и DGND. На схеме это неважно, но на практике это означает, что линия земли, обслуживающая цифровую часть, и земля двигателей должны пересекаться лишь в одной точке, максимально близко расположенной к «минусу» источника питания.
Разумеется, земляные полигоны также должны быть разделены (штрих-пунктир на рисунке). - Убедитесь в целости механических частей
Этого совета в Интернете я не встречал, но в моем случае он оказался одним из решающих. На одном из моих двигателей треснула пластиковая шестерня на валу. Это практически не сказалось на работоспособности двигателя с редуктором, поэтому заметил это я только на осциллографе. В момент попадания шестерни редуктора в трещину происходило небольшое подклинивание, что приводило в мгновенному возрастанию потребляемого тока и появлению помехи на частоте вращения двигателя. - Заземлите кварцевый резонатор
Цепь внешнего тактирования Atmega XTAL1/XTAL2 служит отличным путем для наводок. Поэтому если в вашем проекте вы используете кварцевый резонатор, велика вероятность, что в сильно шумящем окружении контроллер начнёт сходить с ума. В моем случае это выразилось в зависании, пропуске кусков программы или внезапном изменении частоты работы в большую или меньшую сторону. Чтобы победить эту проблему, мне хватило совета из п. 2., однако если и это не помогло, попробуйте заземлить кварц, припаяв на его корпус провод, идущий к цифровой земле. Будьте осторожны — кварцевый резонатор легко вывести из строя перегревом. - Экранируйте кварцевый резонатор
Обычно я делаю цельноземляную заливку на плате, но если это вам не по душе, сделайте по крайней мере небльшой земляной полигон вокруг кварца и балластных конденсаторов, как сказано в рекомендациях Atmel. Как и в предыдущем пункте, это поможет защитить линию тактирования от помех. Это же относится к случаю, если какая-либо аналоговая линия проходит параллельно логической — имеет смысл разделить их земляным полигоном. - Используйте внутренний осцилятор
Многие контроллеры AVR оснащены внутренним осциллятором. Он не такой точный, как кварцевый резонатор, а также (например, в случае моей Atmega8) зачастую не дает максимальную для контроллера тактовую частоту. Но если совсем ничего не выходит — можно попробовать использовать его. Первая неудачная модель моего робота стабильно работала только с внутренним осциллятором. - Электроника — наука о плохих контактах
Трижды проверьте все контакты на предмет плохой пропайки. Избегайте перемычек на линии питания логики.
Контакты бывают и хорошие, но не там, где нужно. У меня был случай, когда робот прекрасно работал, но моментально перезагружался при попытке послать что-либо через Bluetooth. Оказалось, что Reset был закорочен на линию серийного порта капелькой припоя. - Следуйте рекомендациям производителей
Почти все даташиты предлагают рекомендации по обвесу. Atmel выпускает даже отдельный документ — AVR Hardware Design Considerations.
Например, Atmega8 должна быть оснащена четырьмя конденсаторами (Reset, Vcc, ARef, AVCC), располагающимися как можно ближе к соответствующим выводам. Reset должен быть подтянут к питанию через резистор в 10KОм, основное питание (Vcc) оснащается своим отдельным LC-фильтром. Кварц и балластные конденсаторы должны располагаться как можно ближе к МК. Вообще любая микросхема должна иметь собственный отдельный конденсатор, развязывающий питание. - Поставьте конденсаторы параллельно контактам двигателей
Конденсаторы (100нФ) следует припаять непосредственно к контактам двигателей. Собственно, это мне было известно с самого начала, и этот совет здесь просто для полноты картины. - Понизьте уровень Brown-out
Brown-out — означает падение уровня напряжения. Микроконтроллеры оснащены детектором такой просадки. При ее возникновении микроконтроллер отключается. Однако уровень, при котором происходит отключение, можно регулировать. Например у Atmega8 существует три опции: детектирование отключено, срабатывание при уровне 2.7V, срабатывание при уровне 4.0V. Отключать Brown-out detection полностью я не советую, но понижение уровня срабатывания может помочь. Когда я понизил уровень до 2.7V система стала работать значительно стабильнее.
Вот и все. Чтобы не быть голословным, в заключение приведу видео, демонстрирующее моего робота в действии. Надеюсь, что моя статья кому-нибудь окажется полезной и благодарю за внимание!
Ссылки
- Техника разводки печатных плат
- AVR Hardware Design Considerations
- Подключение Atmel AVR: стабилизация работы микроконтроллера
Хочу поблагодарить своих друзей, без помощи и советов которых я бы давно сдался, а эта статья никогда бы не была написана.
Автор: Nu_hin