ТАХОМЕТР – ЭКОНОМАЙЗЕР - ВОЛЬТМЕТР.

 

 

Для того чтобы экономайзер, функции которого входят в этот прибор, реагировал на изменения частоты вращения двигателя максимально быстро, частоту оборотов нужно измерять методом измерения длительности периода оборота коленвала. На один оборот коленвала приходятся две искры, поэтому период между двумя соседними искрами будет в два раза меньше, чем период одного оборота коленвала, частоту оборотов коленвала в этом случае можно определить по формуле: ω[об/с] = 1 / (2 * T[с]); ω[об/мин] = 30 / T[с].

Максимальная частота вращения коленвала составляет 6000 об/мин, или 100 об/сек (об/сек). Следовательно, минимальная длительность между искрами зажигания составляет 5msПрименим кварцевый резонатор на Clk = 16 Mhz. Зададим коэффициент деления предделителя таймера / счётчика T/C3 равным 64 (TCCR1B = 0b011), тогда таймер будет работать на частоте 16000000 / 64 = 250000 Hz, а длительность измерительного импульса составит 1 / 250000 = 4us, что в 1250 раз меньше минимально возможной длительности между соседними искрами.

Частота оборотов двигателя в этом случае должна вычисляться по формуле:  print [об /мин] = 250000 * 30 / T[имп.] = 7500000 / T[имп.], но для того чтобы сделать дискретность показаний тахометра, кратной 50, воспользуемся формулой: print = (150000 / T_mid) * 50, где

T_mid – усредненное значение T.

 

Алгоритмы обработки прерываний.

 

1) Обработка прерывания при приходе фронта импульса на  вход ICR3.

Fr = ICR3;                                          // Присваиваем переменной Fr значение из регистра захвата ICR3

T_old = T;                                          // Сохраняем длительность предыдущего периода

T = OF * 65535 + Fr - Fr_old;           // Вычисляем длительность пройденного периода

T_mid = (T_old + T) / 2;                     // Находим усреднённое значение всех периодов по ЦФПП

OF = 0;                                              // Сбрасываем счётчик переполнений счётного регистра TCNT3 таймера

Fr_old = Fr;                                        // Сохраняем время прихода фронта, вызвавшего это прерывание

 

2) Обработка прерывания при переполнении T/C3.

OF++;                                                                                               // Инкрементируем счётчик переполнений счётного регистра TCNT3 таймера

print = ((unsigned long)300000 / (unsigned long)T_mid) * 25;             // расчёт [об/мин]

ADCSRA = ADCSRA | 0b01000000;                                              // Запуск АЦП преобразования.

 

3) Обработка прерывания при завершении АЦП.

sei();                                                                                                    // Разрешение вложенных прерываний

print2_ = ADCW * 10 / volt_cor;                                                      // Напряжение бортовой сети (volt_cor – нужно подбирать).

 

Модуль экономайзера - если контакт на карбюраторе замкнулся на корпус, а T < 3600,

что эквивалентно ω > 2100, но значения периода обновляются значительно чаще, то теряет питание электромагнитный клапан холостого хода.

if          ((PIND & 1) == 0) PORTB = PORTB & 0b01111111;        // Если педаль газа нажата: PD0 = 0, то клапан ХХ НЕ ОТКЛЮЧАТЬ.

else                                                                                                    // Если же педаль газа отпущена: PD0 = 1, то

{

if (T < 3600)    PORTB = PORTB | 0b10000000;      // при ω > 2100 = ωon ОТКЛЮЧИТЬ клапан ХХ,

else PORTB = PORTB & 0b01111111;                    // а при ω < 2100 = ωon клапан ХХ НЕ ОТКЛЮЧАТЬ (ВКЛЮЧИТЬ).

}

Этот алгоритм прост, но не совершенен. При Ton = 3600[имп] (ωon = 2100[об/мин]) подача топлива возобновляется, а хорошо это только в том случае, если торможение происходит при разгруженном двигателе, при большем значении Ton двигатель успеет заглохнуть по инерции. Если же включена передача, а Ton = 3600, то подача топлива возобновится слишком рано, будет происходить неоправданный расход топлива.

Таким образом, системе нужно знать – нагружен двигатель, или нет, и в зависимости от этого изменять значение Ton . Изменять его можно в зависимости от скорости падения оборотов двигателя, то есть при быстром падении оборотов двигателя (когда двигатель не нагружен), переменной Ton следует присвоить значение в районе 3600 [имп], а при медленном (когда двигатель нагружен) - значение в районе 7500 [имп]. Степень торможения можно выразить переменной  (signed char) a = ((unsigned long) T – (unsigned long) T_old) / antysens, чем она больше, тем сильнее торможение.

if (a > 1) T_on = 3600;

else T_on = 9500;

if          ((PIND & 1) == 0) PORTB = PORTB & 0b01111111;        // Если педаль газа нажата: PD0 = 0, то клапан ХХ НЕ ОТКЛЮЧАТЬ.

else                                                                                                    // Если же педаль газа отпущена: PD0 = 1, то

            {

                        if (T < T_on)    PORTB = PORTB | 0b10000000;     // при f > Ton ОТКЛЮЧИТЬ клапан ХХ,

                        else PORTB = PORTB & 0b01111111;                    // а при f < Ton клапан ХХ НЕ ОТКЛЮЧАТЬ (ВКЛЮЧИТЬ).

            }

При регулировке необходимо подобрать коэффициент antysens, делать его следует как можно больше, но увеличивать его можно только до тех пор, пока двигатель при резком отпускании газа, при разгруженном двигателе не начнёт глохнуть.

 

Добавим в систему индикацию отсутствия искры, если в ожидаемый промежуток времени на вход прибора не поступил сигнал с катушки зажигания, то на индикаторе должен отобразиться сигнал ошибки, это позволит во время движения контролировать стабильность работы системы зажигания. Будем выводить на дополнительный разряд индикатора букву E, если искра не появляется дольше, чем 2 * T, то есть время, соответствующее двум периодам предыдущего такта.

И так, у нас есть значение Fr, например = 65535 (сейчас OF станет = 1, а TCNT3 продолжит счёт с нуля, при OF = 1), пусть T = 32800. Рассчитаем время ожидания искры (в импульсах): Tw = Fr + T * 2 = 65535 + 32800 * 2 = 196605.

(unsigned long) tc = TCNT3 + OF * 65535;               // Вычисляем истинное значение в T/C3

(unsigned long) Tw = Fr + T * 2;                                 // Вычисляем время ожидания искры

// Передаём в “LCD” параметры tc и Tw.

if (tc > Tw)        {

PORTC = 0b10000000;

PORTA = 0b11111001;                                 /* E. нет искры*/

_delay_loop_2(ms);

}

 

Можно добавить в прибор второй экономайзер: если обороты двигателя превысят, например 3500[об/мин], то перекроется подача топлива. Для этого потребуется дополнительный клапан на линии подачи топлива. Конечно, следует предусмотреть возможность отключения такого экономайзера.

 

 

Исходный код



Используются технологии uCoz