Avr двигатель


10 советов по использованию микроконтроллеров AVR в системах с двигателями / Geektimes

Среди людей, увлекающихся электроникой, одним из самых популярных этюдов является изготовление гусеничного робота. Этой теме посвящена масса статей, в том числе и на Хабре. Обилие руководств, схем и статей привело меня к мысли, что это будет не так уж трудно, и мне тоже захотелось самому изготовить такую прекрасную самоделку. Можно сказать, что мне не повезло — в процессе работы я столкнулся с массой проблем, связанных с наличием двигателей. В конце концов все эти проблемы мне удалось решить, но это заняло очень много времени. В данной статье я предлагаю несколько советов по проектированию схем, содержащих двигатели, на базе микроконтроллеров AVR. В практической полезности всех этих советов мне пришлось убедиться на собственном опыте. Многие советы, как мне кажется, подойдут и для других микроконтроллеров.

Скажу сразу, что когда я приступил к этому проекту, мой опыт в электронике был минимален. Arduino к тому моменту у меня была уже довольно давно, так что я купил гусеницы и двойные редукторы Tamiya, микросхему L293NE (драйвер двигателей) и за пару вечеров смастерил шильдик для Arduino c которым этот «робот» бодро бегал по комнате (правда совершенно бестолково).

Но мне хотелось большего. Раздражала необходимость таскать за собой отдельную батарейку «Крона» для питания Arduino. Да и сам факт использования Arduino (прошу прощения у его поклонников!) оставлял неприятное чувство — все равно, что собрать машинку из конструктора (зато из Arduino получается вполне удобный программатор для AVR — им я и пользовался).

У меня была Atmega8, модуль Bluetooth, ультразвуковой датчик расстояния, трехосный акселерометр, микросхемы L293NE и 74HC595 и целое множество резисторов, конденсаторов и светодиодов всех сортов и расцветок, а также фоторезистор, потенциометр и электромагнитный генератор звука. Я поставил себе задачу питать двигатели и логическую часть от одного источника — четырех аккумуляторов формата AA 1.2V. Я видел радиоуправляемые танки, питающиеся от такого источника, так что у меня не было сомнений, что это возможно.

Я нарисовал схему напечатал плату и собрал ее. Написал тестовую прошивку, убедился в том, что лампочки мигают, Bluetooth подключается, пищалка пищит — и решил дать тестовый пуск двигателей. И погрузился в захатывающий мир работы с AVR в сильношумящем окружении.

Коллекторные двигатели ведут себя неприлично. Они шумят в широком диапазоне частот, а ток пуска и заклинивания в разы превышает номинальный ток при оптимальной нагрузке. В работе моей системы это выразилось в двух проявлениях:

  • Cпонтанная перезагрузка МК при включении двигателей. Она проявлялась чаще при включении двух двигателей одновременно, и особенно при использовании ШИМ. Просадку напряжения было видно невооруженным глазом по уменьшению яркости диодов;
  • Сбои в работе МК. Зависание, пропуск кусков программы, спонтанное увеличение или уменьшение тактовой частоты.

Устранение этих проблем заняло у меня полтора года (не непрерывной работы конечно!). В итоге все заработало, правда всю систему пришлось переделать заново.

Все собранные ниже соображения наверняка в том или ином виде присутствуют в Интернете. Моей основной целью было собрать все советы воедино: если бы такая статья попалась бы мне на глаза раньше, это сэкономило бы мне много времени, денег и душевного спокойствия.

Итак, советы.

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

Вот и все. Чтобы не быть голословным, в заключение приведу видео, демонстрирующее моего робота в действии. Надеюсь, что моя статья кому-нибудь окажется полезной и благодарю за внимание!

Ссылки
  1. Техника разводки печатных плат
  2. AVR Hardware Design Considerations
  3. Подключение Atmel AVR: стабилизация работы микроконтроллера

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

geektimes.ru

10 советов по использованию микроконтроллеров AVR в системах с двигателями

Среди людей, увлекающихся электроникой, одним из самых популярных этюдов является изготовление гусеничного робота. Этой теме посвящена масса статей, в том числе и на Хабре. Обилие руководств, схем и статей привело меня к мысли, что это будет не так уж трудно, и мне тоже захотелось самому изготовить такую прекрасную самоделку. Можно сказать, что мне не повезло — в процессе работы я столкнулся с массой проблем, связанных с наличием двигателей. В конце концов все эти проблемы мне удалось решить, но это заняло очень много времени. В данной статье я предлагаю несколько советов по проектированию схем, содержащих двигатели, на базе микроконтроллеров AVR. В практической полезности всех этих советов мне пришлось убедиться на собственном опыте. Многие советы, как мне кажется, подойдут и для других микроконтроллеров.

Скажу сразу, что когда я приступил к этому проекту, мой опыт в электронике был минимален. Arduino к тому моменту у меня была уже довольно давно, так что я купил гусеницы и двойные редукторы Tamiya, микросхему L293NE (драйвер двигателей) и за пару вечеров смастерил шильдик для Arduino c которым этот «робот» бодро бегал по комнате (правда совершенно бестолково).

Но мне хотелось большего. Раздражала необходимость таскать за собой отдельную батарейку «Крона» для питания Arduino. Да и сам факт использования Arduino (прошу прощения у его поклонников!) оставлял неприятное чувство — все равно, что собрать машинку из конструктора (зато из Arduino получается вполне удобный программатор для AVR — им я и пользовался).

У меня была Atmega8, модуль Bluetooth, ультразвуковой датчик расстояния, трехосный акселерометр, микросхемы L293NE и 74HC595 и целое множество резисторов, конденсаторов и светодиодов всех сортов и расцветок, а также фоторезистор, потенциометр и электромагнитный генератор звука. Я поставил себе задачу питать двигатели и логическую часть от одного источника — четырех аккумуляторов формата AA 1.2V. Я видел радиоуправляемые танки, питающиеся от такого источника, так что у меня не было сомнений, что это возможно.

Я нарисовал схему напечатал плату и собрал ее. Написал тестовую прошивку, убедился в том, что лампочки мигают, Bluetooth подключается, пищалка пищит — и решил дать тестовый пуск двигателей. И погрузился в захатывающий мир работы с AVR в сильношумящем окружении.

Коллекторные двигатели ведут себя неприлично. Они шумят в широком диапазоне частот, а ток пуска и заклинивания в разы превышает номинальный ток при оптимальной нагрузке. В работе моей системы это выразилось в двух проявлениях:

  • Cпонтанная перезагрузка МК при включении двигателей. Она проявлялась чаще при включении двух двигателей одновременно, и особенно при использовании ШИМ. Просадку напряжения было видно невооруженным глазом по уменьшению яркости диодов;
  • Сбои в работе МК. Зависание, пропуск кусков программы, спонтанное увеличение или уменьшение тактовой частоты.

Устранение этих проблем заняло у меня полтора года (не непрерывной работы конечно!). В итоге все заработало, правда всю систему пришлось переделать заново.

Все собранные ниже соображения наверняка в том или ином виде присутствуют в Интернете. Моей основной целью было собрать все советы воедино: если бы такая статья попалась бы мне на глаза раньше, это сэкономило бы мне много времени, денег и душевного спокойствия.

Итак, советы.

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

Вот и все. Чтобы не быть голословным, в заключение приведу видео, демонстрирующее моего робота в действии. Надеюсь, что моя статья кому-нибудь окажется полезной и благодарю за внимание!

Ссылки
  1. Техника разводки печатных плат
  2. AVR Hardware Design Considerations
  3. Подключение Atmel AVR: стабилизация работы микроконтроллера

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

Автор: Nu_hin

Источник

www.pvsm.ru

AVR360: контроллер для шагового двигателя | avr

Здесь приведен перевод апноута [1], описывающего реализацию компактного, высокоскоростного, управляемого прерываниями контроллера шагового мотора. Шаговые двигатели (ШД) обычно используются для приложений наподобие управления фокусом камеры, привода ленты, перемещения печатающей головки, управления движением механики в факсах, принтерах, копировальных аппаратах, 3D-принтерах, станках с ЧПУ, жестких дисках, приводах DVD-ROM и т. п. Высокое быстродействие микроконтроллеров AVR позволяет разработчику реализовать высокоскоростные приложения для управления ШД, причем вычислительное ядро процессора остается слабо нагруженным. Особенности описываемого контроллера:

• Высокоскоростной котроллер ШД• Применяются прерывания• Компактный код (в обработчике прерывания используется около 10 байт)• Низкие требования к вычислительным ресурсам• Можно реализовать на всех микроконтроллерах семейства AVR

[Немного теории: как это работает]

Шаговый мотор (шаговый двигатель, ШД) постоянного тока преобразует импульсы тока во вращение своего ротора. Типичный ШД содержит в своем составе 4 силовые обмотки, на которые подаются эти импульсы тока. Обмотки часто помечены разными цветами как red (красный), yellow/white (желтый/белый), red/white (красный/белый) и yellow (желтый), но могут использоваться и другие цвета. Приложенное напряжение к этим обмоткам приводит к выполнению мотором одного шага.

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

Скорость вращения управляется частотой импульсов переключения фаз ШД. С каждым импульсом (с каждым шагом ШД) ротор поворачивается на фиксированный угол. Обычный угол поворота составляет 1.8 градуса. С таким углом поворота на шаг полный оборот ротора (360 градусов) потребует 200 шагов (циклов переключения фаз).

Путем изменения интервала между прерываниями таймера можно регулировать скорость вращения ШД, а путем подсчета количества шагов можно управлять углом поворота. На рис. 1 показаны диаграммы переключения фаз ШД. В таблице 1 показано соответствие шагов мотора значениям, записываемым в выводы порта микроконтроллера.

Рис. 1. Последовательность переключения фаз.

Таблица 1. Значения фаз ШД.

Шаг Yellow Red/White Yellow/White Red Значение (HEX)
0 1 0 0 1 9
1 1 1 1 0 C
2 0 1 1 0 6
3 0 0 1 1 3

[Описание программного обеспечения]

Программа микроконтроллера использует 16-разрядный таймер с функцией захвата для генерирования прерывания каждые 100 мкс. Когда выполняется обработчик прерывания, новое значение для формирования фаз выводится в выходные разряды порта PORTB (они управляют силовыми ключами, которые подают напряжения на обмотки ШД).

Значения для фаз шагового двигателя записаны в память программ (FLASH) микроконтроллера. При включении питания или сбросе эти значения копируются в SRAM, чтобы ускорить к ним доступ со стороны кода программы - этим достигается максимальное быстродействие. В этой реализации подпрограмма обработчика прерывания (interrupt service routine, ISR) занимает 7 циклов процессорного времени + 4 цикла на вход в ISR и 4 цикла на выход из ISR. Всего получается 15 тактовых циклов. Таким образом, на рабочей тактовой частоте 8 МГц один шаг мотора займет меньше 2 мкс. Если запуск ISR потребуется каждые 100 мкс, то обработка управления фазами ШД займет примерно 2% вычислительных ресурсов ядра микроконтроллера.

В этой программе значения для формирования фаз ШД сохраняются в по адресу 0x0100 в памяти RAM. Старший байт адреса RAM всегда постоянный, и используется только младший ниббл младшего байта адреса для получения доступа доступа к значениям (см. рис. 2). Младший ниббл в ячейке памяти (4 бита) содержат действительное значение для управления фазами ШД, старший ниббл содержит адрес следующего значения.

Рис. 2. Использование адресов и значений из таблицы переключения фаз.

При использовании такого метода можно достичь максимальной скорости работы кода и минимального расхода процессорного времени микроконтроллера. В таблицах 2 и 3 показано использование ресурсов микроконтроллера.

Таблица 2. Использование вычислительных ресурсов и памяти.

Функция Размер кода Циклов Использование регистров Прерывание Описание
Main 38 слов - R16, XL, XH, ZL, ZH - Инициализация и пример основной программы.
OC1A 10 слов 13 + возврат R16, XL, XH Timer1 Output Compare A Формирование шагов мотора путем вывода очередных значений в порты управления фазами. Вычисление адреса для следующего значения фаз.
Всего 48 слов - R16, XL, XH, ZL, ZH

Таблица 3. Использование периферийных устройств.

Периферийное устройство Описание Разрешенные прерывания
4 вывода портов GPIO Выходы для управления силовыми ключами фаз ШД.
Timer1 Использование прерываний таймера для генерации частоты смены фаз ШД. Timer 1 Output Compare A
;*************************************************************************** ;* Имя файла: avr360.asm ;* Тема: простая реализация высокоскоростного контроллера ШД ;* Date :98.07.02 ;* Version :1.00 ;* Support telephone :+47 72 88 43 88 (ATMEL Norway) ;* Support fax :+47 72 88 43 99 (ATMEL Norway) ;* Support E-mail :avr@atmel.com ;* Target MCU :может работать на всех моделях AVR ;* : (в этом примере используется ATmega8515) ;*************************************************************************** .include "..\8515def.inc" ;*************** Используемые глобальные регистры ************************** .def temp = R16 ;*************** Определение констант ******************************** .equ c_value = 500 ;значение сравнения для output compare interrupt ; 500 циклов на 5 МГц соответствует 100 мкс ;************************************************************************= ;* ;* Начало программы - с этого места начинается выполнение кода ;* ;************************************************************************= .cseg ;Начало таблицы векторов прерываний .org 0x00 rjmp main ;Вектор прерывания Output compare A interrupt .org OC1Aaddr rjmp OC1A ;************************************************************************= ;* OC1A - Обработчик прерывания (ISR) Timer1 Output compare A ;* ;* Описание: ;* Этот ISR загружает новое значение фаз из таблицы, расположенной ; в памяти SRAM. Значения в ячейках таблицы имеют 2 функции: младший ;* ниббл содержит значение для вывода в порт, а старший содержит адрес для ;* следующего значения. Младший ниббл выводится в порт, а старший ниббл ;* помещается в регистр XL. ;* ;* Количество слов кода : 6 + возврат ;* Количество тактовых циклов : 7 + возврат ;* Младшие регистры : не используются ;* Старшие регистры : 3 (temp, XL, XH) ;************************************************************************= OC1A: ld temp,X ;Загрузить в temp значение по указателю X mov XL,temp ;Поместить это значение в младший байт указателя X andi temp,0x0F ;Сброс старшего ниббла temp out PORTB,temp ;Вывод младшего ниббла в фазы ШД swap XL ;Поменять местами старший и младший нибблы XL andi XL,0x0F ;Подготовка адреса следующей ячейки: сбросить старший ниббл reti ;**************************************************************************** ;* Основная программа ;* ;* Эта программа инициализирует Timer 1 output compare interrupt, чтобы оно ;* срабатывало с интервалом, определенным константой c_value. ;* Для достижения максимальной скорости работы таблица преобразования значений ;* загружается из памяти программ (FLASH) и сохраняется в SRAM по адресу 0x0100. ;**************************************************************************** main: ldi r16,high(RAMEND) ;Инициализация указателя стека out SPH,r16 ldi r16,low(RAMEND) out SPL,r16 ldi temp,0x0F ;Настройка выходов порта PORTB out DDRB,temp ldi temp,0x00 out PORTB,temp ;Запись начального значения в PORTB ldi temp,high(c_value);Загрузка старшего байта величины сравнения out OCR1AH,temp ldi temp,low(c_value) ;Загрузка младшего байта величины сравнения out OCR1AL,temp ldi temp,0x00 out TCNT1H,temp ;Очистка старшего байта таймера out TCNT1L,temp ;Очистка младшего байта таймера out TCCR1A,temp ;Очистка регистра управления таймера A (timer control reg A) ldi temp,0x40 out TIFR,temp ;Очистка ожидающего прерывания таймера out TIMSK,temp ;Разрешение прерывания сравнения таймера (Timer compare interrupt) ldi ZH,high(step*2) ;Инициализация указателя Z на таблицу фаз мотора в памяти FLASH ldi ZL,low(step*2) ldi XH,high(0x0100) ;Инициализация указателя X на место в оперативной памяти (RAM) ldi XL,low(0x0100) ldi temp,0x04 ;Загрузка значения счетчика load: lpm ;Загрузка значения шага из FLASH st X+,R0 ;Сохранение значения шага в RAM adiw ZL,0x01 ;Инкремент указателя на FLASH dec temp ;Декремент счетчика brne load ;Повторить, пока не будет загружена вся таблица ldi XH,high(0x0100) ;Инициализация указателя X на место таблицы в RAM ldi XL,low(0x0100) ldi temp,0x9 out TCCR1B,temp ;Очистка таймера при совпадении значения (compare match), CK/1 sei ;Общее разрешение прерываний loop: rjmp loop ;Бесконечный цикл по метке loop ;Таблица преобразований для формирования фаз ШД (Step motor lookup table): step: .db 0x19,0x2C,0x36,0x03

[Ссылки]

1. AVR360: Step Motor Controller site:atmel.com.2. AVR-USB-MEGA16: управление шаговым двигателем по USB.

microsin.net

8- RISC- AVR

. . AVR Flash ( 8..100- ), , .

: Flash .

: AVR, .

: , .

, ATtiny13 AT90PWM3, .

Atmel .

HTMLRUS PDFENGL ZIPENGL
262 Kb 8792 Kb AVR275: AT90USB (10 , A, 09/06)
130 Kb 55 Kb AVR440: (16 , , 09/05)
  580 Kb 60 Kb AVR441: (26 , , 09/05)
  314 Kb 3 Kb AVR442: ATtiny13 ATtiny13 (10 , , 09/05)
426 Kb 173 Kb AVR443: (8 , , 02/06)
245 Kb 81 Kb AVR444(14 , A, 10/05):
176 Kb 12 Kb AVR448: 3- (10 , , 02/06)
1260 Kb 391 Kb AVR492: AT90PWM3 (26 , A, 07/05)
382 Kb 80 Kb AVR494: V/f - (12 , , 12/05)
376 Kb 80 Kb AVR495: V/f - -
  RUS AVR Studio - , AVR .
  RUS JTAG ICE mkII -
  RUS STK500 - AVR
  RUS ATAVRMC100 - AT90PWM3 . MC100 , STK500

- : GCC- IAR Systems.

3- .

- - DOC - - - - - - -

www.gaw.ru

Бесколлекторные двигатели. Примеры на C

Эти примеры можно рассматривать, как демонстрацию алгоритмов управления бесколлекторным двигателем, но не как конечный продукт. Для доведения до законченной технической реализации потребуется, как минимум, добавить дополнительные цепи защиты. Эти примеры рассчитаны на управление двигателями с напряжением питания от 12 до 24 Вольт. При более высоком напряжении питания потребуется вносить изменения в схему. В схемах предусмотрена возможность подавать ШИМ сигнал (с помощью перемычек) на верхние и/или нижние ключи. Для управления бездатчиковыми двигателями это может играть важную роль.

Sensored BLDC

Пример управления бесколлекторным двигателем с датчиками Холла

Пример написан на GCC 3.4.6для микроконтроллера Atmega168

Содержит: схему, исходный код на C.

 

 

Скачать

Sensorless BLDC (AVR444)

Пример управления бездатчиковым бесколлекторным двигателем

Пример написан на GCC 3.4.6для микроконтроллера Atmega168

Адаптированный к GCC примерот Atmel (см. AVR444)Файлы, предлагаемые Atmel можно скачать здесь

Содержит: схему, исходный код на C.

  

 

Скачать

Предполагается, что контроллер будет работать на частоте 8Мгц. Определение положения ротора основано на измерении напряжения на свободной фазе и определении момента перехода напряжения свободной фазы через ноль. Для измерения напряжения используется АЦП микроконтроллера. В этом примере в качестве опорного напряжение АЦП используется питание микроконтроллера, а уровень напряжения перехода фазы через ноль (значение АЦП) задается в константе ADC_ZC_THRESHOLD. Это не совсем корректно, так как при изменении напряжения питания двигателя, определение момента перехода свободной фазы через ноль становиться не точным. Так же этот пример имеет некоторые ограничения по скорости из за использования АЦП.

Sensorless BLDC

Пример управления бездатчиковым бесколлекторным двигателем

Пример написан на GCC 3.4.6для микроконтроллера Atmega168.

Содержит: схему, исходный код на C.

 

 

Скачать

Это основательная переработка примера AVR444. Его основная отличительная особенность: для определения момента перехода напряжения свободной фазы через ноль используется внутренний компаратор микроконтроллера. Также увеличена частоты работы микроконтроллера до 16 МГц (тактирование от внешнего кварцевого резонатора). Эти и другие изменения позволили работать с более оборотистыми двигателями.

Статьи по бесколлекторным двигателям:

www.avislab.com


Смотрите также