суббота, 22 июля 2017 г.

Система зажигания Оки на ардуино продолжение


Новая прошивка, с которой сейчас ездию.
Версия № 22 (08.09.2016)

int dh = 2;   //вход - датчик холла. спаду импульса (с 1 на 0) должен происходить момент зажигания
int dh2 = 5;   //вход - другой датчик холла.
int sz1 =  3;  //выходы на полевики свечей зажигания
int sz2 =  4; 
int ind =  13; 

bool dh_old =LOW;//старое и текущее состояние сигнала от ДХ
bool dh_new = LOW;
bool dh_front=LOW;  
bool dh_spad=LOW;//по спаду импульса с дх срабатывает
bool dh2_old =LOW;
bool dh2_new = LOW;
bool dh2_spad=LOW;
bool dh2_front=LOW;

bool first;//чередовать искры
unsigned long t0;//фиксированный момент времени. Использую для засекания промежутков времени
unsigned long t1;//время первого  фронта ДХ2
unsigned long dt;//временной интервал между текущим сигналом с ДХ и предыдущим.
unsigned long oborot;//количество оборотов в минуту
unsigned long oborot_old;
unsigned int i=8;//для завода
unsigned int j=1;//для завода
int p=0;//подтверждение сигнала
int p2=0;//подтверждение сигнала

bool flag;//фронт ДХ2 был
bool flag2;//спад от ДХ2 был и между фронтом и спадом не больше 2 секунд, причем этот спад и фронт ПЕРВОГО ИМПУЛЬСА после включения зажигания
bool flag_front;//флаг фронта импульса
bool flag_nak;//идет накопление
unsigned long t_nak;//время с момента накопления
unsigned long t_front;//время c фронта импульса с ДХ

void setup() {
  pinMode(dh, INPUT);      //инициализация входов и выходов
  pinMode(dh2, INPUT);     
  pinMode(sz1, OUTPUT);    
  pinMode(sz2, OUTPUT);    
  pinMode(ind, OUTPUT); 
  dh_old=digitalRead(dh); 
  digitalWrite(sz1, LOW); //берегу полевики
  digitalWrite(sz2, LOW);
  digitalWrite(ind, LOW);
  first=HIGH;
  flag=LOW;
  flag2=LOW;
  t0=0;
  t1=0;
  flag_front=LOW;
  flag_nak=LOW;
  }

void loop(){
dh_new=digitalRead(dh);   
dh2_new=digitalRead(dh2);
dh_front=LOW;
dh_spad=LOW;
dh2_front=LOW;
dh2_spad=LOW;
//ДХ спад
if((dh_new==LOW)&&(dh_old==HIGH)) {
if (digitalRead(ind)) {digitalWrite(ind, LOW);} else {digitalWrite(ind, HIGH);}
dh_spad=HIGH;
dt=millis()-t0;
oborot=60000.0/dt;
if (oborot<150||oborot>6000) {dh_spad=LOW;}//некондиция по оборотам, пропускаю сигнал
if (oborot>3*oborot_old) {dh_spad=LOW;}
t0=millis();
oborot_old=oborot;
}

//ДХ фронт
if((dh_new==HIGH)&&(dh_old==LOW)) {
dh_front=HIGH;
if (oborot<150||oborot>6000) {dh_front=LOW;}//некондиция по оборотам, пропускаю сигнал
if (oborot>3*oborot_old) {dh_front=LOW;}

}


//ДХ2 спад
if((dh2_new==LOW)&&(dh2_old==HIGH)) {
if(i==2) {//только если старт закончился
dh2_spad=HIGH;
}
}

//ДХ2 фронт
if((dh2_new==HIGH)&&(dh2_old==LOW)) {
if(i==2) {//только если старт закончился
dh2_front=HIGH;
if (!flag) {t1=millis();}
flag=HIGH;
}
}


dh_old=dh_new;
dh2_old=dh2_new;
////////////////////////////////////////////////////




if (dh2_spad) {//формирования flag2 - спад 1-го импульса, общая длительность импульса не более 1 с.
flag2=LOW;
if((millis()-t1<=1000)&&(t1>0)) {flag2=HIGH;}
}


if (!flag){
//завод машины
//4 мс = 8 градусов. т.е. сдвишка УОЗ первых искр 16 градусов. Затем убывает до 4 градусов.
// схема завода: 8 8 7 7 6 6 5 5...2 2 2 2...

if(dh_front){//обработка фронта от ДХ
}


if(dh_spad){//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
digitalWrite(sz1, HIGH); //формирую импульсы на катушку зажигания
digitalWrite(sz2, HIGH);
if ((i>2)&&(j==3)) {i-=1;j=1;}
delay(i);
if (i>2) {j+=1;}
digitalWrite(sz1, LOW);//отключаю землю от катушки, в это время проскакивает ИСКРА!!!
digitalWrite(sz2, LOW);
}//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
} else {///если железо попало в щель и первый фронт дх2 сформировался.
///////////////////////////////////////////////////////////////////////////////////
if(dh_front){//обработка фронта от ДХ
flag_front=HIGH;//флаг фронта, сохраняется до спада
t_front=millis();
}


//накопление энергии на катушках
if(!flag_nak&&flag_front){//формируется флаг на накопление//1
flag_nak=HIGH;//пора накоплять
t_nak=millis();
digitalWrite(sz1, HIGH);
digitalWrite(sz2, HIGH); 
}//1

if (flag_nak&&(millis()-t_nak>50)) {//защита ключей (если заглохла как-то неудачно)
digitalWrite(sz1, LOW);//отключаю землю от катушки, в это время проскакивает ИСКРА!!!
digitalWrite(sz2, LOW);
flag_nak=LOW;
}

if(dh_spad){//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
digitalWrite(sz1, LOW);//отключаю землю от катушки, в это время проскакивает ИСКРА!!!
digitalWrite(sz2, LOW);
flag_nak=LOW;
flag_front=LOW;
}//обработка спада от ДХ, МОМЕНТ ЗАЖИГАНИЯ
}///если железо попало в щель и первый фронт дх2 сформировался.
}//loop

Описание работы системы зажигания с текущей прошивкой
Без чередования, сначала по заводе. Искусственно УОЗ сильно уменьшается, где-то до УОЗ0 минус 64 градуса, затем быстро растет до УОЗ0 минус 4 градусов. Сделано позднее зажигание при старте, чтобы завести можно было. А то при холодной машине стартер надрывается-колен вал пытается в обратку крутиться - слишком раннее зажигание. Накопление искры в мс: 8 8 7 7 6 6 5 5...2 2 2 2... Как раз 2 мс соответствуют 4-м градусам уменьшения УОЗ0.

Затем после срабатывания ДХ2 (засунуть шайбочку и вынуть) искра проходит точно по УОЗ0, искры на свечи подаются одновременно. Чередование убрал из-за помех. При фронте импульса на ДХ происходит накопление энергии катушек зажигания, при спаде - ИСКРА пробегает в обоих цилиндрах одновременно.

Впечатления от эксплуатации и доработки

Замучился с помехами. Чередование искры само меняется когда захочет, а не когда всовываю и высовываю шайбу в ДХ2. Короче, ДХ чередования искры (ДХ2) сам как хочет срабатывает.
Что только не делал, чтобы помеху убрать. Экранировал кабели, подключал к плюсу аккумулятора большой конденсатор, отключал вообще все потребители - все равно паразитные сигналы лезут...Плюнул и убрал чередование искры. Теперь просто две искры на две свечи одновременно. ДХ чередования искры (ДХ2) теперь в качестве переключателя режимов: завод и основной (работа мотора с искрой по спаду импульса от основного ДХ). Без режима завод на холодную не заводится - стартер надрывается, похоже в обратку коленвал крутит!!!

Ардуинка однажды сгорела, вообще не светилась, хотя напряжения приходили. Почему сгорела, так и не понял. Заменил - новая без проблем работает уже года 3.

А так работает движок прекрасно, ровно, спокойно. Мощнее стал, чем был прежде - это точно.



Схема, осциллограммы