Контроллер для кордовых электричек

Маркс

Сказ про то "Как вредно быть сильно умным"©

Маркс:

А пока оптимизировал уже написанный код, но ошибку так и не вывил, а без “визуализации” сложно.

полтора месяца ломал голову, что же я такого сломал в программе,
что она отказывается работать, да еще осциллограф не работал.
сегодня подключил осциллограф и увидел, что PWM идет правильный, а мотор крутится “через ж…”.

Оказывается аккумуляторы иногда надо заряжать, хотя бы раз в месяц ))
их у меня целых три и все три оказались посажены до 3В/банка.
И при попытке гувернера увеличить оборотов регулятор просто уходил в отсечку.

у меня просто нет слов (((

а я уже половину программы гувернера переписал в поисках логической ошибки.

поставил на заряд кучку 2S LiPo и пошел пока “курить бамбук”.

Маркс

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

void isr() 
{
  isr_time = micros();
  isr_period = isr_time - isr_prev;
  isr_period_buffer [isr_buffer_count] =   isr_period ;
  isr_prev = isr_time;
  isr_buffer_count++;
  if (isr_buffer_count > 15) isr_buffer_count == 0;
  _isrFlag = true;
}

дрогнула рука и вместо присвоения ноля я влепил оператор сравнения с нолем.
я могу себе позволить делать “много кода” в обработчике прерываний, потому как точно знаю,
что других прерываний ПОКА не будет, но все равно, этот код из обработчика уже вынес ))
да и сделано это было в поисках ошибки, возникавшей по причине посаженных АК

теперь я его вернул к прежнему виду

void isr() 
{
  isr_time = micros();   // запомнил момент прерывания
  _isrFlag = true;          // поднял флаг
}
Маркс

Вычистил все траблы

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

Маркс
VitalikV:

на системе Бургера гувернер встроен в регулятор

с большой долей вероятности вертолетная прошивка, например как в регуляторах YGE/YEP и их клонах.
“перегазовки” могут быть реализованы настроенными заранее, переключаемыми полками гувернера.

а еще поэкспериментировал, на 2/3 газа и выше, никакой задержки не требуется,
стабилизация оборотов в рамках установленной дельты происходит без траблов.
а вот ниже, в таком случае, идет заметное колебание оборотов до стабилизации.
это дело поправимое, можно сделать программное переключение.

VitalikV

Посмотрел видео, показалось, или стоит какое то замедление на подъем оборотов? Очень уж плавно они поднимались. Если убрать эту задержку, как будет работать? Может проблема и на низких оборотах уйдет. Плавная раскрутка нужна только на старте.

Маркс

это только при первоначальном наборе оборотов, сама регулировка будет достаточно быстрой.
в видео корректировка производится (ЕМНИП) 200 раз в секунду на 1 мс длительности сигнала PWM,
т.е. от 1300 до 1800 мс 500 шагов по 5 мс итого примерно 2,5 секунды,

если сделать меньше или убрать совсем, то получится как на видео ниже,
до 4000 стабилизация оборотов получается достаточно долгой.

photos.app.goo.gl/xK2rxZUphStCykX58

надо городить ПИД регулировку, будет о чем подумать,

Маркс

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

на больших оборотах реакция мотора быстрее, поэтому стабилизация происходит тоже быстрее

VitalikV

Ну так все правильно, таймер дает сигнал на 5000 об/мин, но система регулятор-мотор, не успевает выйти на заданные обороты, а таймер уже начинает их регулировать. Поэтому и должна быть задержка. Может имеет смысл, сделать плавающую задержку, меньше обороты больше задержка, больше обороты, задержка меньше.

Маркс

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

Маркс
VitalikV:

таймер дает сигнал на 5000 об/мин

не совсем так,
сейчас при старте программа “заводит” двигатель на минимальных оборотах,
PWM минимального газа + 50 мс, чтобы мотор начал крутится,
иначе гувернер не будет получать прерываний и ничего не сможет измерить.
А дальше программа сравнивает текущие обороты с требуемыми и меняет длительность сигнала PWM ±1.
И делает она это сравнение 7 раз за один оборот.
Завтра попробую уменьшить частоту измерений, сделаю один раз за оборот и посмотрю, что получится.

Маркс

С другой стороны, регулировка оборотов нужна только в полете,
в принципе можно “подключать” гувернер позже, после старта мотора например на 80 процентах газа,
а дальше указываем обороты гувернеру и запускаем его.
И на посадке то же самое, отключаем гувернер и уменьшаем обороты с помощью прямых команд PWM.

VitalikV

Гувернер нам надо включать на любых заданных оборотах, уже после того как мотор вышел на эти обороты. Регулировка оборотов, для первоначально заданных, с шагом в 100 оборотов, нас устроит. При старте, таймер измеряет и выходит на нужные обороты, далее запоминаем импульс и уже относительно него регулируем, причем в низ нам регулировать, в принципе не нужно. Если при пикировании мотор разгрузился в пределах 100 оборотов (как пример), одного шага из заданных, то гувернер игнорирует это.

Куда важнее нам прибавлять на вертикалях, когда не хватает тяги.

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

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

Маркс
VitalikV:

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

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

VitalikV

Таблица, как опорные параметры, тоже самое с гироскопом, сколько добавлять на том или ином угле.

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

И сам регулятор может не понимать более мелкие шаги импульса, т.е. если при добавлении газа он рассчитан на шаг 0,2, то шаг с параметром 0,1, регулятор просто будет игнорировать.

Маркс
VitalikV:

кв мотора и регулятор не могут работать с точностью до одного оборота.

в программе есть дельта, сейчас она 1/64 от требуемых оборотов в обе стороны.
при 6000 оборотах это составит примерно ±90 оборотов.

VitalikV

У нас нет опоры, сейчас мы опираемся на желаемые обороты, а не на то что может держать система. Т.е. это как в шаговом двигателе, на один шаг открыть дроссель мы можем, а на пол шага нет, и если эта дельта попадает в эти пол шага, то система начинает ловить заданные обороты, которые физика не может выполнить.

На 6000, это 90 оборотов, а на 2000, это 31 оборот, это наверное и вызывает их плавание. Системе проще стабилизироваться в большом диапазоне, чем в маленьком.

Маркс

на малых оборотах изменение последних значительно медленнее и система успевает “накрутить” длительность PWM,
а потом ей приходится “крутить” обратно, а если сделать задержку на ожидание результата,
как это сделано в видео, один раз в 10 мс например то “плавает” значительно меньше,
но тогда разгон от минимальных к максимальным становится медленнее.

я сейчас “курю” тему библиотека Гайвер ПИД, вероятно оно в состоянии помочь.
alexgyver.ru/gyverpid/?ysclid=ls9c08i1u3167093356
Надо только найти пару часов, что бы разобраться "с чувством, толком и расстановкой"©

VitalikV

Прочитал про ПИД, но это все равно не особо сильно решает наш вопрос, вернее решает его, но при условии, что есть некая сетка по которой работает наша “дроссельная заслонка”.

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

А вот когда обороты выходят за пределы этого параметра, то уже тогда начинает работать ПИД, принимая решение о том, надо нам открыть/закрыть наш “дроссель” на один, два, три шага, или нет.

Но при всем при этом, мы не можем сместить нашу “дроссельную заслонку” на пол шага, что бы получить точность до одного оборота.

А теперь вводные, в моем примере “дроссель” это не таймер, а регулятор, где таймер всего лишь “педаль газа”. Давить на педаль мы можем до упора, выдавать любой сигнал, но дроссель будет работать только по тем шагам которые в нем есть.

Маркс
VitalikV:

но это все равно не особо сильно решает наш вопрос

на самом деле решает ))
ПИД регулятор предназначен как раз для регулировки чего либо на основании
есть текущее значение, например текущие обороты, измеряет тахометр
есть требуемое значение, нужные обороты, задаются в программе
есть изменяемая воздействие, в нашем случае длительность PWM сигнала на регулятор

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

Сейчас “трабла” состоит в отсутствии коэффициентов компенсации.
т.е. для значительного изменения оборотов надо менять длительность PWM на большую величину,
а при компенсации изменения от нагрузки или просадке АК коэффициент надо уменьшить.
Именно это и будет делать библиотека ПИД регулятора, я с ней постепенно разбираюсь.
Но времени не хватает, вечером могу только часок выкроить.

VitalikV:

что есть некая сетка по которой работает наша “дроссельная заслонка”.

сетка не поможет, в статике она будет одна, в полете другая,
при наборе высоты третья, при просадке батареи четвертая.
слишком сложно.

Оно и сейчас работает, только набор оборотов идет медленно ),
но на самом деле на высоких оборотах реакция вполне адекватная,
а перед взлетом можно пару секунд и подождать ), пока разгонится мотор.

VitalikV

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

Так же остается вопрос, при прохождении угла, сколько оборотов добавлять? Времени на подбор этих оборотов не будет. Мы должны компенсировать не только падение оборотов мотора, но и падение скорости модели.

Маркс

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