Обсуждение и перепрошивка регуляторов (ESC) прошивками SimonK/BLHeli

Musgravehill

Все, что вы делаете - на свой страх и риск. Кстати, 495Гц PWM…

  • После прошивки к ESC подключить слабый аккумулятор через предохранитель. Иначе брызги жидкой меди попадут в лицо.
  • Во время прошивки никакие провода ESC не должны замыкаться (3 провода к мотору, 2 питания - болтаются в воздухе, на них есть потенциал).
  • Выбор прошивки целиком определяется типом транзисторов, которые стоят в регуляторе. А НЕ НАЗВАНИЕМ РЕГУЛЯТОРА ИЗ СПИСКА . Под одним и тем же названием выпускаются регуляторы с разной схемотехникой. Если прошивка не предназначена для данной схемы, вас ждет выгорание ключей.
    Старые ESC Mystery 20A имеют P и N fets (4407 +4420 или 4407 + IRF P033A). P-FET управляются тремя NPN-транзисторами, а N-FET управляются напрямую. github.com/sim-/tgy - тут подробнее написано.
    Помимо этого варианта бывает множество других – использование только N-FET, с инвертирование и т.д. Всегда читаем ***.bin файл, который лежит рядом с ***.hex прошивкой.
    Общее представление о процессе даст тема www.rcgroups.com/forums/showthread.php?t=1513678
    -----------------------------

Итак, прошиваем Mystery 20A ESC P и N fets (4407 +4420 или 4407 + IRF P033A). P-FET управляются тремя NPN-транзисторами, а N-FET напрямую. Новые партии могут иметь только N-fet. Им нужна другая прошивка! Какая именно - не знаю.

  1. Вскрываем регулятор.

Подпаиваем проводки. 0v = GND, +5V. – сюда паяем 2 проводка, через которые подаем +5В и землю. Естественно, у программатора и контроллера должна быть общая земля. Сам ESC НЕ подключаем к аккумулятору! Питание +5В, которое идет по проводку, достаточно для прошивки. Не забываем про MISO MOSI RST SCK =)

  1. Я использую AVRDUDE, в качестве программатора – Ардуино Bit-Bang. www.freeduino.ru/arduino/isp.html

  2. github.com/sim-/tgy/downloads - качаем свежий архив с прошивками, берем из него bs.hex и bs.bin, бросаем в папку, где у нас AVRDUDE.

  3. В консоли пишем cd disc:/path/to/avrdude В этой папке лежит наша прошивка bs.hex – именно она нужна для нашего контроллера. С другими вариантами он сгорает.

  4. В консоли пишем: avrdude -C avrdude.conf -p m8 -c diecimila -P ft0 -U flash:r:mys20.hex:i
    Так мы скачиваем оригинальную прошивку в новый файл mys20.hex – вдруг пригодится.

В консоли пишем: avrdude -C avrdude.conf -p m8 -c diecimila -P ft0 -U lfuse:r:loworig.hex:h -U hfuse:r:highorig.hex:h так мы скачиваем оригинальные фьюзы в loworig.hex и highorig.hex – вдруг пригодится.
Если у вас не Бит_бэнг программатор на базе Ардуино, то директивы «avrdude.conf -p m8 -c diecimila -P ft0» у вас будет выглядеть иначе.

  1. Заливаем новую прошивку bs.hex (файлы bs.hex и bs.bin) лежат в папке с AVRDUDE.

avrdude -C avrdude.conf -p m8 -c diecimila -P ft0 -U flash:w:bs.hex

 c:\usr\avrdude>avrdude -C avrdude.conf -p m8 -c diecimila -P ft0 -U flash:w:bs.hex
avrdude: BitBang OK
avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
avrdude: drain OK

 ft245r:  bitclk 230400 -> ft baud 115200
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9307
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed

         To disable this feature, specify the -D option.
avrdude: erasing chip
 ft245r:  bitclk 230400 -> ft baud 115200
avrdude: reading input file "bs.hex"
avrdude: input file bs.hex auto detected as Intel Hex
avrdude: writing flash (1730 bytes):

Writing | ################################################## | 100% 1.43s



avrdude: 1730 bytes of flash written
avrdude: verifying flash memory against bs.hex:
avrdude: load data flash data from input file bs.hex:
avrdude: input file bs.hex auto detected as Intel Hex
avrdude: input file bs.hex contains 1730 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.43s



avrdude: verifying ...
avrdude: 1730 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you. 
  1. Теперь фьюзы, рекомендованные в bs.bin для нашего контроллера с внешним кварцем.

avrdude -C avrdude.conf -p m8 -c diecimila -P ft0 -U lfuse:w:0x3f:m -U hfuse:w:0xd7:m

 c:\usr\avrdude>avrdude -C avrdude.conf -p m8 -c diecimila -P ft0 -U lfuse:w:0x3f
:m -U hfuse:w:0xd7:m
avrdude: BitBang OK
avrdude: pin assign miso 3 sck 5 mosi 6 reset 7
avrdude: drain OK

 ft245r:  bitclk 230400 -> ft baud 115200
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9307
avrdude: reading input file "0x3f"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.05s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0x3f:
avrdude: load data lfuse data from input file 0x3f:
avrdude: input file 0x3f contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.02s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0xd7"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.05s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xd7:
avrdude: load data hfuse data from input file 0xd7:
avrdude: input file 0xd7 contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.02s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified 
  1. Готово! Отпаиваем проводки, подключаем мотор и слабый аккумулятор через предохранитель. Все работает.

  2. Если возникают проблемы, то заливаем эту же прошивку bs.hex, а фьюзы ставим родные: avrdude -C avrdude.conf -p m8 -c diecimila -P ft0 -U lfuse:w:0x2e:m -U hfuse:w:0xcf:m

  3. В любом случаем, фьюзы указывают на внешний кварцевый генератор 16МГц. Его наличие на плате – огромный плюс. Некоторые модели регуляторов не имеют его и используют внутренний таймер для тактирования, у них от этого плавает частота.

  4. Я сравнивал отклик оригинального регулятора и прошитого. Небо и земля. Прошитый регулятор мгновенно реагирует на изменение задания, а непрошитый сглаживает, не дает быстро “играть” оборотами.

Мы получили:
16MHz operation on most boards
16-bit output PWM with full clock rate resolution (~18kHz PWM with a POWER_RANGE of 800 steps) было 80-100 шагов
24-bit timing and PPM pulse tracking at full clock rate resolution
ICP-based pulse time recording (on supported hardware) for zero throttle jitter
Immediate PPM input to PWM output for best possible multicopter response (eg: ideal for tricopters, quadcopters, etc., but NOT where where slow-start or really any significant current limiting is needed!)
Accepts 495Hz PPM update rates (minimum ~5microseconds PPM low time)
Optimized interrupt code (very low minimum PWM and reduced full throttle bump, and should work beyond 120,000 RPM
Configurable board pin assignments by include file
Improved startup (though heavy hard drives are still a bit dodgy - suggestions/patches welcome!)
Forward and reverse commutation supported, including RC-car style reverse-neutral-forward PPM ranges, with optional braking

Musgravehill

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

zvuk_Irkutsk

Круто!
У меня есть читире Mystery 20A, стоят на коптере с СС, еще шесть едут. Но прошивать я наверное не решусь их, хотя результаты конечно впечатляют!
А что если просто со стандартной прошивкой перевести их на 16кHz частоты ШИМ, прошивка вроде бы позволяет? Будет лучше? Я как-то не пробовал, опасался…Надо попробовать.

Musgravehill
zvuk_Irkutsk:

А что если просто со стандартной прошивкой перевести их на 16кHz частоты ШИМ, прошивка вроде бы позволяет?

Я сразу перевел с пульта. Трели пришлось долго слушать. У меня на 8кГц ШИМ DT750 иногда барахлил (сказать уверенно, что именно 8кгц ШИМ так влияло - не могу).

В новых Мистери могут быть только N-транзисторы, для них другую прошивку надо - bs_nfet\что-то еще(?)

cylllka
zvuk_Irkutsk:

еще шесть едут.

Вот эти регули за 10баксов с бесплатной доставкой. www.rctimer.com/index.php?gOo=goods_details.dwt&go…

Быстродействие не хуже чем на вышеприведенном видео.
Смотрите на 1:06 быстрое постукивание пальцами

www.youtube.com/watch?v=XTn6YBlQ2PQ

Позволяют даже на КУКе зависать без медленного крена, если выровнять горизонтально и бросить стики. Казалось как буд то с горизонтом плата.

zvuk_Irkutsk
cylllka:

Позволяют даже на КУКе зависать без медленного крена, если выровнять горизонтально и бросить стики.

У меня на КУКе все регули себя так вели, в том числе и те, что вы посоветовали (их есть у меня 😉 ) Вот пощелкивание ключей на Рцтамовских мне совсем не нравится, мистери в этом отношении совсем тихие, и надежнее (ИМХО).

Adekamer

зрительно прошитые лучше реагируют 😃

cylllka
zvuk_Irkutsk:

У меня на КУКе все регули себя так вели, в том числе и те, что вы посоветовали (их есть у меня 😉 ) .

Я не видел ниодного видео на форуме, где бы КУК зависал, на всех видео он куда то сваливается, его подлавливают. Это не упрек, просто действительно не видел. А по поводу все регули - не знаю какие у вас все.Я сравнивал несколько типов регулей на КУКе, у них задержка очень отличается и поведение в воздухе. Особенно хорошо заметно на мелких квадриках. У Регулей с большей задержкой раскачка начиналась при меньшей чувствителньости, за счет запаздывания сигнала и приходилось откручивать чувствительность. РЦ Таймеровские оказались самыми быстрыми. Хотелось бы сравнить конечно с ESC Mystery 20A

zvuk_Irkutsk:

Вот пощелкивание ключей на Рцтамовских мне совсем не нравится, мистери в этом отношении совсем тихие, и надежнее (ИМХО).

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

Adekamer:

зрительно прошитые лучше реагируют 😃

ПРосто обороты выше по этому возможно кажется, что лучше. Я к плате прикладывал телефон с виброй включенной, так моторы тоже “вибрировали”, только не заснял.

З.Ы. Я не говорю что прошивать не стоит! Наоборот, стоит заморочиться!

Gapey

регули с P-канальными ключами впринцепе гадость , ибо нормальных P-канальных ключей (с параметрами как у топовых N-канальных) просто нет в природе … и управляются они через попенгаген …
нужно в какойто теме собирать информацию о регулях на только N-канальных ключах и атмегах (ато в последнее время стали часто попадаться регули с х51 ядром) …
где продаются , как называются , версиярегуля ,внешний вид (фото) , фото самой платы ну и соответственно кним схемы и прошивки …
при наличии схемы (которую впринцепе можно и срисовать с регуля) поправить прошивку под него не составит большого труда …
всвязи с отказом от I2C для управления регулями впользу PWM процесс переделки сильно упростился (ненужно освобождать ноги I2C интерфейса , резать дорожки и паять перемычки ) …
ктомуже после выхода спецрегулей на stm32 , будет возможность использовать регули вкачестве доноров N-канальных транзисторов и их драйверов для самодельных плат …

Musgravehill

simonk

Yes, either bs.inc or bs_nfet.inc for the Mystery boards. Some of the bigger/newer ones are all-nfet but with gate drivers and went back to the original non-inverted pinout, but that small one probably doesn’t have gate drivers or all-nfets and is probably bs.inc. The easiest way to find out is to check while the old firmware is running a motor. Every ESC I’ve seen still PWMs the low side and leaves the high side on for the whole commutation, so you can easily identify the pins with an oscilloscope. The pins that PWM very fast in bursts are the "nfet"s (low side), and the pins that stay on for 1/3rd of the cycle are the "pfet"s (high side). If they stay high when off and just go low for 1/3rd, they’re inverted. Likewise with the low side. I haven’t seen any boards yet that invert both sides (likely because they’d need external pullups to avoid explosions when the MCU is not running ). Anyway, this seems to be the fastest way to get the right pinout and inversion state, and the right sense lines if not the correct order of them.

I’d appreciate it if anybody could think of a way to autodetect the inversion and/or board pinout. A build that could just autodetect the board would be awesome, since the rest of the code is already dynamic enough that it could work without much overhead. There are some pulled-down/pulled-up pins on some boards that can be used as hints, but short of actually shorting the output FETs and checking the MCUCSR for a reset by brownout, I can’t think of a good way of autodetecting the inversion.

www.rcgroups.com/forums/showpost.php?p=19893058&po…

Bluebird

Братцы, а какую прошивку нужно для вот таких регуляторов? Подскажите, пожалуйста 😉 Hobbyking 40A
И вот эти бы - Plush 30A
Первые в дороге, а вот Плюши на Атмеге, могу сделать снимок платы с обоих сторон (завтра выложу).

zis

На github.com появилась новая прошивка с калибровкой газа.

Sir_Alex
Bluebird:

И вот эти бы - Plush 30A

А зачем их прошивать? (у меня такие)… вроде все работает и 400Hz PWM то же.

Bluebird
Sir_Alex:

вроде все работает и 400Hz PWM то же

Прошивают ведь не для ПВМ, прошивают чтобы отклик мотора на управляющее воздействие было минимальным по времени. 😉
У стоковых ПЛюшей из-за фильтра - порядка 127мс задержка.

Dimm168pin
zis:

На github.com появилась новая прошивка с калибровкой газа.

да вроде и была она , эта калибровка, вот только
Halve minimum throttle range with brmi->brne in puls_find_multiplicand. [Simon Kirby] добавлено 13часов назад. чего это дает?.

у меня зашиты мистери 12А p\n fet
прошивал месяца полтора назад

Musgravehill
Bluebird:

Прошивают ведь не для ПВМ, прошивают чтобы отклик мотора на управляющее воздействие было минимальным по времени.
У стоковых ПЛюшей из-за фильтра - порядка 127мс задержка.

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

новая прошивка с калибровкой газа

По-моему, для коптеров отлично подходит вшитая намертво калибровка 1000_2000. Тогда никакие сигналы с мозгов не собьют калибровку.

Musgravehill

Странно, подключил прошитые ESC Mystery к Мегапирату. Они не работают. Совсем. 😃 Измерил PWM на пинах 2,3,5,6 - 240Hz.
В то же время, на Мегапирате работают непрошитые SS18A, туповаты, но мотор крутят.

Подцепил эти же ESC к МультиВии - все отлично запустилось! 490Hz PWM на управляющих пинах. Летает отлично.

Прошитые ESC Mystery также без проблем заводятся напрямую с приемника PWM 50Hz.

HikeR

как только народ не изгаляется, лишь бы не использовать винты с изменяемым шагом ;)

cylllka
HikeR:

как только народ не изгаляется, лишь бы не использовать винты с изменяемым шагом 😉

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

Gurdzhy

Парни, небольшой офф, но раз уж тема про регули… Нужно покупать 18А регуляторы - настраиваюсь на авионикс. Может посоветуете что-то надежнее\быстрее? Боюсь, что прошить что бы то ни было я не смогу - мозги не в той области заточены.)) Хотелось бы максимум перфоманса из коробки. Темы все мониторю, но блин, мнения так разняться…((

Musgravehill
Musgravehill:

Странно, подключил прошитые ESC Mystery к Мегапирату. Они не работают. Совсем

Решено!
Проблема была в том, что регуль не мог инициализироваться от Пирата.
Включил #define INSTANT_PWM DISABLE, на выходе 400Гц PWM/

Для квадрика в Пирате правим motor_quad.pde, задаем 900 для инициализации регуляторов, иначе они сходят с ума.

static void output_motors_disarmed()
{
	if(g.rc_3.control_in > 0){
		// we have pushed up the throttle
		// remove safety
		motor_auto_armed = true;
	}

	// fill the motor_out[] array for HIL use
	for (unsigned char i = 0; i < 8; i++) {
		motor_out[i] = 900; //правка
	}

	// Send commands to motors
	APM_RC.OutputCh(CH_1, 900);//правка
	APM_RC.OutputCh(CH_2, 900);//правка
	APM_RC.OutputCh(CH_3, 900);//правка
	APM_RC.OutputCh(CH_4, 900);//правка

	// InstantPWM
	APM_RC.Force_Out0_Out1();
	APM_RC.Force_Out2_Out3();
}