Эмуляция сигнала ДПКВ 60-2

Здравствуйте. Есть скетч для ардуино с сигналом дпкв 60-2. Прошивка рабочая. На столе запускал автомобильные блоки. Идет управление форсунками, искрой. Но в прошивке фиксированные обороты(900 об/мин), без возможности регулировки. Хотелось бы реализовать регулировку оборотов до 5500 об/мин. На 2-ом и 3-м выводах сигналы асинхронны друг другу(проверял осцил.). Сам не в зуб ногой с программированием. Подскажите как реализовать. Заранее спасибо.

#define FREQ 900 //rpm
#define wheel_len 240
#define out1_pin 2
#define out2_pin 3
#define out3_pin 4
unsigned long tick_delay;

const char Table1[wheel_len] = {
  0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,

  0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
};
const char Table2[wheel_len] = {
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,

  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
};


void setup() {
  // put your setup code here, to run once:
  pinMode(out1_pin, OUTPUT);
  pinMode(out2_pin, OUTPUT);
  pinMode(out3_pin, OUTPUT);

  tick_delay = ((120000000/FREQ)/wheel_len);
}

void loop() {
  // put your main code here, to run repeatedly:


  int i;
  for (i = 0; i < wheel_len; i++)
  {
    digitalWrite(out1_pin, Table1[i]);
    digitalWrite(out2_pin, !Table1[i]);
    digitalWrite(out3_pin, !Table2[i]);
    delayMicroseconds(tick_delay);
  }
}

Начните с публикации схемы, а также подробного описания: что конкретно хочется, что вместо этого есть и чем первое отличается от второго.
Ну и желательно просветить общественность, что такое дпвк 60-2, для чего оно нужно, и какими свойствами обладает.

1 лайк

А что мешает сделать FREQ переменной и менять как хочешь?

Попробуй вот этот код, он должен примерно каждые 5 секунд увеличивать FREQ на 200 и так до 5500 (примерно за 2 минуты), а потом сбрасывается на 900 и опять по кругу до 5500 ну и тд (заодно посмотришь до какого значения “ардуина тянет”):slight_smile:

#define wheel_len 240
#define out1_pin 2
#define out2_pin 3
#define out3_pin 4

uint32_t tick_delay, mill;
uint32_t FREQ = 900;        //rpm

const char PROGMEM Table1[wheel_len] = {
  0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
};
const char PROGMEM Table2[wheel_len] = {
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
};


void setup() {

  pinMode(out1_pin, OUTPUT);
  pinMode(out2_pin, OUTPUT);
  pinMode(out3_pin, OUTPUT);

  tick_delay = ((120000000UL / FREQ) / wheel_len);
  mill = millis();
}

void loop() {

  for (uint8_t i = 0; i < wheel_len; i++) {
    digitalWrite(out1_pin, Table1[i]);
    digitalWrite(out2_pin, !Table1[i]);
    digitalWrite(out3_pin, !Table2[i]);
    delayMicroseconds(tick_delay);
  }

  if (millis() - mill > 5000) {

    mill = millis();
    FREQ += 200;

    if (FREQ > 5500) {
      FREQ = 900;
    }

    tick_delay = ((120000000UL / FREQ) / wheel_len);
  }

}

На Arduino Nano:

Скетч использует 1736 байт (5%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 21 байт (1%) динамической памяти, оставляя 2027 байт для локальных переменных. Максимум: 2048 байт.

Схема - это ардуино нано, с его выводов D2 и D3 сигнал идет на разъем автомобильного блока управления двигателем вместо дпкв(датчик положения коленчатого вала). 60-2 - это 58 зубов и 2-а пропущенных. Хотелось реализовать в этой прошивке изменение оборотов до 5500.

Так ты пробовал код из #3? Работает?
Кстати, а D4 в коде для чего? Что он на схеме делает?

BOOM, частота изменяется, но количество импульсов стало меньше 58.

Стало вот так.

Была такая осцилка.

D4 я не использую в схеме, а в коде не знаю для чего он. Может для датчика распредвала. Но он мне не нужен. Хотелось , что бы потенциометром можно было частоту менять от 30 до 5500 об/мин, если это конечно возможно.

Это при старте так стало или когда через какое-то время частота увеличивается?

Я ведь логику программы не менял, с какого перепугу их стало меньше?

ЗЫ: У вас осциллограф, простите, гамно с плосой 200кГц. Нормального то нету? Просто ему веры нет у меня никакой.

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

Ладно, признаю - погорячился )))

Вот такой код пробуйте:

#define wheel_len 240
#define out1_pin 2
#define out2_pin 3
#define out3_pin 4

uint32_t tick_delay, mill;
uint32_t FREQ = 900;        //rpm

const char Table1[wheel_len] = {
  0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
};
const char Table2[wheel_len] = {
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
};


void setup() {

  pinMode(out1_pin, OUTPUT);
  pinMode(out2_pin, OUTPUT);
  pinMode(out3_pin, OUTPUT);

  tick_delay = ((120000000UL / FREQ) / wheel_len);
  mill = millis();
}

void loop() {

  for (uint8_t i = 0; i < wheel_len; i++) {
    digitalWrite(out1_pin, Table1[i]);
    digitalWrite(out2_pin, !Table1[i]);
    digitalWrite(out3_pin, !Table2[i]);
    delayMicroseconds(tick_delay);
  }

  if (millis() - mill > 5000) {

    mill = millis();
    FREQ += 200;

    if (FREQ > 5500) {
      FREQ = 900;
    }

    tick_delay = ((120000000UL / FREQ) / wheel_len);
  }

}

Я даже свой осциллограф “расчехлил” - у меня работает ))

Я могу это написать, но работать вы с этим нормально не сможете. Это как ловить блоху экскаватором будет ))

BOOM, работает) Частота растет. А как с переменным резистором сделать? Или тут не прокатит?

Если с резистором, то придется диапазон частоты уменьшить? Что бы как то частоту настроить? или я ошибаюсь?

Ну да, и регулировка будет с большим шагом.
Минутку…

Резистор переменный:
Один крайний вывод на +5В, второй крайний на GND, средний на вывод А0 ардуино (у меня Nano, какая у вас не знаю - написано не было).

Код:

#define wheel_len   240
#define pt_pin      A0
#define out1_pin    2
#define out2_pin    3

uint32_t tick_delay, mill;
uint32_t FREQ = 900;        //rpm
uint32_t pt;

const char Table1[wheel_len] = {
  0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
};

void setup() {

  pinMode(out1_pin, OUTPUT);
  pinMode(out2_pin, OUTPUT);

  pt = analogRead(pt_pin);

  FREQ = map(pt, 0, 1024, 300, 5500);

  tick_delay = ((120000000UL / FREQ) / wheel_len);
  mill = millis();
}

void loop() {

  for (uint8_t i = 0; i < wheel_len; i++) {
    digitalWrite(out1_pin, Table1[i]);
    digitalWrite(out2_pin, !Table1[i]);
    //    digitalWrite(out3_pin, !Table2[i]);
    delayMicroseconds(tick_delay);
  }

  if (millis() - mill > 1000) {

    mill = millis();
    pt = analogRead(pt_pin);

    FREQ = map(pt, 0, 1024, 300, 5500);

    tick_delay = ((120000000UL / FREQ) / wheel_len);
  }
}

Должна меняться частота от 300 до 5500. Но как вы её “ловить” будете - понятия не имею. ))

BOOM, подключил .Ура,Работает)) Большое Спасибо. Завтра на работе проверю с разными блоками.

Ну если всё будет работать - отметишь #16 как решение вопроса и делов то ))

Хорошо. Спасибо.

@BOOM ну брат, ты сегодня альтруист прям :sweat_smile:

@Diagnost чет не булькает