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

А точно так можно?

а что не так?

Всегда было страшно пихать пин на +5

а на землю значит можно :sweat_smile:

Это второй вопрос :slight_smile:
резистор 100ом яб поставил со средней ноги переменника на пин.
Но это я, поэтому может быть неправильно

1 лайк

да правильно все :+1:
но када хочется на скорую, а контрацептива тьфу, резистора нет, можно рискнуть))

Можно и так, но зачем? Никакие параметры не выйдут за пределы же.

@Diagnost , если заработает то для бОльшей точности установки FREQ можно использовать:

  1. Ручку на резистор БОЛЬШОГО (просто ОГРОМНОГО) размера.
  2. Многооборотный резистор

А я бы еще зашунтировал вход керамикой на 0.1.
Но это (как им резистор на 100 Ом) уже “улучшательство”.

1 лайк

Сегодня проверил: работает регулировка частоты. При подключении к эбу меняется управление форсунками и искрой. BOOM :+1:

Спасибо за обратную связь))
А то ведь большинство тем заканчивается фразой: «Опробую и напишу» :smiley:

1 лайк

Еще один момент. Попытался сейчас подключить 7-ми индикатор тм1637. При прокрутке потенциометром частота меняется на индикаторе , но на осциллограмме проскакивает большое расстояние между пучками импульсов. Может под этот индикатор я с кодом намудрил.

#include <TM1637.h>
// Определяем пины для подключения дисплея TM1637
#define CLK 8
#define DIO 9

#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
uint16_t pt;

// Создаем объект дисплея TM1637
TM1637 tm1637(CLK, DIO);

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);

 // Инициализируем дисплей
  tm1637.init();
  tm1637.set(6); // Устанавливаем яркость дисплея (0-7)

   // Выводим начальные нули на дисплей
  tm1637.display(0, 0);
  tm1637.display(1, 0);
  tm1637.display(2, 0);
  tm1637.display(3, 0);
  

  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);
  }

  // Разбиваем на отдельные цифры
      int8_t digits[] = {0, 0, 0, 0};
      digits[0] = FREQ / 1000;        // тысячи (десятки км/ч)
      digits[1] = (FREQ / 100) % 10;  // сотни (единицы км/ч)
      digits[2] = (FREQ / 10) % 10;   // десятки (десятые км/ч)
      digits[3] = FREQ % 10;          // единицы (сотые км/ч)
      
      // Отображаем скорость на дисплее
      tm1637.point(false);
      tm1637.display(0, digits[0]);
      tm1637.point(false);
      tm1637.display(1, digits[1]);
      tm1637.point(false);  // Включаем точку для разделения целой и дробной части
      tm1637.display(2, digits[2]);
      tm1637.point(false);
      tm1637.display(3, digits[3]);
    }
 
 
 

В код вставил только данные для отображения частоты на тм1637. После этого пропущенных зубьев стало больше.

Как будто процессор отвлекается на индикацию и сбиваются импульсы.

Перенеси код работы с ТМ в if(). Я же его не зря завёл, а чтобы уменьшить влияние на основной алгоритм.
Если не поможет - значит нужно полностью переписывать код на работу БЕЗ делеев.

Вот так:

#include <TM1637.h>
// Определяем пины для подключения дисплея TM1637
#define CLK         8
#define DIO         9

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

#define timeout     1000

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

// Создаем объект дисплея TM1637
TM1637 tm1637(CLK, DIO);

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);

  // Инициализируем дисплей
  tm1637.init();
  tm1637.set(6); // Устанавливаем яркость дисплея (0-7)

  // Выводим начальные нули на дисплей
  tm1637.display(0, 0);
  tm1637.display(1, 0);
  tm1637.display(2, 0);
  tm1637.display(3, 0);

  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]);
    delayMicroseconds(tick_delay);
  }

  if (millis() - mill > timeout) {

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

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

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

    // Разбиваем на отдельные цифры
    int8_t digits[] = {0, 0, 0, 0};
    digits[0] = FREQ / 1000;        // тысячи (десятки км/ч)
    digits[1] = (FREQ / 100) % 10;  // сотни (единицы км/ч)
    digits[2] = (FREQ / 10) % 10;   // десятки (десятые км/ч)
    digits[3] = FREQ % 10;          // единицы (сотые км/ч)

    // Отображаем скорость на дисплее
    tm1637.point(false);
    tm1637.display(0, digits[0]);
    tm1637.point(false);
    tm1637.display(1, digits[1]);
    tm1637.point(false);  // Включаем точку для разделения целой и дробной части
    tm1637.display(2, digits[2]);
    tm1637.point(false);
    tm1637.display(3, digits[3]);
  }
}
1 лайк

Даже вот так будет “по красивее” ))

#include <TM1637.h>
// Определяем пины для подключения дисплея TM1637
#define CLK         8
#define DIO         9

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

#define timeout     1000

uint32_t tick_delay, mill;
uint32_t FREQ = 900;        //rpm
uint16_t pt;
uint8_t digits[] = {0, 0, 0, 0};

// Создаем объект дисплея TM1637
TM1637 tm1637(CLK, DIO);

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,
};

// Функция "печати" FREQ на TM1637...
void print_freq(void) {
  digits[0] = FREQ / 1000;        // тысячи (десятки км/ч)
  digits[1] = (FREQ / 100) % 10;  // сотни (единицы км/ч)
  digits[2] = (FREQ / 10) % 10;   // десятки (десятые км/ч)
  digits[3] = FREQ % 10;          // единицы (сотые км/ч)

  tm1637.point(false);
  tm1637.display(0, digits[0]);
  tm1637.point(false);
  tm1637.display(1, digits[1]);
  tm1637.point(false);  // Включаем точку для разделения целой и дробной части
  tm1637.display(2, digits[2]);
  tm1637.point(false);
  tm1637.display(3, digits[3]);
}

void setup() {

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

  // Инициализируем дисплей
  tm1637.init();
  tm1637.set(6); // Устанавливаем яркость дисплея (0-7)

  pt = analogRead(pt_pin);

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

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

void loop() {

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

  if (millis() - mill > timeout) {

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

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

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

    // Отображаем скорость на дисплее
    print_freq();
  }
}

Суть if (millis() - mill > timeout) { } в том, чтобы разгрузить основной цикл (loop()), в котором с использованием задержек выполняется основной алгоритм.

1 лайк

BOOM, еще раз спасибо. Все работает :+1: . Пару извилин у меня в голове появилось)

Кстати, вот это:

Там всё равно осталось.
Но теперь оно происходит ТОЛЬКО ОДИН раз за секунду (как помеха), а не после каждой пачки импульсов (как на осциллограмме) - несколько сотен может тысяч раз за секунду.

Не знаю как на это оборудование внешнее будет реагировать, возможно и не заметит (или спишет на погрешность какую или ещё что). А возможно будет «ругаться». Проверяй.

1 лайк

Завтра проверю. Если блок будет видеть как помехи, то задействую две ардуинки)), что бы с кодом не заморачиваться.