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

Импульсы появились, но при вращении потенциометром происходят периодически “глюки”: некоторые форсунки отключаются, управление искрой на паре цилиндров отказывает. Эбу видит какие то расхождения в сигнале. BOOM, думаю и так супер получилось. Теперь буду разбираться с перепрошивкой нано.

Поясните - это происходит именно при плавном движении ползунка по резистору (максимально плавно) или же при резком изменении положения ползунка (резкое изменение частоты)? Или ещё как-то? Максимально описываете повеледение, ведь я не нахожусь рядом и мне сложно понять в чем причина.

Если у вас есть желание довести данный блок до конечного результата - я готов помочь.

Главное тут для меня было понять - работают ли блоки при формировании импульсов через прерывания. Как я понимаю - работают? (То есть если не вращать резистор?)

Если вы готовы продолжать - у меня есть идея как попробовать довести проект до конца. Но всё зависит от вас…

Вы отлаживаете не в той последовательности.
Сначала нужно вывести сигнал на осциллограф или логический анализатор. Второе - предпочтительнее. Затем внимательно изучить сигнал, соответствует ли он тому, что по Вашему мнению должно быть. Если соответствует - только тогда подавать на форсунки. Если не соответствует - добиваться соответствия.
Если сигнал соответствует ожиданиям, но приводит к неверной работе устройства, значит, Ваше мнение ошибочно и нуждается в исправлении.

Действуя в такой последовательности, Вы в случае неудачи эксперимента будете знать, что именно нуждается в доработке: соответствие генерируемого сигнала Вашему представлению либо Ваше представление о свойствах сигнала.

Я это делал у себя дома и сигнал был сопоставим с референсным из первоначально скетча и не отличался, даже более того - больше соответствовал расчетным чем через формирование в основном цикле.

Об этом я и спрашивал - Сигнал ожидаемо должен быть «вкусным блокам», но проблема у него при вращении резистора или где-то ещё?

Я вообще-то писал Диагносту - делал ли это он у себя.
Как свидетельствует обширная практика повторения проектов Ардуино, в процессе попыток такого повторения возникает масса проблем. Поэтому надеяться, что если автор прошел некоторый путь, то у того, кто повторяет, пройти этот путь получится автоматически, слишком оптимистично.

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

1 лайк

С последним скетчем появилось управление , но при плавном перемещении ползунка, примерно с 1500 об/мин( видно что начинаются глюки). У меня на стенде подключены светодиоды к форсам и управлению катушкой. Управление форсунками еще идет, а в управление катушкой отказывает 2-а цилиндра. При дальнейшем повороте ползунка катушка с форсунками перестают работать совсем. Если отключить питание и ползунок оставить примерно на 3000 об/мин, а затем заново подключить питание, то управления совсем нет. Только когда обороты сделаю ниже 1500 об/мин блок запускается. Хотя сейчас смотрел осциллографом сигнал такой же как с рабочим скетчем (пост №16). Может у меня с контактами проблема. Еще раз проверю все основательно, что бы в заблуждение не ввести.

Это правильный подход. Проверь. Потому что в импульсах (кроме частоты) я расхождений не увидел. А у меня осциллограф на 100МГц, эти килогерци он хорошо «видит».

Поясню - при увеличении значения FREQ - увеличивалась частота, но последовательность сохранялась.

Поясню для остальных (но думаю и так большинство понимает), именно из-за адекватности ТС и его фраз вида:

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

Сейчас внимательнее посмотрел , где должен быть пропущенный зуб. Скорее всего тут засада. Вот первое фото. Со скетчем с 16 поста. С ним все работает. А на втором фото перед пропущенным зубом еще один широкий импульс. И этот импульс появляется не каждый раз, а через раз. Эбу не понимает поэтому. Обороты одинаковые 300 об/мин.

Если ты ещё на связи и в ближайшее время не хочешь никуда срочно уйти, я готов перепроверить у себя.

На связи)

Подожди я свои измерения сделаю.

Давай для чистоты эксперимента - приведи два кода (сюда прикрепи) которые ты использовал.
А я пока старые коды опробую.

Вот с этим работает.

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

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

С этим с глюками.

#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     500

uint32_t tick_delay, FREQ = 5500;        //rpm
uint32_t pt, mill;
volatile uint8_t index = 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,
};

void setup() {

  DDRD |= (1 << PD2);
  DDRD |= (1 << PD3);

  PORTD &= ~(1 << PD2);
  PORTD &= ~(1 << PD3);

  // Настройка режима CTC Timer1
  TCCR1A &= ~((1 << WGM10) | (1 << WGM11));
  TCCR1B &= ~((1 << WGM13));
  TCCR1B |= (1 << WGM12);

  // Настройка предделителя на 8 Timer1
  TCCR1B |= (1 << CS11);
  TCCR1B &= ~((1 << CS12) | (1 << CS10));

  // Разрешаем прерывание по совпадению с OCR1A
  TIMSK1 |= (1 << OCIE1A);

  pt = analogRead(pt_pin);

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

  // Устанавливаем значение для сравнения
  tick_delay = ((120000000UL / FREQ) / wheel_len) * 2;
  OCR1A = tick_delay;

  // Глобально разрешаем прерывания
  sei();
}



void loop() {

  if (millis() - mill > timeout) {

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

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

    tick_delay = ((120000000UL / FREQ) / wheel_len) * 2;
    OCR1A = tick_delay;

    // Разбиваем на отдельные цифры
    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]);
  }
}

ISR(TIMER1_COMPA_vect) {

  if (Table1[index] == 0) {
    PORTD &= ~(1 << PD2);
    PORTD |= (1 << PD3);
  } else {
    PORTD |= (1 << PD2);
    PORTD &= ~(1 << PD3);
  }

  if (index++ >= wheel_len) {
    index = 0;
  }
}

Я на связи, просто еще “не готово”. Жди.

Смотри, у меня нет резистора в схеме, поэтому я установил 3000 (это выше того, когда ты говорил начинаются проблемы).
Запусти (если можешь) их у себя:

Вот первый код:

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

uint32_t tick_delay, mill;
uint32_t FREQ = 3000;        //rpm
uint16_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);
  }
}

Вот второй код:

#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     500

uint32_t tick_delay, FREQ = 3000;        //rpm
uint32_t pt, mill;
volatile uint8_t index = 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,
};

void setup() {

  DDRD |= (1 << PD2);
  DDRD |= (1 << PD3);

  PORTD &= ~(1 << PD2);
  PORTD &= ~(1 << PD3);

  // Настройка режима CTC Timer1
  TCCR1A &= ~((1 << WGM10) | (1 << WGM11));
  TCCR1B &= ~((1 << WGM13));
  TCCR1B |= (1 << WGM12);

  // Настройка предделителя на 8 Timer1
  TCCR1B |= (1 << CS11);
  TCCR1B &= ~((1 << CS12) | (1 << CS10));

  // Разрешаем прерывание по совпадению с OCR1A
  TIMSK1 |= (1 << OCIE1A);

  pt = analogRead(pt_pin);

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

  // Устанавливаем значение для сравнения
  tick_delay = ((120000000UL / FREQ) / wheel_len) * 2;
  OCR1A = tick_delay;

  // Глобально разрешаем прерывания
  sei();
}



void loop() {

  if (millis() - mill > timeout) {

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

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

    tick_delay = ((120000000UL / FREQ) / wheel_len) * 2;
    OCR1A = tick_delay;

    // Разбиваем на отдельные цифры
    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]);
  }
}

ISR(TIMER1_COMPA_vect) {

  if (Table1[index] == 0) {
    PORTD &= ~(1 << PD2);
    PORTD |= (1 << PD3);
  } else {
    PORTD |= (1 << PD2);
    PORTD &= ~(1 << PD3);
  }

  if (index++ >= wheel_len) {
    index = 0;
  }
}

Они отличаются от “рабочих” (с регулировкой) только тем, что я исключил регулировку (воздействие) резистором.

Сейчас скрины прикреплю.

Скрины еще грузятся… ((