Схема регулятора скорости бесколлекторного двигателя (ESC)


11.04.2014

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

Контроллер - ATMEGA168. Гурманы могут сказать, что хватило бы и ATMEGA88, а AT90PWM3 - это было бы "вааще по феншую". Первый регулятор я как раз делал "по феншую". Если у Вас есть возможность применять AT90PWM3 - это будет наиболее подходящий выбор. Но для моих задумок решительно не хватало 8 килобайт памяти. Поэтому я применил микроконтроллер ATMEGA168.

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

Схема регулятора

Brushless ESC

Питание

Питание схемы раздельное. Поскольку драйверы ключей требуют питание от 10В до 20В, используется питание 12В. Питание микроконтроллера осуществляется через DC-DC преобразователь, собранный на микросхеме MC34063. Можете применять линейный стабилизатор с выходным напряжением 5В. Предполагается, что напряжение VD может быть от 12В и выше и ограничивается возможностями драйвера ключей и самими ключами.

ШИМ и сигналы для ключей

На выходе OC0B(PD5) микроконтроллера U1 генерируется ШИМ сигнал. Он поступает на переключатели JP2, JP3. Этими переключателями можно выбрать вариант подачи ШИМ на ключи (на верхние, нижние или на все ключи). На схеме переключатель JP2 установлен в положение для подачи ШИМ сигнала на верхние ключи.  Переключатель JP3 на схеме установлен в положение для отключения подачи ШИМ сигнала на нижние ключи. Не трудно догадаться, что если отключить ШИМ на верхних и нижних ключах, мы получим на выходе перманентный "полный вперед", что может разорвать двигатель или регулятор в хлам. Поэтому, не забываем включать голову, переключая их. Если Вам не потребуется такие эксперименты - и Вы знаете, на какие ключи Вы будите подавать ШИМ, а на какие нет, просто не делайте переключателей. После переключателей ШИМ сигнал поступает на входы элементы логики "&" (U2, U3). На эту же логику поступают 6 сигналов с выводов микроконтроллера PB0..PB5, которые являются управляющими сигналами для 6 ключей. Таким образом, логические элементы (U2, U3) накладывают ШИМ сигнал на управляющие сигналы. Если Вы уверены, что будете подавать ШИМ, скажем, только на нижние ключи, тогда ненужные элементы (U2) можно исключить из схемы, а соответствующие сигналы с микроконтроллера подавать на драйверы ключей. Т.е. на драйверы верхних ключей сигналы пойдут напрямую с микроконтроллера, а на нижние - через логические элементы.

Обратная связь (контроль напряжения фаз двигателя)

Напряжение фаз двигателя W,V,U через резистивные делители W - (R17,R25), V - (R18, R24), U - (R19, R23) поступают на входа контроллера ADC0(PC0), ADC1(PC1), ADC2(PC2). Эти выводы используются как входы компараторов. (В примере описанном в AVR444.pdf от компании Atmel применяют не компараторы, а измерение напряжения с помощью ADC (АЦП). Я отказался от этого метода, поскольку время преобразования ADC не позволяло управлять скоростными двигателями). Резистивные делители выбираются таким образом, чтобы напряжение, подаваемое на вход микроконтроллера, не превышало допустимое. В данном случае, резисторами 10К и 5К делится на 3. Т.е. При питании двигателя 12В. на микроконтроллер будет подаваться 12В*5К/(10К+5К) = 4В. Опорное напряжение для компаратора (вход AIN1) подается от половинного напряжения питания двигателя через делитель (R5, R6, R7, R8). Обратите внимание, резисторы (R5, R6) по номиналу такие же, как и (R17,R25), (R18, R24),(R19, R23). Далее напряжение уменьшается вдвое делителем R7, R8, после чего поступает на ногу AIN1 внутреннего компаратора микроконтроллера. Переключатель JP1 позволяет переключить опорное напряжение на напряжение "средней точки" формируемое резисторами (R20, R21, R22). Это делалось для экспериментов и себя не оправдало. Если нет в необходимости, JP1, R20, R21, R22 можно исключить из схемы.

Датчики Холла

Поскольку регулятор универсальный, он должен принимать сигналы от датчиков Холла в том случае, если используется двигатель с датчиками. Предполагается, что датчики Холла дискретные, тип SS41. Допускается применение и других типов датчиков с дискретным выходом. Сигналы от трех датчиков поступают через резисторы R11, R12, R13 на переключатели JP4, JP5, JP6. Резисторы R16, R15, R14 выступают в качестве подтягивающих резисторов. C7, С8, С9 - фильтрующие конденсаторы. Переключателями JP4, JP5, JP6 выбирается тип обратной связи с двигателем. Кроме изменения положения переключателей в программных настройках регулятора следует указать соответствующий тип двигателя (Sensorless или Sensored).

Измерения аналоговых сигналов

На вход ADC5(PC5) через делитель R5, R6 подается напряжения питания двигателя. Это напряжение контролируется микроконтроллером.

На вход ADC3(PC3) поступает аналоговый сигнал от датчика тока. Датчик тока ACS756SA. Это датчик тока на основе эффекта Холла. Преимущество этого датчика в том, что он не использует шунт, а значит, имеет внутреннее сопротивление близкое к нулю, поэтому на нем не происходит тепловыделения. Кроме того, выход датчика аналоговый в пределах 5В, поэтому без каких-либо преобразований подается на вход АЦП микроконтроллера, что упрощает схему. Если потребуется датчик с большим диапазоном измерения тока, Вы просто заменяете существующий датчик новым, абсолютно не изменяя схему.

Если Вам хочется использовать шунт с последующей схемой усиления, согласования - пожалуйста.

Задающие сигналы

Сигнал, задающий обороты двигателя, с потенциометра RV1 поступает на вход ADC4(PC4). Обратите внимание на резистор R9 - он шунтирует сигнал в случае обрыва провода к потенциометру.

Кроме того, есть вход RC сигнала, который повсеместно используется в дистанционно управляемых моделях. Выбор управляющего входа и его калибровка выполняется в программных настройках регулятора.

UART интерфейс

Сигналы TX, RX используются для настройки регулятора и выдачи информации о состоянии регулятора - обороты двигателя, ток, напряжение питания и т.п. Для настройки регулятора его можно подключить к USB порту компьютера, используя FT232 переходник. Настройка выполняется через любую программу терминала. Например: Hyperterminal или Putty.

Прочее

Также имеются контакты реверса - вывод микроконтроллера PD3. Если замкнуть эти контакты перед стартом двигателя, двигатель будет вращаться в обратном направлении.

Светодиод, сигнализирующий о состоянии регулятора, подключен к выводу PD4.

Силовая часть

Драйвера ключей использовались IR2101. У этого драйвера одно преимущество - низкая цена. Для слаботочных систем подойдет, для мощных ключей IR2101 будет слабоват. Один драйвер управляет двумя "N" канальными MOSFET транзисторами (верхним и нижним). Нам понадобиться три таких микросхемы.

Ключи нужно выбирать в зависимости от максимального тока и напряжения питания двигателя (выбору ключей и драйверов будет посвящена отдельная статья). На схеме обозначены IR540, в реальности использовались K3069. K3069 рассчитаны на напряжение 60В и ток 75А. Это явный перебор, но мне они достались даром в большом количестве (желаю и Вам такого счастья).

Конденсатор С19 включается параллельно питающей батареи. Чем больше его емкость - тем лучше. Этот конденсатор защищает батарею от бросков тока и ключи от значительной просадки напряжения. При отсутствии этого конденсатора Вам обеспечены как минимум проблемы с ключами. Если подключать батарею сразу к VD - может проскакивать искра. Искрогасящий резистор R32 используется в момент подключения к питающей батарее. Сразу подключаем "-" батареи, затем подаем "+" на контакт Antispark. Ток течет через резистор и плавно заряжает конденсатор С19. Через несколько секунд, подключаем контакт батареи к VD. При питании 12В можно Antispark не делать.

Возможности прошивки

  • возможность управлять двигателями с датчиками и без;
  • для бездатчикового двигателя три вида старта: без определения первоначального положения; с определением первоначального положения; комбинированный;
  • настройка угла опережения фазы для бездатчикового двигателя с шагом 1 градус;
  • возможность использовать один из двух задающих входов: 1-аналоговый, 2-RC;
  • калибровка входных сигналов;
  • реверс двигателя;
  • настройка регулятора по порту UART и получение данных от регулятора во время работы (обороты, ток, напряжение батареи);
  • частота ШИМ 16, 32 КГц.
  • настройка уровня ШИМ сигнала для старта двигателя;
  • контроль напряжения батарей. Два порога: ограничение и отсечка. При снижении напряжения батареи до порога ограничения обороты двигателя понижаются. При снижении ниже порога отсечки происходит полная остановка;
  • контроль тока двигателя. Два порога: ограничение и отсечка;
  • настраиваемый демпфер задающего сигнала;
  • настройка Dead time для ключей

Работа регулятора

Включение

Напряжение питания регулятора и двигателя раздельное, поэтому может возникнуть вопрос: в какой последовательности подавать напряжение. Я рекомендую подавать напряжение на схему регулятора. А затем подключать напряжение питания двигателя. Хотя при другой последовательности проблем не возникало.  Соответственно, при одновременной подаче напряжения также проблем не возникало.

После включения двигатель издает 1 короткий сигнал (если звук не отключен), включается и постоянно светится светодиод. Регулятор готов к работе.

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

Запуск

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

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

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

Во время работы регулятор выдает данные об оборотах двигателя, токе, напряжении батарей через порт UART в формате:


E:минимальное напряжение батареи: максимальное напряжение батареи: максимальный ток: обороты двигателя (об/мин)
A:текущее напряжение батареи: текущий ток: текущие обороты двигателя (об/мин)

Данные выдаются с периодичностью примерно 1 секунда. Скорость передачи по порту 9600.

Настройка регулятора

Для настройки регулятора его следует подключить к компьютеру с помощью USB-UART переходника. Скорость передачи по порту 9600.

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

Регулятор воспринимает следующие команды (в разных версиях прошивки набор настроек и команд может отличаться):

h - вывод списка команд; ? - вывод настроек; c - калибровка задающего сигнала; d - сброс настроек к заводским настройкам.

команда "?" выводит в терминал список всех доступных настроек и их значение. Например:

motor.type=0
motor.magnets=12
motor.angle=7
motor.start.type=0
motor.start.time=10
pwm=32
pwm.start=15
pwm.min=10
voltage.limit=128
voltage.cutoff=120
current.limit=200
current.cutoff=250
system.sound=1
system.input=0
system.damper=10
system.deadtime=1
Изменить нужную настройку можно командой следующего формата:

<настройка>=<значение>

Например:

pwm.start=15

Если команда была дана корректно, настройка будет применена и сохранена. Проверить текущие настройки после их изменения можно командой "?".

Измерения аналоговых сигналов (напряжение, ток) выполняются с помощью АЦП микроконтроллера. АЦП работает в 8-ми битном режиме. Точность измерения занижена намеренно для обеспечения приемлемой скорости преобразования аналогового сигнала. Соответственно, все аналоговые величины регулятор выдает в виде 8-ми битного числа, т.е. от 0 до 255.

Назначение настроек:

Список настроек, их описание:

Параметр Описание Значение
motor.type Тип мотора 0-Sensorless; 1-Sensored
motor.magnets Кол.во магнитов в роторе двигателя. Изпользуется только для расчета оборотов двигателя. 0..255, шт.
motor.angle Угол опережения фазы. Используется только для Sensorless двигателей. 0..30, градусов
motor.start.type Тип старта. Используется только для Sensorless двигателей. 0-без определения положения ротора; 1-с определением положения ротора; 2-комбинированный;
motor.start.time Время старта. 0..255, мс
pwm Частота PWM 16, 32, КГц
pwm.start Значение PWM (%) для старта двигателя. 0..50 %
pwm.min Значение минимального значения PWM (%), при котором двигатель вращается. 0..30 %
voltage.limit Напряжение батареи, при котором следует ограничивать мощность, подаваемую на двигатель. Указывается в показаниях ADC. 0..255*
voltage.cutoff Напряжение батареи, при котором следует выключать двигатель. Указывается в показаниях ADC. 0..255*
current.limit Ток, при котором следует ограничивать мощность, подаваемую на двигатель. Указывается в показаниях ADC. 0..255**
current.cutoff Ток, при котором следует выключать двигатель. Указывается в показаниях ADC. 0..255**
system.sound Включить/выключить звуковой сигнал, издаваемый двигателем 0-выключен; 1-включен;
system.input Задающий сигнал 0-потенциометр; 1-RC сигнал;
system.damper Демпфирование входного сигнала 0..255, условные единицы
system.deadtime Значение Dead Time для ключей в микросекундах 0..2, мкс
* - числовое значение 8-ми битного аналого цифрового преобразователя. Рассчитывается по формуле: ADC = (U*R6/(R5+R6))*255/5 Где: U - напряжение в Вольтах; R5, R6 - сопротивление резисторов делителя в Омах.

** - числовое значение 8-ми битного аналого цифрового преобразователя. Рассчитывается по формуле: ADC = U*255/5 Где: U - напряжение датчика тока в Вольтах, соответствующее требуемому току.

Скачать архив со схемой и прошивкой

Скачать примеры исходного кода на С

Фьюзы микроконтроллера должны быть выставлены на работу с внешним кварцем. Строка для программирования фьюзов с помощью AVRDUDE:

-U lfuse:w:0xFF:m -U hfuse:w:0xDC:m

P.S. Данная схема получила дальнейшее развитие. Был добавлен внешний компаратор, который позволил избавиться от необходимости переключать аналоговую часть микроконтроллера из режима ADC в режим компаратора и обратно (в Atmega одновременно компаратор и ADC работать не могут). Что в свою очередь позволило несколько ускорить измерение аналоговых сигналов. Кроме того, внешний компаратор стал генерировать аварийный сигнал при превышении предельного значения тока. Что существенно увеличило защищенность регулятора в нештатных ситуациях. Вместе с тем осталась универсальность, позволяющая использовать широкий выбор драйверов, в том числе и специальных для 3-х фазных двигателей. О силовой части будет рассказано в одной из следующих статей.

Успехов!

Статті по безколекторним двигунам:

Brushless Motors Корисно знати Схеми і прошивки
Коментарі:
kpmic говорить:
18.04.2014 21:10
Хотелось бы взглянуть на исходник, если из этого здесь не делают коммерческой тайны.

andre говорить:
18.04.2014 21:37
Исходники, будут опубликованы как только это станет возможным. Исходный код будет несколько упрощен (будут удалены специфические функции) и будут добавлены пояснения.

kpmic говорить:
18.04.2014 21:41
Надеюсь долго ждать не придется.

kpmic говорить:
21.04.2014 17:46
Могу подбросить идею как упростить схему и исключить микросхемы U2, U3

andre говорить:
22.04.2014 08:01
Буду рад услышать оригинальные идеи.

kpmic говорить:
22.04.2014 16:46
Сигнал ШИМ с вывода 9 можно завести в МК и организовать программный мультиплексор вместо U2, U3.
У меня реализован такой вариант, но для другого МК.

andre говорить:
24.04.2014 08:53
И у меня есть такой вариант и тоже на другом микроконтроллере. Мало того, в следующем варианте схемы я отказался от внутренних компараторов, и установил еще одну внешнюю микросхему. И сделал это не просто так, а для чего-то ;)

Ку говорить:
04.05.2014 00:21
Что за даты? Опубликовано одиннадцатого апреля 2014 года??  А даты комментариев??

andre говорить:
04.05.2014 11:14
А что не так с датами? Опубликовано 11.04.2014, комментарии с 18.04.2014 В чем вопрос?

Machestro говорить:
08.05.2014 11:04
Правильно ли я понимаю, что если использовать метод определения положения ротора в остановленном состоянии (описанный ранее) то в этом случае поведение двигателя становится абсолютно аналогичным BLDC с датчиками? Или этот метод не позволит получить все преимущества двигателя с датчиками?

andre говорить:
08.05.2014 13:57
Нет. Описанный ранее метод работает только на стадии запуска двигателя. Использовать его во время вращения двигателя нельзя. В природе существуют схемотехнические решения, позволяющее не использовать датчики холла. Идея состоит в том, чтобы подавать в цепь двигателя высокочастотную составляющую. Отфильтровывать ее и далее по алгоритму очень похожему на тот о котором я писал, определять положение двигателя. В этом случае двигатель управляется так же как и BLDC с датчиками. Но я такими вещами еще не занимался.

Machestro говорить:
09.05.2014 11:33
Спасибо за ответ. Было бы здорово к вашей схеме и системе управления приделать управление синусом, как это сделано в апноуте от Atmel AVR447

andre говорить:
09.05.2014 23:41
Синусоидой, на сколько я знаю, управляют синхронными моторами с постоянными магнитами. Они очень схожи с BLDC, но пока в планах заниматься ими нет.

sl говорить:
10.05.2014 19:26
Спасибо. Тоже пробую разобраться с bldc с датчиками холла -3000 оборотов 60 вольт, правда делаю на pic18, но это не так важно- мотор крутится как по часовой так и против но иногда происходят не понятные сбои( стуки , или резко тормозит и вновь стартует) может работать минуту без сбоев а потом сбойнуть иногда чаще. Из за чего могут происходить подобные сбои?

sl говорить:
11.05.2014 11:28
Сегодня сравнил алгоритм работы ключей от датчиков холла MC33035(для проекта брал из ДШ MC33035) С микрочиповским AN857 разница очевидна. завтра на работе попробую перешить таблицу может быть глюки пропадут .

sl говорить:
24.05.2014 06:39
Приветствую Андрей! Есть ли какой нибудь цветовой стандарт обозначения фазных проводов(A B C) и датчиков холла. 
Цвета фазных проводов ЗЕЛЕНЫЙ СИНИЙ ЖЕЛТЫЙ , холлов  ЗЕЛЕНЫЙ СИНИЙ ЖЕЛТЫЙ - как они соотносятся с ABC ???
Спасибо.

Виктория Перхун говорить:
14.05.2021 05:23
Здравствуйте, какой регулятор скорости использовался?

andre говорить:
14.05.2021 07:29
В статье есть ссылки на схему регулятора. Читайте внимательнее. Регулятор использовался тот про который и написана статья.

Сергей_С_В говорить:
20.08.2021 06:25
Подскажите как работает вход RC-сигнал какой формат, делаю настройку system.input =1	регулятор не воспринимает не чего и попасть в режим программирования не реально резистор отключаеться

Сергей_С_В говорить:
20.08.2021 06:26
Ау есть кто

Сергей_С_В говорить:
20.08.2021 06:29
Ау есть кто

Сергей_С_В говорить:
20.08.2021 06:43
Сделал сей девайс шим подал на верхние ключи, прошивка из архива Brushless_ESC.hex двигатель дергаеться рывками или стоит с мелкими тычками, средняя фаза моментально греется, может поменять шим на нижнее ключи, хотя прошивка  Brushless_new.hex работает хорошо только с RC сигналом не могу разобраться что на вход подовать

Юрий говорить:
06.08.2022 09:16
Всем привет! А я только собрался собрать сей девайс, Хочу сделать лодочный электромотор,  48v. 5kw моторчик,   Внимательно изучая и перечитывая описание возникло 2 вопроса: 

Юрий говорить:
06.08.2022 09:16
Какое напряжение должно быть  после делителя r5/r6,   r7/r8 ?  в описании говорится про половину напряжения питания двигателя,   но при указанных номиналах резисторов и U=12в  получается 3,428 в,    

Юрий говорить:
06.08.2022 09:17
И второе  на какую ногу подается это опорное напряжение? в тексте упоминается  (вход AIN1) 11пин,   а на схеме нарисовано  10 пин  (вход AIN0)  ?     Подскажите друзья что бы я время не тратил на эксперименты,  спс )

Сергей говорить:
10.11.2022 00:34
Не пойму почему в исходнике ШИМ настроен как PWM, phase Correct OCRA , вроде должно быть Fast PWM 0xFF , и зачем в цепи VB два  bootstrap capacitor , мне кажется одного на 1 мкф хватит .

andre говорить:
10.11.2022 10:14
Стосовно PWM, не зрозумів про який саме приклад йдеться. Їх було декілька і досить давно, понад 6 років тому.
Я вже старенький і забуваю що було на минулому тижні. Дайте посилання про який саме код йде мова і де Ви його звантажити.
Стосовно конденсаторів.
Якщо здається, що 1 мкф вистачить – ставте 1 мкф. Якщо не вистачить – потім можна додати ;) Я ж не знаю у якому режимі і буде використовуватися плата.

Сергій говорить:
11.11.2022 00:57
В проэкте GCC 3.4.6 для мікроконтролера Atmega168 BLDC_Sensored_Example 
думаю таймер лучше настроить Fast PWM 0xFF , 
(1 << COM0B1)|(1<<WGM01)|(1<<WGM00); И еще вы пишите что ШИМ можно подавать на ключи (на верхние, нижние или на все ключи) , но драйвер верхнего ключа работает исключительно в импульсном режиме , так что ШИМ только на нижние не получится 

Додати коментар
Code
* - обов'язкові поля

Архіви