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

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
Пока что испытал вот такой скетч:

C++:
#define IN 4
#define OUT 5

bool interruptor;
unsigned long oldtime;

void setup() {
  oldtime = micros();
  pinMode(4, INPUT); // D2 from interruptor
  pinMode(5, OUTPUT); // D1 To driver
  pinMode(2, OUTPUT); // LED
  digitalWrite(2, LOW); // LED ENABLED
}

void loop() {
  interruptor = digitalRead(IN);
  if(interruptor == HIGH) {
    GPOC = (1 << OUT); // LOW
    oldtime = micros();
  }
  if(interruptor == LOW && micros() - oldtime <= 1000000) {
    GPOS = (1 << OUT); // HIGH
  } else {
    GPOC = (1 << OUT); // LOW
  }
}
Здесь у нас обычный инвертор, только с защитой от бесполезной посадки аккумулятора, отключение катушки после 1 секунды простоя.
Вместо digitalWrite применил GPOS/GPOC вот отсюда, как утверждает автор, это позволяет сократить время выполнения с 910 наносекунд до 88.

esp8266_ignition-.JPG

Pull-up сделал не от 3.3 вольта, а сразу от 5. Как показали испытания "на столе" - так контроллер гораздо быстрее отрабатывает прерывание. Далее поднял частоту до 160 мГц в arduino IDE. Не знаю является ли это действительностью и может ли esp8266 работать на таких частотах.

Короче говоря пока тёплые дни - хочется покататься, а не разгазовывать и выность мозги соседям.

@te238s
Насчёт первого пункта не совсем понял, перетащить затвор mosfet (или его драйвер) на плюс, а контроллером шунтировать на массу?

С учётом всех изменений попробую потом добавить задержку, неплохая идея.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
Насчёт первого пункта не совсем понял, перетащить затвор mosfet
Нет,между стоком и истоком RC цепь ставиться,дабы избежать слишком крутых импульсов. Надо погуглуть как обычно прерыватель на транзисторах реализован.
На многих схемах либо параллельно первичной обмотке стоит 1мкФ и 750 Ом,либо параллельно сток-истоку или коллектору-эмиттеру конденсатор 0.047мкФ×600в.
 
Изменено:

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
Нет,между стоком и истоком RC цепь ставиться,дабы избежать слишком крутых импульсов. Надо погуглуть как обычно прерыватель на транзисторах реализован.
У меня на схеме стоит 220 нанофарад параллельно стоку-истоку. В обычном коммутаторе у меня сделано вот так:
micro2-.jpg
 

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
Решил полностью написать свой скетч для лучшего понимания, углы выставляю статически для каждого диапазона. Вот что у меня получилось:


C++:
#define IN 4
#define OUT 5

bool interruptor;
bool checkAll;
bool dutycheck;
bool ignitionOffset;
unsigned long fuseTimer;
unsigned long newtime;
unsigned long oldtime;
unsigned long periodTime;
unsigned long dutyTime;
unsigned long ignitionAdvance;
unsigned long startDuty;
long int rpm;

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

//  startDuty = micros();
  oldtime = micros(); // сразу нужно установить, чтобы readAll() не споткнулся
  fuseTimer = micros(); // устанавливается время до выключения катушки
  pinMode(IN, INPUT); // D2 от прерывателя
  pinMode(OUT, OUTPUT); // D1 к драйверу
  pinMode(2, OUTPUT); // LED
  digitalWrite(2, LOW); // LED ENABLED
}

void readAll()
{
  newtime = micros();
  periodTime = newtime-oldtime; // длительность всего периода (от размыкания до размыкания)
  dutyTime = newtime-startDuty; // длительность от замыкания до размыкания
  rpm = 60000000/periodTime; // число оборотов
  oldtime = micros();

  /*
  static long prevMill = 0;
  if (((long)millis() - prevMill) >= 1000) {
    prevMill = millis();
    Serial.print("RPM: ");
    Serial.print(rpm);
    Serial.println();
    Serial.print("Period: ");
    Serial.print(periodTime);
    Serial.println();
    Serial.print("Duty: ");
    Serial.print(dutyTime);
    Serial.println();
    Serial.print("1 Degree: ");
    Serial.print(periodTime / 360);
    Serial.println();
    Serial.print("Duty - 2 degrees: ");
    Serial.print(dutyTime - (periodTime / 360) * 2);
    Serial.println();
    Serial.println();
  }
  */
}

void loop() {
  interruptor = digitalRead(IN); // считываем прерыватель
  if(interruptor == HIGH) { // если прерыватель разомкнут
    fuseTimer = micros(); // устанавливается время до выключения катушки, если она будет замкнута долго
    if(checkAll == true) { // пришло ли время проверить обороты и периоды?
      readAll(); // вычисляем всё
      checkAll = false; // флаг запрета на проверку пока не наступит следующий момент размыкания
      dutycheck = true; // флаг отслеживания момента замыкания прерывателя
      if(rpm >= 0 && rpm <= 700) { // обороты
        GPOC = (1 << OUT); // отключаем катушку (ИСКРА) LOW
        //digitalWrite(OUT, LOW);
        ignitionOffset = false; // опережения нет
        return; // дальше делать нечего
      }
      ignitionOffset = true; // опережение зажигания на следующем заходе
      if(rpm >= 700 && rpm <= 1000) { // частота примерно 12 - 17 Герц // период 83333 мкс - 58800 мкс
        ignitionAdvance = dutyTime - (periodTime / 360) * 1; // вычисляем время которое остаётся до момента опережения и вычитаем время равное градусам
      }
      if (rpm >= 1000 && rpm <= 2000) {
        ignitionAdvance = dutyTime - (periodTime / 360) * 3;
      }
      if (rpm >= 2000 && rpm <= 3000) {
        ignitionAdvance = dutyTime - (periodTime / 360) * 6;
      }
      if (rpm >= 3000 && rpm <= 4000) {
        ignitionAdvance = dutyTime - (periodTime / 360) * 10;
      }
      if (rpm > 4000) {
        ignitionAdvance = dutyTime - (periodTime / 360) * 15;
      }
    }
  }
  if(interruptor == LOW && micros() - fuseTimer <= 1000000) { // если прерыватель сомкнут но не больше секунды
    checkAll = true; // устанавлиаем флаг разрешения на проверку оборотов и периодов в момент размыкания прерывателя
    if(dutycheck == true) { // отслеживается момент замыкания прерывателя
      startDuty = micros(); // устанавливается время момента замыкания, катушка заряжается.
      dutycheck = false; // больше сюда на заходим до следующего замыкания
    }
    if(ignitionOffset == true && micros() - startDuty >= ignitionAdvance) { // если установлен флаг опережения то вычисляем момент искры
      GPOC = (1 << OUT); // отключаем катушку (ИСКРА) LOW
      //digitalWrite(OUT, LOW);
    } else {
      GPOS = (1 << OUT); // включаем катушку (ЗАРЯДКА) HIGH
      //digitalWrite(OUT, HIGH);
    }
  } else { // иначе выключаем катушку зажигания
    GPOC = (1 << OUT); // отключаем катушку, так как двигатель простаивает LOW
    //digitalWrite(OUT, LOW);
  }
}
Всё это дело прекрасно работает без нагрузки, на прогретом двигателе обороты набираются шустро. Как только начинаешь ехать - дёрганки и рывки. В самом начале поставил delay(2000); - не глохнет.

Вообще ума не дам, что такого с ним начинает происходить когда он едет? Династенда нету, поэтому пощупать осциллографом в момент движения не могу. Короче тупик.
 

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
@Эдуард Анисимов
Хорошо, но неужели 1 - 3 градус смещения на что-то серьёзно повлияет? У меня начальное смещение установлено на уровне 23 градусов, или 3мм до ВМТ, дальше любые попытки опередить хоть насколько приводят к названному результату.

Как понять под нагрузкой двигатель или нет?

На некоторых моделях моторов Т-200 ставили механическое опережение на пружинах, не знаю как хорошо оно работало, но по всей видимости ни о какой нагрузке оно ничего знать не могло.

Стало быть у меня проблема аппаратная. И по всей видимости всё упирается в особенности взаимодействия прерывателя и контроллера.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
Опять же. Старые мотоциклы и китайские мопеды имеют примитивную систему зажигания. Там нет датчика нагрузки и ведь работает прекрасно.
Осциллограф цифровой или древний аналоговый? Я к тому что можно на нейтралке поймать сигнал в момент резкой газовки. Момент вращения масс и будет нагрузкой.
Искра. Пробивное напряжение меняется в широких пределах от условий. Больше нагрузка,больше дроссель открыт,больше давление в цилиндре,больше пробивное напряжение. Именно поэтому свечи проверяют на специальном стенде под рабочим давлением.
Если сделано только опережение от оборотов, под нагрузкой работать не будет.
Двигатель будет тупить,глохнуть, но не
дёрганки и рывки
 
Изменено:

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,304
949
58
Марий-Эл
@te238s, Здесь всё намного сложнее.
Я не вдавался какой у автора движок.
Двухтактный менее чувствителен ко всем этим регулировкам.
Четырёхтактный более чувствителен.
У меня тырчик китайский с четырёхтактным движком. И не важно, что в электронике нет некоторых регулировок.
Чаще всего они механические. И человеку не в теме это можно просто не заметить.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
@Эдуард Анисимов,о чем и говорю. У меня Альфа 110 кубиков. Там примитивная схема без регулировки угла ни от нагрузки,ни от оборотов. И всё прекрасно работает. Такой же принцип на всём бензоинструменте.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,304
949
58
Марий-Эл
@te238s, На лёгких конструкциях не критично.
Если сделать всё как надо, то увеличится мощность двигателя. Процентов на 30. Даже на Альфе.
Если взять УАЗ с неубиваемым 417м двигателем. Там все эти регулировки есть.
Но есть одна хитрость. Когда у тебя сдохло зажигание, но осталась целая катушка зажигания или есть запасная. Военные УАЗы комплектовались генератором, который подключался к катушке и она начинала лупить искру постоянно. Движок троил, дёргался, терял мощность, но доехать было возможно. А можно оставить эту систему насовсем. Едет же, что ещё нужно? :ROFLMAO::ROFLMAO::ROFLMAO::ROFLMAO::ROFLMAO:
 
  • Лойс +1
Реакции: te238s

PiratFox

★★★★★✩✩
13 Фев 2020
1,723
481
Военные УАЗы комплектовались генератором, который подключался к катушке и она начинала лупить искру постоянно.
Такие штуки для старых ВАЗов давно продаются, ещё с 90-х годов. Вместо коммутатора подключаются. 🤪
 

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
Всё, причина определена эксперементально. Это однозначно дребезг контактов. Взял обычный микропереключатель, прописал в код метки и стал смотреть выхлоп в последовательный порт, как итог при переключении порта микропереключателем, он сперва прыгает в низкое состояние, потом в высокое, а потом опять в низкое, что приводит к некорректной работе любого кода. И это при том, что на входе сейчас стоит К561ЛА7 как буфер. А что там может происходить на реальном прерывателе - страшно представить.

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

Эксперементально удалось понять, что переходные процессы на кнопке составляют 300 - 500 микросекунд.

3000 оборотов это у нас 50 Гц, а 50 Гц это период 20000 микросекунд. На высоких оборотах будет трудновато точно выставлять опережение если использовать задержки.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,723
481
@user314, не надо изобретать велосипед, используйте известный алгоритм защиты от дребезга. Или готовую библиотеку, их есть в интернете. Кстати, про дребезг я давно говорил, ещё в посте #18. ;)
 
Изменено:

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
@PiratFox я помню, но сразу проверить не удосужился.
Наиболее привлекательным решением казалось поставить триггер шмитта на входе, но почему-то не помогло. Удалось найти только К155ТЛ1
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,304
949
58
Марий-Эл
@user314, А что используется в качестве датчика?
Был бы перекидной переключатель можно было бы поставить RS триггер. Шмитта не поможет. Можно попробовать поставить конденсатор параллельно контактам, но это внесёт небольшую погрешность в опережение, которую можно учесть.
Кстати у меня мопед не ездил, если кондёра не было. Двигатель обороты при нагрузке не набирал. Плевался и чихал.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,723
481
Наиболее привлекательным решением казалось поставить триггер шмитта на входе
Ну, это для железячника. :) Вообще, при наличии в схеме МК, куда как проще бороться с дребезгом программно. А триггер Шмитта сам по себе ничего не даст. Нужна ещё правильно расчитанная времязадающая цепь на входе. Простейший ФНЧ.
 
Изменено:

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
@Эдуард Анисимов прерыватель контактный :) Я же там на схеме всё нарисовал.
На входе стоит керамический конденсатор 0.1мкф, но он в данном случае погоды не делает.

@PiratFox так в итоге и поступил, но пока сделал это тупо, добавил delay(1); в момент замыкания контакта, строка 73

C++:
#define IN 4
#define OUT 5

bool interruptor;
bool checkAll;
bool dutycheck;
bool ignitionOffset;
unsigned long fuseTimer;
unsigned long newtime;
unsigned long oldtime;
unsigned long periodTime;
unsigned long dutyTime;
unsigned long ignitionAdvance;
unsigned long startDuty;
long int rpm;

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

  oldtime = micros(); // сразу нужно установить, чтобы readAll() не споткнулся
  fuseTimer = micros(); // устанавливается время до выключения катушки
  pinMode(IN, INPUT); // D2 от прерывателя
  pinMode(OUT, OUTPUT); // D1 к драйверу
  pinMode(2, OUTPUT); // LED
  digitalWrite(2, LOW); // LED ENABLED
}

void readAll()
{
  newtime = micros();
  periodTime = newtime-oldtime; // длительность всего периода (от размыкания до размыкания)
  dutyTime = newtime-startDuty; // длительность от замыкания до размыкания
  rpm = 60000000/periodTime; // число оборотов
  oldtime = micros();
}

void loop() {
  interruptor = digitalRead(IN); // считываем прерыватель
  if(interruptor == HIGH) { // если прерыватель разомкнут
    fuseTimer = micros(); // устанавливается время до выключения катушки, если она будет замкнута долго
    if(checkAll == true) { // пришло ли время проверить обороты и периоды?
      readAll(); // вычисляем всё
      checkAll = false; // флаг запрета на проверку пока не наступит следующий момент размыкания
      dutycheck = true; // флаг отслеживания момента замыкания прерывателя
      if(rpm >= 0 && rpm <= 700) { // обороты
        GPOC = (1 << OUT); // отключаем катушку (ИСКРА) LOW
        //digitalWrite(OUT, LOW);
        ignitionOffset = false; // опережения нет
        return; // дальше делать нечего
      }
      ignitionOffset = true; // опережение зажигания на следующем заходе
      if(rpm >= 700 && rpm <= 1000) { // частота примерно 12 - 17 Герц // период 83333 мкс - 58800 мкс
        ignitionAdvance = dutyTime - (periodTime / 360) * 1; // узнаём длительность отрицательного импульса (dutyTime) и вычитаем из него градусы ((periodTime / 360) * 1)
      }
      if (rpm >= 1000 && rpm <= 2000) {
        ignitionAdvance = dutyTime - (periodTime / 360) * 3;
      }
      if (rpm >= 2000 && rpm <= 3000) {
        ignitionAdvance = dutyTime - (periodTime / 360) * 6;
      }
      if (rpm >= 3000 && rpm <= 4000) {
        ignitionAdvance = dutyTime - (periodTime / 360) * 10;
      }
      if (rpm > 4000) {
        ignitionAdvance = dutyTime - (periodTime / 360) * 15;
      }
    }
  }
  if(interruptor == LOW && micros() - fuseTimer <= 1000000) { // если прерыватель сомкнут но не больше секунды
    checkAll = true; // устанавлиаем флаг разрешения на проверку оборотов и периодов в момент размыкания прерывателя
    if(dutycheck == true) { // отслеживается момент замыкания прерывателя
      delay(1); // защита от дребезга контакта
      startDuty = micros(); // устанавливается время момента замыкания, катушка заряжается.
      dutycheck = false; // больше сюда на заходим до следующего замыкания
    }
    if(ignitionOffset == true && micros() - startDuty >= ignitionAdvance) { // если установлен флаг опережения то вычисляем момент искры
      GPOC = (1 << OUT); // отключаем катушку (ИСКРА) LOW
      //digitalWrite(OUT, LOW);
    } else {
      GPOS = (1 << OUT); // включаем катушку (ЗАРЯДКА) HIGH
      //digitalWrite(OUT, HIGH);
    }
  } else { // иначе выключаем катушку зажигания
    GPOC = (1 << OUT); // отключаем катушку, так как двигатель простаивает LOW
    //digitalWrite(OUT, LOW);
  }
}
Грязный хак, однако помогает, мотоцикл едет, совсем иногда поддёргивается, допускаю что надо чуть обогатить смесь.
 
Изменено:

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
Пришло время подвести итоги. После большого количества безуспешных испытаний, было решено перенести всё в proteus и протестировать алгоритм в нормальной обстановке. Для этого "собрал" схему для симуляции дребезга, и вот что у меня получилось:
2023-09-08_22_51_31.png
2023-09-08_22_52_10.png
2023-09-08_22_52_59.png

Алгоритм стабильно держит синхронизацию даже в самых худших условиях, пожалуй которые можно себе представить. Жёлтый луч - это эталон с генератора сигналов; красный это после обработки "дребезгатором", а синий это выходной-инвертированный.
Архив со всем необходимым для симуляции в proteus находится во вложении.

А вот собственно скетч для esp8266:

C++:
#define IN 4
#define OUT 5

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); // D2 от прерывателя
  pinMode(OUT, OUTPUT); // D1 к драйверу
  pinMode(2, OUTPUT); // LED
  digitalWrite(2, LOW); // LED ENABLED
}

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

/*
* Все измерения производятся относительно состояния прерывателя.
* Логика инверсная: если на входе 0, то на выходе 1.
* Когда прерыватель замкнут, на входе 0.
             oldTime                   midTime             newTime
                \                         |                  /
                 \                        |                 /
                  x===================x   |                x
                  #                   #   |                #
                  #                   #   |                #
                  #       HIGH        #   |     LOW        #
                  #                   #  /                 #
                  #                   # /                  #
                  #                   #/                   #
                  x                   x====================x
                                  
                                      <-ignitionAdvance->
                                
                                      <-----chargeTime----->
                              
                  <-delay->           <-delay->
                
                  <---------------periodTime--------------->
*/

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

  if(interruptor == HIGH && oldInterruptor == LOW) { // момент когда прерыватель разомкнулся
    GPOC = (1 << OUT); // отключаем катушку в любом случае (ИСКРА) LOW; digitalWrite(OUT, LOW);
    oldInterruptor = interruptor; // oldInterruptor = HIGH
    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 (rpm > 40) {
      delayMicroseconds(periodTime/5); // в рабочем цикле
    } else {
      delayMicroseconds(5000); // во время пуска
    }
  }

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

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

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

Расчёты коэффициентов взял с сайта customcult с небольшими поправками.

С таким кодом откатал уже 200 километров. Кто бы что ни говорил, а даже двухтактный мотор с ФУОЗ ведёт себя значительно резвее, и это на контактном прерывателе, где так или иначе возникают неточности.

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

Продублирую схему:
esp8266_ignition-.JPG

P.S. провод от прерывателя намотал на ферритовое кольцо, пару витков, а бронепровод пропустил через ферритовую бусину взятую из какого-то импортного телевизора (из строчной развёртки), так же входные провода коммутатора намотал несколько витков на ферритовое кольцо. Незнаю насколько все эти меры помогают, но если бы я начал делать всё с самого начала, то сигнальный провод от прерывателя пустил бы в экранированном проводе.
 

Вложения

Изменено:
  • Лойс +1
Реакции: UJV 5901

Геннадий П

★★★★★★✩
14 Апр 2021
1,871
599
44
1695670290658.png
Параллельное включение конденсатора к кнопке, очень много замыканий контактов. Что же может пойти не так? :unsure:
(подсказка: через определенное кол-во времени еще бОльший дребезг из-за обгорания контактов)
 

user314

✩✩✩✩✩✩✩
26 Апр 2022
16
5
@Геннадий П,

Вы хоть понимаете, что от 5-ти вольт с таким номиналом конденсатора, такому контакту (который обычно коммутирует катушку зажигание), что слону комариный укус? Конденсатор здесь служит для дополнительного подавления высокочастотных помех и не более.

Я бы больше предпочёл бояться дребезга от вибрации мотора (особенно в моменты набора оборотов) и высокочастотных помех которые идут от бронепровода.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,871
599
44
такому контакту (который обычно коммутирует катушку зажигание), что слону комариный укус
А если комаров миллион?
Вы же хоть раз в жизни разряжали конденсатор путем закорачивания контактов, хорошо же щелкает. Вот тут то же самое, только в микроскопических масштабах. А сейчас представьте сколько таких микроразрядов происходит. Вот именно из-за этого чаще всего выходят из строя кнопки во всяких мышках, особенно если инженеры поставили подобный конденсатор для уменьшения дребезга.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,304
949
58
Марий-Эл
Знаю по своему детству. На двухтактном двигателе "Д6" без этого кондёра на 0.1 мкФ мопед не едет. Двигатель неустойчиво работает.
Контакты ни разу не обгорали. На УАЗ с контактным зажиганием он то же стоит.