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

Обсуждение прошивок SECU-3. Discussion of SECU-3 firmware.

Moderator: STC

User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

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

Post by STC »

(Optimization of CKP sensor processing)
Посвящаю эту тему вопросам оптимизации существующего алгоритма обработки датчика положения коленвала (ДПКВ). Смотреть файл ckps.c

Первая часть алгоритма, которая требует оптимизации это 32-х битное деление, добавляющее к времени обработки прерывания 25...40мкс.
Тут viewtopic.php?f=52&t=1238&start=50 участник по имени teuer предложил замену:
- OCR1A = GetICR() + ((uint32_t)diff * (ckps.period_curr)) / ANGLE_MAGNITUDE(CKPS_DEGREES_PER_COG);
+ OCR1A = GetICR() + (((((uint32_t)diff * (ckps.period_curr))>>8) * 0x15556)>>16);

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

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

Код программы:

Code: Select all

#include <stdio.h>
#include <stdint.h>
#include <string.h>

int main(void)
{
  uint16_t value_1;
  uint16_t value_2;
  uint16_t ICR = 1024;
  uint16_t p_c = 5076;
  uint16_t diff = 8234;

  #define ERR_MAX 256
  uint32_t errors[ERR_MAX+2];
  memset(errors, 0, sizeof(int)*(ERR_MAX+2));
  int i,j;
  uint32_t max_error = 0;

  //collect statistics
  for(i = 0; i < 65536; ++i)
  {
    for(j = 0; j < 65536; ++j)
    {
      diff = i, p_c = j;
      //-------------------------------------------------------------------
      value_1 = ICR + ((uint32_t)diff * p_c) / (32*6);
      value_2 = ICR + (((((uint32_t)diff * p_c)>>8) * 0x15556)>>16);
      //-------------------------------------------------------------------
      if (value_1 != value_2)
      {
        uint32_t error = abs((int32_t)value_1 - (int32_t)value_2);
        if (error > max_error)
          max_error = error;
//      printf("%u ", (int)error);
        if (error > ERR_MAX)
          error = ERR_MAX;
        errors[error]++;
      }
    }
  }

  //print statistics
  printf("\nerrors flow:\n");
  for(i = 1; i < ERR_MAX+1; ++i)
    printf("%u ", (int)errors[i]);
  printf("\n");
  printf("max. detected error = %u\n", max_error);
}
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
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

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

Post by STC »

Гистограмма(кол-во ошибок по каждому значению 1...256):
164768491 105157889 96905817 90715386 85792513 81659650 78126774 75024283 72274131 69785648 67523982 65452182 63536215 61757296 60094588 58534174 57072967 55671809 54372150 53113228 51931101 50785752 49704339 48663025 47660204 46693242 45771985 44876310 44012511 43178561 42370167 41589545 40827818 40089519 39374322 38677638 38005707 37340411 36701840 36070150 35462935 34863338 34282677 33707001 33157092 32606956 32071800 31551957 31042920 30535815 30047713 29563833 29092228 28625193 28168400 27719494 27279178 26849781 26424610 26003818 25591971 25188219 24788888 24398299 24011688 23633494 23251348 22886678 22527324 22165386 21812296 21461042 21118614 20781498 20444382 20111515 19788047 19468840 19148376 18832535 18526652 18221044 17912932 17616790 17322637 17031555 16736169 16460108 16176094 15890216 15621607 15347131 15073375 14810001 14545908 14281908 14025716 13769946 13511037 13265369 13015760 12766866 12526906 12282928 12044974 11809333 11574484 11338162 11111639 10880459 10657335 10433017 10208859 9991455 9769825 9554863 9341010 9125370 8919039 8706456 8500873 8294200 8089341 7890240 7684008 7489233 7291155 7091457 6902178 6704465 6518286 6321063 6138401 5948442 5763240 5578111 5394679 5214874 5031587 4855244 4673412 4500042 4323998 4148724 3977680 3803071 3635112 3462478 3298044 3126205 2965808 2794192 2636691 2467330 2311296 2145429 1990175 1827949 1673534 1513597 1360660 1203098 1051607 896867 746094 594155 444446 294902 147461 32147 678 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2747566
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
AleksandR K.
LQFP112 - Up with the play
Posts: 149
Joined: Tue Mar 29, 2011 12:51 pm

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

Post by AleksandR K. »

Если есть лишний таймер, то будет правильным не делать прерывание по каждому зубу, а только по нужным.
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

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

Post by Stranger21 »

счас прибежит nikll и скажет что так нельзя так как нужно в каждом зубе мерить дад ))
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

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

Post by STC »

Если не делать прерывание по каждому зубу, то упадет точность.
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
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

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

Post by Stranger21 »

то есть проблема я так понял в делении 32? .. то есть при переходе на STM32 эта проблема уйдет и секу3 будет летать до 60т оборотов?
все таки не понятно что тогда в ПИК18 ? есть такое деление что ли ? или там точность хуже ?
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
AleksandR K.
LQFP112 - Up with the play
Posts: 149
Joined: Tue Mar 29, 2011 12:51 pm

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

Post by AleksandR K. »

STC wrote:Если не делать прерывание по каждому зубу, то упадет точность.
Точность чего может упасть?
Синхронизацию проверять каждый оборот - на святое я не покушался.
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

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

Post by STC »

все таки не понятно что тогда в ПИК18 ? есть такое деление что ли ? или там точность хуже ?
Купи блок МПСЗ-ЗШ и протестируй хотябы на эмуляторе, а простым заявлениям я бы не стал слепо верить. B при этом не известно какая там будет точность. Там может быть другой алгоритм, заточенный строго под шкив 60-2. Алгоритм в SECU-3 достаточно универсальный и может работать с приактически любым шкивом, а за универсальность нужно платить (32-х битное деление это одно из следствий универсальности). Можно сделать алгоритм, который будет строго заточен под шкив 60-2 и будет более быстрым, но я такой алгоритм делать не хочу.
Я понятно объяснил?
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
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

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

Post by STC »

Точность чего может упасть?
Синхронизацию проверять каждый оборот - на святое я не покушался.
Учи теорию.
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
AleksandR K.
LQFP112 - Up with the play
Posts: 149
Joined: Tue Mar 29, 2011 12:51 pm

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

Post by AleksandR K. »

STC wrote:Учи теорию.
У меня прерывается каждый зуб, но проверяется один раз за оборот. Работает. На слово поверите? Тогда проверьте.
Post Reply