Второй раз (после летней поездки) завёл машину и немного погонял масло. Температура за бортом +8 градусов Цельсия. Пришлось чуть добавить топлива в warmup-таблице для cranking.
На всякий случай выкладываю текущий конфиг с машины:
Суть в следующем:
1) ПИД теперь контролирует не текущее положение РХХ, а прибавку к текущему положению. Аналогично сделано в Январе. Это даёт возможность плавно контролировать степень влияния ПИДа, и уменьшать его влияние на переходных режимах дросселя.
2) Фикс добавки воздуха по дросселю при Авто-ПИДе;
3) Целевые обороты для РХХ-ПИДа теперь можно будет задавать в отдельной таблице, не используя коэффициенты обогащения для РХХ (к примеру, РХХ на непрогретую может быть в 4 раза выше, но для целевых оборотов такой коэффициент не подойдёт).
4) Поддержка отдельной таблицы с положением РХХ на пуске (параметр overrideCrankingIacSetting и таблица cltCrankingCorr)
Был выложен PR, связанный с реализацией предвпрыска. Спасибо Андрею @Russian за оперативный merge!
А теперь ещё два новых небольших PR, связанных с доработкой нашего бутлоадера: https://github.com/rusefi/rusefi/pull/523 https://github.com/rusefi/rusefi/pull/524
Фиксят стирание страниц памяти для 2Мб-чипов типа STM32F469. Раньше попытка стереть старшие сектора из 2-го банка памяти приводила к стиранию страниц из 1-го банка! Теперь будет всё ок.
Плюс теперь на Прометее можно прошивать прошивку через наш бутлоадер без отключения проводки - раньше приходилось отключать катушки, чтобы они не были включёнными на период работы бутлоадера и не сгорели.
Фикс датчика скорости, который переставал считать скорость при изменении настроек.
А также алгоритм подсчёта расхода топлива в литрах в час! (альфа-версия)
2) Impl. idlePid RPM dead-zone and upper-limit * Реализация работы "мёртвой зоны" для ПИДа РХХ и верхнего лимита оборотов, при достижении которого ПИД будет плавно переходить в положение manual.
* Почему именно в manual, а не просто отключать ПИД, как в случае с нажатием педали газа?
* Потому что иначе обороты могли бы "зависнуть", если ПИД случайно их поднимет выше лимита и после этого отключится. Это стабилизирует поведение регулятора, а также препятствует провалу оборотов при отпускании педали газа.
3) Fixed baro correction option using the initial MAP pressure * Делаем опцию для барокоррекции по ДАДу! Для тех, у кого нет отдельного датчика атмосферного давления, прошивка может брать значение ДАД при включении зажигания в качестве референсного для барокоррекции. Разумеется, сделана проверка неверно измеренного давления в случае включения зажигания при крутящемся двигателе (если заглох в движении и т.п.)...
4) Impl. primeInjFalloffTemperature * Делаем плавное уменьшение предвпрыска до нуля по мере прогрева двигателя (верхний порог температуры задаётся параметром!).
2) Impl. idlePid RPM dead-zone and upper-limit * Реализация работы "мёртвой зоны" для ПИДа РХХ и верхнего лимита оборотов, при достижении которого ПИД будет плавно переходить в положение manual.
* Почему именно в manual, а не просто отключать ПИД, как в случае с нажатием педали газа?
* Потому что иначе обороты могли бы "зависнуть", если ПИД случайно их поднимет выше лимита и после этого отключится. Это стабилизирует поведение регулятора, а также препятствует провалу оборотов при отпускании педали газа.
3) Fixed baro correction option using the initial MAP pressure * Делаем опцию для барокоррекции по ДАДу! Для тех, у кого нет отдельного датчика атмосферного давления, прошивка может брать значение ДАД при включении зажигания в качестве референсного для барокоррекции. Разумеется, сделана проверка неверно измеренного давления в случае включения зажигания при крутящемся двигателе (если заглох в движении и т.п.)...
4) Impl. primeInjFalloffTemperature * Делаем плавное уменьшение предвпрыска до нуля по мере прогрева двигателя (верхний порог температуры задаётся параметром!).
andreika wrote:
2) Impl. idlePid RPM dead-zone and upper-limit * Реализация работы "мёртвой зоны" для ПИДа РХХ и верхнего лимита оборотов, при достижении которого ПИД будет плавно переходить в положение manual.
* Почему именно в manual, а не просто отключать ПИД, как в случае с нажатием педали газа?
* Потому что иначе обороты могли бы "зависнуть", если ПИД случайно их поднимет выше лимита и после этого отключится. Это стабилизирует поведение регулятора, а также препятствует провалу оборотов при отпускании педали газа.
Я в сомнениях - слишком сложно получается. "сначала настроим автоматический, а потом всё равно настроим ручной, для тонкой настройки автоматического". Как-то мучительно для пользователей и совсем не просто получается, смешиваем яблоки с апельсинами.
andreika wrote:
2) Impl. idlePid RPM dead-zone and upper-limit * Реализация работы "мёртвой зоны" для ПИДа РХХ и верхнего лимита оборотов, при достижении которого ПИД будет плавно переходить в положение manual.
* Почему именно в manual, а не просто отключать ПИД, как в случае с нажатием педали газа?
* Потому что иначе обороты могли бы "зависнуть", если ПИД случайно их поднимет выше лимита и после этого отключится. Это стабилизирует поведение регулятора, а также препятствует провалу оборотов при отпускании педали газа.
Я в сомнениях - слишком сложно получается. "сначала настроим автоматический, а потом всё равно настроим ручной, для тонкой настройки автоматического". Как-то мучительно для пользователей и совсем не просто получается, смешиваем яблоки с апельсинами.
А ты придумал как не вручную настроить автоматический? Что бы он адекватно работал? Не уходя в разнос?
russian wrote:Я в сомнениях - слишком сложно получается. "сначала настроим автоматический, а потом всё равно настроим ручной, для тонкой настройки автоматического". Как-то мучительно для пользователей и совсем не просто получается, смешиваем яблоки с апельсинами.
Я попробую ответить.
Я согласен с тезисом, что в идеале для работы авто-пида мы не должны требовать от юзера настраивать мануал. И даже более того, именно такая "идеальная" реализация нами задумана на будущее. Мы хотим сделать режим обучения регулятора РХХ, в котором он будет сам для себя хранить табличку хороших значений положения РХХ по ДТОЖ (там, где RPM попадал в мёртвую зону целевых оборотов), и регулятор будет сам её обновлять и сам её использовать для своих нужд.
Т.е. впоследствии табличку мануал мы для автопида уже не будем использовать, и вместо неё напишем более правильный и умный код.
Но.
Тот алгоритм, который несомненно станет для юзеров самым простым и удобным вариантом (где не нужно настраивать мануал для авто-пида), при этом является довольно сложным для нас в плане реализации. И именно поэтому мы хотели вначале сделать промежуточный вариант, где положение РХХ в переходных режимах берётся из ручной таблицы, чтобы на его основе и по результатам его работы написать тот более сложный вариант. Тем более, что этот промежуточный вариант никому не мешает, поскольку завязан на новую переменную (idlePidRpmUpperLimit). Кстати, лучше всего сделать idlePidRpmUpperLimit относительным (по отношению к целевым оборотам), а не абсолютным. Я это уже подправил в PR.
russian wrote:Я в сомнениях - слишком сложно получается. "сначала настроим автоматический, а потом всё равно настроим ручной, для тонкой настройки автоматического". Как-то мучительно для пользователей и совсем не просто получается, смешиваем яблоки с апельсинами.
Я попробую ответить.
Я согласен с тезисом, что в идеале для работы авто-пида мы не должны требовать от юзера настраивать мануал. И даже более того, именно такая "идеальная" реализация нами задумана на будущее. Мы хотим сделать режим обучения регулятора РХХ, в котором он будет сам для себя хранить табличку хороших значений положения РХХ по ДТОЖ (там, где RPM попадал в мёртвую зону целевых оборотов), и регулятор будет сам её обновлять и сам её использовать для своих нужд.
Т.е. впоследствии табличку мануал мы для автопида уже не будем использовать, и вместо неё напишем более правильный и умный код.
Но.
Тот алгоритм, который несомненно станет для юзеров самым простым и удобным вариантом (где не нужно настраивать мануал для авто-пида), при этом является довольно сложным для нас в плане реализации. И именно поэтому мы хотели вначале сделать промежуточный вариант, где положение РХХ в переходных режимах берётся из ручной таблицы, чтобы на его основе и по результатам его работы написать тот более сложный вариант. Тем более, что этот промежуточный вариант никому не мешает, поскольку завязан на новую переменную (idlePidRpmUpperLimit). Кстати, лучше всего сделать idlePidRpmUpperLimit относительным (по отношению к целевым оборотам), а не абсолютным. Я это уже подправил в PR.
Да, мы это сегодня обсудили и мы считаем что стоит попробовать сделать в начале такую реализацию, а затем уже переходить к усложнению, тем более что наш многоуважаемый @russian любит только маленькие и вкусные PR, а большие и очень вкусные он любит не меньше, но они у него не усваиваются за раз и приходится растягивать удовольствие, тем самым откладывая попытку попробовать новые вкусненькие вещи)
Пришло время заняться последней непротестированной частью платы Прометей: контроллер широкополосного лямбда-зонда.
Схема была заимствована из разработок проекта rusEFI, но, как оказалось, содержала несколько ошибок. Также требовалось написать код управления контроллером. Спасибо @@ и @@ за помощь и консультации!
На данный момент, после исправлений ошибок схемы, можно сказать, что контроллер более-менее работает!
Затем идёт предварительный разогрев с контролем скорости и мониторинг ошибок, и затем включается ПИД-регулятор, контролирующий ШИМ. При этом сигнал UA преобразуется в значение AFR и выдаётся в прошивку.
Также сделан режим калибровки, доступный с Консоли по команде, с запоминанием значений в NVRAM.
Что осталось:
- подобрать значения параметров для ПИДа получше;
- вынести часть параметров в настройки Тюнерстудии;
- дорабатывать, улучшать...
Теперь пару слов о том, как пришлось доработать блок.
Для начала нужно было исправить ошибку в схеме (ревизия платы 0.01):
cj125_fix.jpg (59.23 KiB) Viewed 39040 times
Т.е. нужно изолировать R13 от земли и соединить с C7 перемычкой:
cj125_fix2.jpg (241.08 KiB) Viewed 39040 times
Также нужно поставить джампер для подключения сигнала лямбды (зелёный на фото).
И ещё нужно было заменить резистор R5 на нулевой резистор (перемычка) и выпаять конденсатор C6.
Наконец, я поставил более мощный транзистор для нагрева лямбды (стоял VND5, поставил VND14) и уменьшил резистор в затворе (R3) до 220 Ом.
Продолжаем. Подпаиваем проводку для подключения ШДК:
cj125_wiring.jpg (147.45 KiB) Viewed 39040 times
Чтобы всё сделать красиво, нужен специальный разъём для подключения ШДК:
cj125_connector.jpg (114.39 KiB) Viewed 39040 times
На фото видны номера деталей.
Чтобы всё правильно соединить, используем вот такую "шпаргалку":
cj125_conn_wiring.jpg (58.04 KiB) Viewed 38882 times
В итоге получаем вот что:
cj125_ready.jpg (178.89 KiB) Viewed 39040 times
На фото видны два толстых провода, которые также обязательно нужно подпаять и подключить к питанию через реле от зажигания. Иначе можно "поджарить" дорожки на плате, ведь для нагрева лямбда потребляет немалый ток.
Настройки для Тюнерстудии такие:
cj125_settings.PNG (56.86 KiB) Viewed 39040 times
Обязательно нужно отключить пины со вкладки EGO, чтобы не было конфликтов.
И отключить сам старый разъём для управления внешним контроллером или УДК - теперь нужно использовать только новый разъём.
#if 0
// Change amplification if AFR gets lean/rich for better accuracy
cjSetMode(lambda > 1.0f ? CJ125_MODE_NORMAL_17 : CJ125_MODE_NORMAL_8);
#endif
Я не успел протестировать это, и не могу гарантировать работу. Но, по идее, работать должно. Это может немного повысить точность.
Разве что не уверен насчёт потоковой синхронизации непосредственно в момент изменения усиления - vUa может не успеть поменяться.
Видно, что коэффициенты ПИДа ещё далеки от совершенства, но сходимость есть:
cj125_log.PNG (13.21 KiB) Viewed 39022 times
(Белый - нагреватель, жёлтый - сигнал UA, красный - сигнал UR, сходящийся к калибровочному значению).
Можно попробовать включать ПИД немного пораньше, чтобы не было провала при переходе от преднагрева к ПИДу.
В целом, UR меняется довольно плавно, и не сильно зависит от нажатия на педаль газа на ХХ (видно незначительное изменение EGT в правой части графика)...
вот это все долгожданная крутота!
интересно, как лучше поступить с франкенштейном - проводочками тянуть SPI к кастомной платке с cj125 (какой длины могут быть проводочки?)
или пробовать переносить в отдельную плату blue pill (stm32f103c8)? хотя тут наверное всё очень хорошо интгерировано и fpu используется...
и какие недоргие датчики сейчас бывают в продаже под это дело? и какие тут меры предосторожности соблюдать, чтоб не поломать их (в даташите к датчику, например, написано, не включать на свежем воздухе)
пробовать переносить в отдельную плату blue pill (stm32f103c8)? хотя тут наверное всё очень хорошо интгерировано и fpu используется...
без FPU тут можно выжить. теоретически надо мелкую платку сделать так, чтоб она хорошо одевалась на "стандартную" stm32f103c8 - только вопрос, насколько они стандартные и будет ли у нас время Makefile для этого сделать и так далее. Идея интересная, но где взять программистов?
платки вроде бы как раз стандартные. и даже кан в них есть, и даже вроде как не один.
я вот пытаюсь понять, насколько быстрым должен быть сигнал о2 и насколько это критично? (кто-то предлагал r2r лестницу ЦАП, управляемую непосредствено записью в регистр восьмибитного чипа для ускорения выдачи результата. Maxi на отдельнные решения ругался, дескать они жутко тормозные (по-моему, в том числе про cj125 говорил, что у него какие-то подобные проблемы есть). так какие задержки считать приемлемыми - доли мс, единицы мс, десятки мс?