Page 2 of 5

Re: Оптимизация алгоритма обработки ДПКВ

Posted: Mon Jan 16, 2012 6:59 pm
by Stranger21
все ,STC , я все понял . момент универсальности я не учел . да кучу кода вылетит если оставить только 60-2.
на мпсз зш только 60-2 , или только дх , две разные версии . настроек у него вообще нету чтоль .. я как увидел его менеджер .. смешно аш стало ...:) какой то калькулятор детский ) даже ошибки не показывает , правда вроде реагирует на ошибку по дад как установка 16 расхода. а кроме дад у него больше и нет ничего .
ацп пользует только дад и напряжение борт сети. дпкв только под 60-2 . наверняка выкидывание данных в ком порт по запросу . ну вот и скорость от сюда ...
как встанет температура , ошибки , и прочеее то и скорость упадет ...

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

Re: Оптимизация алгоритма обработки ДПКВ

Posted: Tue Jan 17, 2012 12:54 pm
by STC
У меня прерывается каждый зуб, но проверяется один раз за оборот. Работает. На слово поверите? Тогда проверьте.
Просто проверять - мало. Нужно опираться на куждый зуб в расчетах. Таймер нужно использовать только для отсчета моментов времени, которые приходятся на интервал между зубъями. Если использовать только таймер и программировать его на срабатывание только каждые пол оборота или оборот, то из-за ускорений коленвала (особенно на низких оборотах) к моменту срабатывания таймера его значение будет уже неактуальным (большая ошибка). Неужели это непонятно? Другими словами, такая реализация ничем не лучше обычного ДХ с четырями шторками...

Re: Оптимизация алгоритма обработки ДПКВ

Posted: Tue Jan 17, 2012 1:25 pm
by AleksandR K.
Прерывание на каждый зуб не нужно, их (зубья) нужно просто подсчитывать счётчиком. Обычный таймер в режиме счёта внешних событий. Остаток - по времени, как обычно.

Кстати, у меня работает не по градусам, а по времени.

Re: Оптимизация алгоритма обработки ДПКВ

Posted: Tue Jan 17, 2012 1:35 pm
by STC
В этом случае нужно делать перепланировку времени выполнения основного цикла (выделять кванты времени для фоновых операций, но практически непрерывно проверять счетчик событий). У тебя основной цикл загружен? И вообще, что умеет делать прошивка кроме обработки ДПКВ.

Re: Оптимизация алгоритма обработки ДПКВ

Posted: Tue Jan 17, 2012 2:01 pm
by AleksandR K.
STC wrote:практически непрерывно проверять счетчик событий
В качестве счётчика событий - таймер, прерывание аппаратное, ничего дополнительно проверять не нужно.
Примерно, как на рисунке.
Значение Compare нужно менять на новое при каждом прерывании, каждый оборот обнулять счётчик таймера.
Понадобится три прерывания для проверки синхронизации, два - для УОЗ. Вроде всё.
Отсчёт остатка времени вести другим таймером - это очевидно.

Re: Оптимизация алгоритма обработки ДПКВ

Posted: Tue Jan 17, 2012 2:05 pm
by STC
Если я правильно понял, то в твоем алгоритме используется большее кол-во таймеров.

Re: Оптимизация алгоритма обработки ДПКВ

Posted: Tue Jan 17, 2012 2:10 pm
by AleksandR K.
Это не мой алгоритм, это пока идея. Я же писал:"Если есть лишний таймер". У меня его нет.

Re: Оптимизация алгоритма обработки ДПКВ

Posted: Tue Jan 17, 2012 2:41 pm
by STC
Ладно. Для тех кто хочет повысить планку максимальных оборотов, я вижу как минимум 2 варианта.
1. Заменить 32-х битное деление на оптимизированное 32*32 умножение на обратное число (reciprocal). Операция умножения займет не более 95 циклов (5.5 мкс).
Но тогда для каждого шкива нужно использовать разные константы (раздутие и усложнение кода чтобы сохранить универсальность). Если отказаться от универсальности, то данное решение будет очень эффективным, а если его обединить с вариантом N 2, то эффективность будет еще выше.
2. На высоких оборотах (например выше 6000) заменять 32-х битное деление на 16-ти битное (выполняется быстрее). Какая будет экономия я не проверял.
Этот вариант проще и сохраняет универсальность, но менее эффективен.

p.s. Примеров умножения 32*32=64 для AVR в интернете полно.
Еще хочу обратить внимание на то, что планка максимальных оборотов в SECU-3 ограничена не кол-вом цилиндров, а временем выполнения прерывания.

Re: Оптимизация алгоритма обработки ДПКВ

Posted: Tue Jan 17, 2012 11:05 pm
by STC
Провел оптимизацию алгоритма по варианту 2. Код:

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);
Код очень простой. Если ожидается что делимое будет не более 16-ти бит, то используем 16-ти битное деление, которое в несколько раз быстрее 32-х битного. Примерно после 2000 мин-1 происходит переход на использование 16-ти битного деления.

Результат, как и ожидолось хороший. Время выполнения прерывания снизилось на 35...40%.
Таким образом планка оборотов поднялась как минимум до 16000 мин-1. Проверил на осциллографе с эмулятором ДПКВ, из которого не удалось выжать больше чем 16000 мин-1.

12000 мин-1, которые указаны на главной странице сайта, я менять не буду, так как на это нет разумных причин.

Re: Оптимизация алгоритма обработки ДПКВ

Posted: Wed Jan 18, 2012 4:40 am
by Stranger21
Спасибо ! проверим ) если отсечку с моника сниму ))))