ARDUINO Блок опережения зажигания ДВС

PiratFox

★★★★★✩✩
13 Фев 2020
1,707
474
Вот именно из-за этого чаще всего выходят из строя кнопки во всяких мышках, особенно если инженеры поставили подобный конденсатор для уменьшения дребезга.
Начнём с того, что главная причина износа контактов - деформация и трение при замыкании/размыкании. И конденсатор ёмкостью сотню-другую нанофарад, да ещё при 5 вольтах, особо не ускорит износ. Если вообще повлияет. Слишком мизерная энергия для заметной электроэррозии. :)
@Эдуард Анисимов, камрад, ты пропустил важный фактор :) . В контактном зажигании конденсатор на контактах существенно увеличивает энергию искры.;) Потому без него плохо едет: топливо не всегда поджигается по причине слабой искры.
 
Изменено:

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
@Геннадий П,
А если комаров миллион, значит чтобы контакт их "почувствовал" их нужно три миллиарда. :) Я ещё раз вам повторяю, не сравнивайте микропереключатели и прерыватели предназначенные для коммутации катушек зажигания, это вещи, мягко говоря, разных весовых категорий. С таким же успехом мы можем докопаться до того, что вход микроконтроллера тоже имеет входную ёмкость, которая убивает контакт, а ещё линия от прерывателя до входа тоже имеет свою ёмкость.

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

Главное то, что причина ложных срабатываний подавляется программным алгоритмом, остальное уже маловажно.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,707
474
думаю теперь её даже можно убрать как возможно, бесполезную вещь
Ну, почему же прям бесполезную. Ёмкость эта давит наводки на входе. Насколько хорошо - другой вопрос, но всё жеж какая-то польза есть. :)
 

Artip

✩✩✩✩✩✩✩
19 Сен 2023
6
3
@user314, добрый день! Не подскажете, что нужно изменить в коде, чтобы заработало с платой Digispark по схеме с custom cult? Исходник с их сайта у меня не заработал, к тому же заметил, что формирователь их скетча не меняет углы при внесении изменений на сайте. С коммутатором и платой всё в порядке, мот даже заводится с ними, хоть и с трудом и нет опережения
 

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
@Artip,
Причин там может быть много и они могут быть индивидуальные. В их скетче я не разобрался до конца поэтому написал свой. У меня условия для состояния "нуля" и "единицы" разделены в коде для большей читабельности.

Вы вполне можете использовать мой скетч, но так как скорее всего у вас БСЗ, вам нужно убрать строки "антидребезга", подставить команды на вкл/выкл порта специфичные для процессоров atmega (они есть в комментариях) и выяснить, нужно ли инвертировать сигнал с датчика или нет.

Осмелюсь предположить, что вам не нужно инвертировать сигнал и скорее всего получается что-то типа вот этого:

C++:
#define IN 0
#define OUT 1

bool interruptor;
bool oldInterruptor;
bool advanceGranted;

unsigned long fuseTime;
unsigned long newTime;
unsigned long oldTime;
unsigned long midTime;
unsigned long periodTime;
unsigned long chargeTime;
unsigned long ignitionAdvance;

int ignitionDegree;
long int rpm;

void setup() {
  Serial.begin(115200);         // Start the Serial communication to send messages to the computer
  Serial.println("\n");

  oldTime = micros(); // сразу нужно установить, чтобы readAll() не споткнулся
  fuseTime = micros(); // устанавливается время до выключения катушки

  pinMode(IN, INPUT); // от БСЗ
  pinMode(OUT, OUTPUT); // к коммутатору
}

void readAll() {
  newTime = micros();
  periodTime = newTime-oldTime; // длительность всего периода (от размыкания до размыкания)
  chargeTime = newTime-midTime; // отрезок цикла от замыкания контакта до размыкания (зарядка катушки)
  rpm = 60000000/periodTime; // число оборотов
  oldTime = micros();
}

void loop() {
  interruptor = digitalRead(IN);

  if(interruptor == LOW && oldInterruptor == HIGH) { // шторка открылась
    digitalWrite(OUT, LOW); // отключаем катушку в любом случае (ИСКРА) LOW;
    oldInterruptor = interruptor; // oldInterruptor = LOW
    readAll(); // подсчёт всех параметров цикла
    // калькулятор положения коленвала на всякий случай: http://www.torqsoft.net/piston-position.html#gudgeon
    // примерный расчёт коэфициентов взят отсюда: https://customcult.netlify.app/
    if(rpm >= 0 && rpm <= 700) {
      ignitionDegree = 0;
      goto bailout;
    }
    if(rpm >= 700 && rpm <= 1000) { // 0 - 2.2
      ignitionDegree = 0.007 * rpm + (-4.800);
      goto bailout;
    }
    if(rpm >= 1000 && rpm <= 2000) { // 2.2 - 15
      ignitionDegree = 0.013 * rpm + (-10.800);
      goto bailout;
    }
    if(rpm >= 2000 && rpm <= 3000) { // 15 - 30
      ignitionDegree = 0.015 * rpm + (-15.000);
      goto bailout;
    }
    if(rpm >= 3000 && rpm <= 4000) { // 30 - 40
      ignitionDegree = 0.010 * rpm + (0.000);
      goto bailout;
    }
    if(rpm > 4000) {
      ignitionDegree = 40;
    }
    bailout:
    ignitionAdvance = chargeTime - ((periodTime / 360) * ignitionDegree);
    fuseTime = micros(); // начало отсчёта для предохранителя (отключение катушки зажигания при простое)
  }

  if(interruptor == HIGH && oldInterruptor == LOW) { // шторка закрылась
    digitalWrite(OUT, HIGH); // включаем катушку (ЗАРЯДКА) HIGH;
    oldInterruptor = interruptor; // oldInterruptor = HIGH
    midTime = micros(); // отметка начала зарядки катушки (середина цикла)
    advanceGranted = 1; // блок опережения разрешён
  }

  if(micros() - midTime >= ignitionAdvance && advanceGranted == 1) { // собственно само опережение
    digitalWrite(OUT, LOW); // отключаем катушку (ИСКРА) LOW;
    advanceGranted = 0; // больше сюда не возвращаемся до следующего цикла.
  }

  if(micros() - fuseTime >= 1000000) { // предохранитель, если катушка заряжается больше 1 секунды
    digitalWrite(OUT, LOW); // отключаем катушку LOW;
  }
}
 
  • Лойс +1
Реакции: UJV 5901 и Artip

Artip

✩✩✩✩✩✩✩
19 Сен 2023
6
3
@user314, да, всё верно, у меня установлена БСЗ по "классической схеме", то есть коммутатор от 2108, только с оптическим датчиком, который работает так же, как и датчик Холла - подает на минус на сигнальный вход при выходе модулятора из зоны свечения светодиода. Большое спасибо за скетч, попробую в нем разобраться и протестировать. Считаю, что данная тема очень интересна для наших довольно древних двигателей.
 
  • Лойс +1
Реакции: UJV 5901

Artip

✩✩✩✩✩✩✩
19 Сен 2023
6
3
@user314, не заработало. Точнее - сначала получилось запустить двигатель, но с нескольких попыток, хоть он и был прогрет и без ФУОЗ заводился "с полпинка". Пару раз так запускал, потом решил проверить, что же получается с искроподачей в первые попытки запуска и далее. А ничего - искры просто не было, как я ни крутил двигатель киком. После проверки двигатель перестал запускаться вообще. Без ФУОЗ всё работает штатно. Возможно, какой-нибудь счетчик не даёт плате подавать сигнал на выход? Что-то я не разобрался в Вашем скетче - не хватает знаний в программировании. Похоже, что надо досмотреть курсы)
 
  • Лойс +1
Реакции: UJV 5901

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
@Artip,

Тогда после сброса платы искра снова должна появиться. Можно попробовать убрать последний абзац:

C++:
  if(micros() - fuseTime >= 1000000) { // предохранитель, если катушка заряжается больше 1 секунды
    digitalWrite(OUT, LOW); // отключаем катушку LOW;
  }
Он вам всё равно ни к чему. Но вряд ли дело в нём. Если сначало было, а потом пропало - значит что-то где-то отвалилось.

Думаю, пытаться накодить рабочий скетч без опыта - почти невозможная задача, сам с этим столкнулся.
Поэтому рекомендую вооружиться симуляторами, например tinkercad . com

2023-11-05_19_38_36.png

На вход 2 arduino подаётся меандр с частотой 100 герц (что соответствует 6000 оборотов), на выходе 4 видим тоже меандр, но с большей скважностью, что говорит о работе ФУОЗ.

В заключительных тестах воспроизводил всю обвязку на стенде, на вход цеплял генератор сигналов, а на выход к коммутатору лампочку и осциллограф, меняя частоту контролировал чтобы небыло никаких явных пропусков и затупов.

Заводиться хуже может по той простой причине что на первых оборотах алгоритм только определяет длительность входного импульса, а на выход подаётся случайная абракадабра, иногда может даже чихать по понятным причинам, в симуляторе proteus это очень хорошо видно, так как там можно сравнить входные и выходные данные с самых первых моментов. Я пока с этим никак не боролся, потому что на работу саму по себе оно никак не влияет.
 
Изменено:
  • Лойс +1
Реакции: UJV 5901

Artip

✩✩✩✩✩✩✩
19 Сен 2023
6
3
@user314, ооо, Тинкеркад, знаком с сайтом по пробам 3d моделирования (даже успешным). Попробую потестить там, спасибо. Возможно, будь стартер на мотаке электрическим а не киком, двигатель бы и дальше запускался. Может, у меня просто нога устала, хоть и очень старался. Плату перезагружал несколько раз, в перерывах подключая и запуская двигатель с коммутатором без платы. В любом случае спасибо за ответ)
 

Artip

✩✩✩✩✩✩✩
19 Сен 2023
6
3
@user314, Попробовал смодулировать в Тинкеркад, опять засада - пишет, что есть некая ошибка в коде
 

Вложения

  • Ахах! +1
Реакции: Wan-Derer

Artip

✩✩✩✩✩✩✩
19 Сен 2023
6
3
@Брякомякс, :unsure:, точно, ночью и не понял, что браузер автоматически переводит код)) Отключил, запустилось