Esc регуляторы своими руками

Esc регуляторы своими руками

Программирование ESC регулятора

Автор: boka1733, pvv17@mail.ru
Опубликовано 12.04.2016
Создано при помощи КотоРед.

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

Итак, начну.
Во времена моей кошачьей молодости (пионерское детство) каждый проводок, сигнал в самодельной схеме был известен, изучен и (я надеюсь) понят, как это работает.
Ну, или почему не работает.
Сейчас, казалось-бы, в интернете можно найти что угодно, а-н нет, очень часто «самоделкины» нарываются на отсутствие описания, протокола, схемы.
что ведет к невозможности решения технической задачи и необходимость превращаться в «покупалкина» готового устройства, даже простого.
Вот и я столкнулся с проблемой — знакомый задумал сделать устройство, электро-механическое.
Для простоты понимания (суть моего повествования не в устройстве) — похоже на автоматическое горизонтальное закрывание-открывание штор.
Электромотор медленно крутит в одну сторону (по команде),останавливается, затем медленно крутит в обратную сторону (по команде).
Скорость движения может меняться. Управляться это устройство должно по радио, работать на аккумуляторах.
Просто идеально для этого подходят детали от радиоуправляемых моделей — пульт готовый, приемник готовый, мощные двигатели от машинок есть.
Движения «стика» газа полностью подходят для управления, а возможности программирования пульта 9XR добавляют массу полезных плюшек.
Остается собрать все «кубики» в кучу.
Но, оказалось, что знакомый купил регулятор бесколлекторного двигателя HobbyKing X-CAR SENSORED 45A ESC без карты программирования.


Для тех, кто не в «теме» — карта программирования (на фото коробочка справа внизу), это устройство , которое позволяет изменять настройки параметров самого регулятора.
Этих параметров десять и не всегда дефолтные значения устраивают. Их перепрограммируют картой, и больше никогда не меняют (про «фанатов» все перестраивать 100 раз в день промолчу)
По сути эта карта- одноразовое устройство, которое больше не потребуется, после настройки.
Знакомый купил ESC регулятор без карты, хотя она как-бы должна (?) быть в комплекте.

Стали разбираться, искать альтернативы этой карты. Выяснилось, что этих карт программирования великое множество — у каждого производителя свой вариант.
Ещё и новое поколение у одного производителя уже будет не совместимо со старыми моделями. Найти эту карту отдельно оказалось трудно (провинция мы).Покупать через интернет одноразовую вещь — совсем печально.

Я кошачьим чутьем чувствовал, что не может быть там ничего сложного. Три провода — плюс, минус и сигнал — вот и весь интерфейс регулятора.
Скорее всего применен однопроводной протокол. Параметров в регуляторе, которые можно изменять, кот наплакал — всего десять.
Сканирование интернета и форумов не давало ничего — ни байта алгоритма протокола. Только ссылки на покупку.
Мне надо было изменить только один параметр — мотор едет «вперед» на 100% мощности , назад только 60% (так по умолчанию), а нужно 100% в обе стороны.
И вот, один хороший человек на модельном форуме отозвался и отправил мне эту карту программирования!
У него она давно валялась без дела. Я оказался прав про «одноразовость» сего устройства.
Ура, задача программирования может быть решена штатным способом, но радиолюбительское «а как же это устроено?» не давало покоя.
Я решил провести реверсинжениринг — это по кошачьему, а по русски — разобраться с протоколом программирования и постараться повторить его подручными средствами.
Вскрытие настоящей карты показало, что там стоит ATMega8, кнопки и индикаторы — ничего сверхестесственного.
Читать прошивку я даже и не пытался, так как она будет закрыта от считывания (всеми «любимыми» фьюзами).
Главное — карта работала и программировала этот ESC 45A.
Вооружившись логическим анализатором, я снял лог обмена карты и регулятора.


Алгоритм установления связи оказался весьма простым:
после подачи питания, через паузу 1,8с карта посылает стартовую последовательность, на которую ESC отвечает (через паузу 0.1 с) текущей конфигурацией своих параметров.


Изучая эти сигналы, удивляло большое число импульсов в ответе — «наверное, кодирование и контрольные суммы — подумал Штирлиц»
Для начала я выделил самый короткий импульс во всем пакете:

он оказался равен 0,8354ms. Причем, такой длительности были как «единичные», так и «нулевые» импульсы.
Предположил, что когда сигнал 0 — передается бит «ноль», когда 1 — передается бит «один». Оцените, какая у меня невероятно оригинальная логика! 🙂
Более внимательное изучение лога показало, что бывают импульсы двойной, тройной и более ширины, но, всегда кратно 0,8354ms.
Начало пакета всегда ноль.
Вот я и решил, что тактовый интервал равен 0,8354ms, и надо считывать значение бита через такой промежуток, пока не будет принят весь пакет из 118 бит.
Никаких синхронизирующих импульсов нет, поэтому сделать так:
от первого перепада на линии из 1 в 0 сделать паузу на половину ширины импульса, считать значение, и далее — через паузу ширины импульса чиать остальное

Читайте также:  Зонт для игрушки своими руками

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

Цифра означает номер параметра (десятый это 0) число цифр — число разрядов, и положение в пакете. Неизменяемые биты так и остаются 0 или 1 всегда.
Пакет данных состоит из 118 бит. Первым всегда передается бит 0, на каждый параметр зарезервировано 10 бит, в конце пакета некая последовательность бит, которая никогда не меняется.
Внутри десяти бит параметра значащие биты идут в начале, младший вперед. Остальные биты не меняются.
Стартовая последовательность является константой, посылается картой через паузу в 1,8 с после включения
000001011111000001011111001000000
передается слева на право.
Мой внутренний «Штирлиц» был приятно удивлен таким простым протоколом, и ,в тоже время, озадачен — зачем резервировать 10(!) бит для параметра,
если у него всего два, максимум четыре бита на значение?
Все можно было уместить в пять байт, а тут 118 бит.
Ну, да ладно — китайским программистам виднее. Возможно, это некий универсальный протокол и в других регуляторах он необходим, а тут как артефакт.
Мне надо только его повторить и эмулировать.

Далее, параметры надо разобрать по байтам и вывести пользователю — для этого используется COM порт, скорость 19200 и терминальная программа типа Putty.
Измененные параметры надо записать обратно в ESC.

Снова вооружаемся логическим анализатором — после передачи пакета ESC банально ждет на приеме, причем ждет бесконечно, до выключения питания.
Жму на карте кнопку «запись» и получаю 151 бит на запись !

Это просто «праздник какой-то»! Для записи каждый параметр теперь содержит уже 12 бит. Зачем? Неиспользуемые биты никогда не меняются!
Странная избыточность информации.
Одна заковырка все-таки всплыла.
Ни как не получалось понять последовательность бит для первого параметра

Долго не понимал логики, стал вспоминать код Грэя, другие подвохи.
Из регулятора параметр 1 читается значением 1,2,3,4,5,6 (в двоичном виде естественно), а писать его надо как 2*(n+2) ещё и вычитать 1 для 16, чтобы получить 1111 в пакете.
В итоге, просто «в лоб» вывел зависимость перекодирования 1,2,3,4,5,6 в то, что надо посылать в ESC.
Остальные параметры передаются без «выкрутасов» простым двоичным кодом, младший вперед.
Ну, и на закуску, сделал установку всех параметров «по умолчанию» Reset, чтобы одной кнопкой вернуть все назад.

Терминалка в среде IDE ARDUINO мне не нравится — в строке ввода набрать символ и жать кнопку отправить, мне это неудобно.
Сплошной листинг putty как-то приятнее.
Да, я кажется ещё не сказал, что делается это все на ARDUIO pro mini. Можно nano использовать — там уже и COM порт с USB будет сразу.
После «расшифровки» протокола, относительно много времени заняла работа над пользовательским интерфейсом — как сделать удобно и красиво ввод и изменение параметров.
Выводится меню и пользователь номером из меню выбирает параметр, затем его значение и выходим снова в главное меню.
Сброс в дефолные значения R.
Запись в ESC происходит только по команде записи W, поэтому перебирать параметры в меню можно сколько угодно.
Мне такой интерфейс нравится 🙂

Совместимость с другими регуляторами не проверял, в виду отсутствия таковых.

В связи с относительной простотой программы, она написана линейно «в лоб» — без процедур, без оптимизации кода и т.п.
Даже в таком виде используется чуть больше половины ОЗУ на переменные, а Flash вообще «копейки».
Одну константу пришлось подбирать экспериментально — #define tImp 820 длительность тактового импульса.
Её значение надо немного уменьшить (т.е. уменьшить задержку) так как код ардуино сам вносит задержку в выполняемые команды (за это его ругают постоянно)
И вместо предполагаемых 835ms поставил 820 — остальное «дотянул» сам код. «На ноге» получились необходимые 835ms.

Название параметров в регуляторе и их значения взял с наклейки на карте.
Схему не рисую — на 10 ногу платы ардуино подать сигнал от регулятора (значек импульса на этикетке регулятора). Не забыть соединить землю.
Сам регулятор питать от штатного аккумулятора, включать переключателем.
Питание на ардуинку «по вкусу» — или от USB или от регулятора, НО ! регулятор дает 6V поэтому дуньку питать только через её вход RAW — на плате Ардуино стабилизатор.
Разумеется, не соединять + от USB и + от регулятора одновременно.
COM порт RX TX подключать через TTL-USB переходник , или взять ардуинку с USB на борту, например Nano.

Читайте также:  Индикатор работы циркуляционного насоса своими руками

Готово!
Имеем программу в коде Arduino, позволяющую настраивать регулятор HobbyKing ESC45A через COM порт.

Все выключено и обесточено.
Соединяем землю Ардуино и регуляора.
Подключаем Ардуино 10 нога к входу регулятора.
Подключаем Ардуино RX TX к USB-COM TTL переходнику, питание +5 на Ардуино берем от него, подключаем его в компьютер.
На определившийся в системе COM порт запускаем программу putty скорость 19200.
Жмем Reset на Ардуино — в программе putty увидим сообщение «Power ON HobbyKing X-CAR ESC», ардуино ждет включение регулятора.
Подключаем аккумулятор к ESC и включаем его питание (двигатель при этом можно не отключать, он не мешает).
Регулятор не будет пищать обмотками как при нормальном включении, так как наша программа переведет его в режим настройки.
На Ардуинке загорится и потухнет синий LED — индикатор обмена с ESC.
Через пару секунд в терминал будет выведено текущее состояние настроек регулятора, примерно так:

нажав кнопку oт 1 до 0, попадаем в следующий уровень меню — изменение параметра.

Нажатие Enter или любой недопустимой кнопки выводит меню заново.
Напрмер, выбираем 1. Нажимать Enter не нужно. Если ваша терминальная программа посылает CRCF автоматом — это надо отключить.(в терминалке IDE Ардуино, например)

символ ==> показывает текущее значение параметра. Признак [def] подсказывает значение, которое было по умолчанию.

Выбрав число 1. 6 мы изменим параметр на это значение и вернемся в предыдущее меню.
Если просто нажать Enter или любой другой символ — вернемся в верхнее меню без изменений.

Кнопка R установит все параметры в [def] значения.
Кнопка W запишет текущие настройки в регулятор. На плате Ардуино мигнет синий LED.

Выключаем регулятор.
Выключаем Ардуино.
Подключаем регулятор к штатному PWM порту радиоуправления.

Теперь ESC включится уже с новыми значениями настройки, а у нас останется платка Ардуино, которую можно будет перепрограммировать во что-нибудь ещё.

Источник

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

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

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

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

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

Питание

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

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

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

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

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

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

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

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

UART интерфейс

Прочее

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

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

Ключи нужно выбирать в зависимости от максимального тока и напряжения питания двигателя (выбору ключей и драйверов будет посвящена отдельная статья). На схеме обозначены 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 В. При необходимости можно выполнить калибровку входного сигнала, что позволяет использовать раные диапазоны управляющих напряжений. По умолчанию настроен демпфер задающего сигнала. При резком скачке задающего сигнала обороты двигателя будут расти плавно. Демпфер имеет несимметричную характеристику. Сброс оборотов происходит без задержки. При необходимости демпфер можно настроить или вовсе отключить.

Запуск

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

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

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

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

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

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

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

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

команда «?» выводит в терминал список всех доступных настроек и их значение. Например: Изменить нужную настройку можно командой следующего формата:

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

Источник

Оцените статью