Оптимизация алгоритма обработки ДПКВ
Moderator: STC
-
- LQFP144 - On Top Of The Game
- Posts: 1664
- Joined: Fri Jul 01, 2011 2:10 pm
- Location: г Уфа
Re: Оптимизация алгоритма обработки ДПКВ
все ,STC , я все понял . момент универсальности я не учел . да кучу кода вылетит если оставить только 60-2.
на мпсз зш только 60-2 , или только дх , две разные версии . настроек у него вообще нету чтоль .. я как увидел его менеджер .. смешно аш стало ... какой то калькулятор детский ) даже ошибки не показывает , правда вроде реагирует на ошибку по дад как установка 16 расхода. а кроме дад у него больше и нет ничего .
ацп пользует только дад и напряжение борт сети. дпкв только под 60-2 . наверняка выкидывание данных в ком порт по запросу . ну вот и скорость от сюда ...
как встанет температура , ошибки , и прочеее то и скорость упадет ...
все у меня более вопрос нету ...
на мпсз зш только 60-2 , или только дх , две разные версии . настроек у него вообще нету чтоль .. я как увидел его менеджер .. смешно аш стало ... какой то калькулятор детский ) даже ошибки не показывает , правда вроде реагирует на ошибку по дад как установка 16 расхода. а кроме дад у него больше и нет ничего .
ацп пользует только дад и напряжение борт сети. дпкв только под 60-2 . наверняка выкидывание данных в ком порт по запросу . ну вот и скорость от сюда ...
как встанет температура , ошибки , и прочеее то и скорость упадет ...
все у меня более вопрос нету ...
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
ВАЗ21310 1.7i Я7.2 2001г
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Оптимизация алгоритма обработки ДПКВ
Просто проверять - мало. Нужно опираться на куждый зуб в расчетах. Таймер нужно использовать только для отсчета моментов времени, которые приходятся на интервал между зубъями. Если использовать только таймер и программировать его на срабатывание только каждые пол оборота или оборот, то из-за ускорений коленвала (особенно на низких оборотах) к моменту срабатывания таймера его значение будет уже неактуальным (большая ошибка). Неужели это непонятно? Другими словами, такая реализация ничем не лучше обычного ДХ с четырями шторками...У меня прерывается каждый зуб, но проверяется один раз за оборот. Работает. На слово поверите? Тогда проверьте.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
-
- LQFP112 - Up with the play
- Posts: 149
- Joined: Tue Mar 29, 2011 12:51 pm
Re: Оптимизация алгоритма обработки ДПКВ
Прерывание на каждый зуб не нужно, их (зубья) нужно просто подсчитывать счётчиком. Обычный таймер в режиме счёта внешних событий. Остаток - по времени, как обычно.
Кстати, у меня работает не по градусам, а по времени.
Кстати, у меня работает не по градусам, а по времени.
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Оптимизация алгоритма обработки ДПКВ
В этом случае нужно делать перепланировку времени выполнения основного цикла (выделять кванты времени для фоновых операций, но практически непрерывно проверять счетчик событий). У тебя основной цикл загружен? И вообще, что умеет делать прошивка кроме обработки ДПКВ.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
-
- LQFP112 - Up with the play
- Posts: 149
- Joined: Tue Mar 29, 2011 12:51 pm
Re: Оптимизация алгоритма обработки ДПКВ
В качестве счётчика событий - таймер, прерывание аппаратное, ничего дополнительно проверять не нужно.STC wrote:практически непрерывно проверять счетчик событий
Примерно, как на рисунке.
Значение Compare нужно менять на новое при каждом прерывании, каждый оборот обнулять счётчик таймера.
Понадобится три прерывания для проверки синхронизации, два - для УОЗ. Вроде всё.
Отсчёт остатка времени вести другим таймером - это очевидно.
Last edited by AleksandR K. on Tue Jan 17, 2012 2:08 pm, edited 1 time in total.
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Оптимизация алгоритма обработки ДПКВ
Если я правильно понял, то в твоем алгоритме используется большее кол-во таймеров.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
-
- LQFP112 - Up with the play
- Posts: 149
- Joined: Tue Mar 29, 2011 12:51 pm
Re: Оптимизация алгоритма обработки ДПКВ
Это не мой алгоритм, это пока идея. Я же писал:"Если есть лишний таймер". У меня его нет.
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Оптимизация алгоритма обработки ДПКВ
Ладно. Для тех кто хочет повысить планку максимальных оборотов, я вижу как минимум 2 варианта.
1. Заменить 32-х битное деление на оптимизированное 32*32 умножение на обратное число (reciprocal). Операция умножения займет не более 95 циклов (5.5 мкс).
Но тогда для каждого шкива нужно использовать разные константы (раздутие и усложнение кода чтобы сохранить универсальность). Если отказаться от универсальности, то данное решение будет очень эффективным, а если его обединить с вариантом N 2, то эффективность будет еще выше.
2. На высоких оборотах (например выше 6000) заменять 32-х битное деление на 16-ти битное (выполняется быстрее). Какая будет экономия я не проверял.
Этот вариант проще и сохраняет универсальность, но менее эффективен.
p.s. Примеров умножения 32*32=64 для AVR в интернете полно.
Еще хочу обратить внимание на то, что планка максимальных оборотов в SECU-3 ограничена не кол-вом цилиндров, а временем выполнения прерывания.
1. Заменить 32-х битное деление на оптимизированное 32*32 умножение на обратное число (reciprocal). Операция умножения займет не более 95 циклов (5.5 мкс).
Но тогда для каждого шкива нужно использовать разные константы (раздутие и усложнение кода чтобы сохранить универсальность). Если отказаться от универсальности, то данное решение будет очень эффективным, а если его обединить с вариантом N 2, то эффективность будет еще выше.
2. На высоких оборотах (например выше 6000) заменять 32-х битное деление на 16-ти битное (выполняется быстрее). Какая будет экономия я не проверял.
Этот вариант проще и сохраняет универсальность, но менее эффективен.
p.s. Примеров умножения 32*32=64 для AVR в интернете полно.
Еще хочу обратить внимание на то, что планка максимальных оборотов в SECU-3 ограничена не кол-вом цилиндров, а временем выполнения прерывания.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
- STC
- LQFP144 - On Top Of The Game
- Posts: 2420
- Joined: Fri Oct 22, 2010 10:47 pm
- Location: Ukraine, Kiev
- Contact:
Re: Оптимизация алгоритма обработки ДПКВ
Провел оптимизацию алгоритма по варианту 2. Код:
Код очень простой. Если ожидается что делимое будет не более 16-ти бит, то используем 16-ти битное деление, которое в несколько раз быстрее 32-х битного. Примерно после 2000 мин-1 происходит переход на использование 16-ти битного деления.
Результат, как и ожидолось хороший. Время выполнения прерывания снизилось на 35...40%.
Таким образом планка оборотов поднялась как минимум до 16000 мин-1. Проверил на осциллографе с эмулятором ДПКВ, из которого не удалось выжать больше чем 16000 мин-1.
12000 мин-1, которые указаны на главной странице сайта, я менять не буду, так как на это нет разумных причин.
Code: Select all
if (ckps.period_curr < 128)
OCR1A = GetICR() + (diff * (ckps.period_curr)) / ANGLE_MAGNITUDE(CKPS_DEGREES_PER_COG);
else
OCR1A = GetICR() + ((uint32_t)diff * (ckps.period_curr)) / ANGLE_MAGNITUDE(CKPS_DEGREES_PER_COG);
Результат, как и ожидолось хороший. Время выполнения прерывания снизилось на 35...40%.
Таким образом планка оборотов поднялась как минимум до 16000 мин-1. Проверил на осциллографе с эмулятором ДПКВ, из которого не удалось выжать больше чем 16000 мин-1.
12000 мин-1, которые указаны на главной странице сайта, я менять не буду, так как на это нет разумных причин.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
-
- LQFP144 - On Top Of The Game
- Posts: 1664
- Joined: Fri Jul 01, 2011 2:10 pm
- Location: г Уфа
Re: Оптимизация алгоритма обработки ДПКВ
Спасибо ! проверим ) если отсечку с моника сниму ))))
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
ВАЗ21310 1.7i Я7.2 2001г