В научных статьях, где рассматриваются эти теоретические вопросы, формулы для вычисления УОЗ и других параметров имеют общий вид. Их невозможно вставить в алгоритм программы для вычисления численных значений величин.
Этот путь достаточно сложен, так как нет полной теории определения скорости горения в различных условиях, поэтому в данном случае требуются соответствующая проверка и корректировка углов опережения зажигания в процессе испытаний ДВС.
4. Пересчетом угла опережения зажигания, полученного при проведении испытаний, с одного вида топлива на другое в зависимости от скорости их сгорания в воздушной среде при различных составах смеси, температурах и давлениях с последующей корректировкой при доводочных работах.
Как видно, все эти варианты требуют проведения дополнительных |
|
специальных испытаний. |
И |
|
|
Разработанная нами модель ДВС имеет все необходимые датчики, а в качестве электронного блока управления (ЭБУ) для обработки сигналов с датчиков и управления исполнительными механизмами служит контроллер Ардуино. Через него система подключается к ноутбуку.
Основное достоинство разработанной модели и системы управления в том, что они позволяют сравнить несколько вариантов вычисления угла
опережения зажигания в |
различных |
режимах работы |
(при изменении |
|||||
|
|
|
|
|
|
Д |
|
|
скорости, нагрузки) и отра отать алгоритмы и программы управления в |
||||||||
учебной аудитории. |
|
|
|
|
А |
|
|
|
|
|
|
|
|
|
|
||
Для решения этой задачи нужно определить алгоритм вычисления |
||||||||
УОЗ в зависимости от |
|
ч сла о оротов коленчатого |
вала двигателя, |
|||||
нагрузки на него и нал |
|
|
б |
|
|
|
||
ч я детонации топлива (октанового числа бензина), |
||||||||
т. е. по аналогии с |
|
механ ческой |
системой |
управления УОЗ в |
||||
|
и |
|
|
|
|
|||
С |
|
|
|
|
|
|
||
распределителе системы зажигания, которая рассматривается в любом учебнике по электрооборудованию автомобилей. Отличие будет состоять в том, что величина коррекции УОЗ, вносимая вакуум-корректором, будет зависеть от частоты вращения вала ДВС: при увеличении частоты вращения она будет уменьшаться.
Алгоритм уменьшения угла опережения зажигания, вносимого вакуум-корректором с ростом частоты вращения двигателя, можно пояснить графически (рис. 53). При вычислении изменения УОЗ, вносимого вакуум-корректором, нужно умножать её на К, а затем добавлять к суммарному УОЗ.
На графике видно, что до 2000 об/мин вакуум-корректор вносит коррекцию на заданную величину угла, пропорциональную увеличению мощности. Далее величина вносимого угла опережения начинает линейно стремиться к нулю таким образом, что при 3500 об/мин величина
61
вносимого угла составит половину от выставленного, а при 5000 об/мин и на более высоких частотах вращения корректор перестаёт вносить коррекцию и выходной УОЗ остается без изменений.

К
1
0,5
0 |
|
2000 |
|
|
|
|
|
6000 |
|
|
n,об/мин |
|
4000 |
|
|
||||||||
|
|
|
|
|
Рис. 53. Изменение коэффициента влияния вакуум-коррекции на УОЗ
1.Начальное значение УОЗ = 10−12До – режимИхолостого хода.
2.При увеличении скорости вращения маховика от оборотов холостого хода до максимальныхАУОЗ увеличивается линейно на 20о. При этом используются сигналы с датчика скорости.
3.При увеличении механической нагрузки на ДВС (увеличении мощности) и нажатии на бпедаль газа (увеличении размеров отверстия дросселя) УОЗ увеличивается на 0 – 20о пропорционально уменьшению разряжения во впускномиколлекторе. Используются сигналы с датчика давления во впускном коллекторе.
Причем величинаС, на которую производится увеличение УОЗ, умножается на коэффиц ент, зав сящ й от скорости вращения (см. рис. 53).
4.При возникновении события «детонации» (вызывается легким ударом по датчику детонации) происходит прерывание программы, при котором обработчик прерывания скачкообразно увеличивает УОЗ на 5о, с последующим уменьшением его на 1° через каждые 10 циклов.
Упрощенный алгоритм программы для микроконтроллера модуля Ардуино представлен на рис. 54. Он меняется в процессе обучения.
После объявления глобальных переменных и инициализации устройств в секции setup() попадаем в главный цикл loop(), ждем верхнюю мертвую точку (ВМТ), запоминаем время ВМТ, ждем нижнюю мертвую точку (НМТ), заодно в цикле измеряем давление и определяем: минимальное или среднее. Запоминаем время НМТ, отнимаем от него время ВМТ, определяем длительность половины оборота, вычисляем скорость вращения, длительность поворота на 1°, коррекцию УОЗ по скорости, коррекцию по нагрузке (давлению во впускном коллекторе) в зависимости от скорости.
62
Начало
Объявление глобальных
переменных
Прерывание от
детонации
УОЗ =+5
|
|
|
|
Секция set() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
Настройка: |
|
|
|
|
|
|
|
|
|
|
Количество циклов. |
|
|||||||
|
|
|
1.Последовательного порта |
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
Счетчик циклов вкл. |
|
|||||||||||||||
|
|
|
2.Внешних прерываний |
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
3.Портов ввода/вывода |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
Цикл |
|
|
|
|
|
|
|
|
|
|
|
Возврат |
||||||
|
|
|
|
|
Прерывание от |
|
|
|
|
|
|
|||||||||||
|
|
|
|
Loop() |
детонации |
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Регистрация импульсов с |
|
|
|
|
|
И |
||||||||||||
|
|
|
|
датчиков скорости и давл. |
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Д |
|||||||
|
|
|
|
Проходит |
Нет |
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
ВМТ ? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
А |
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
Да |
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
Измерение давления. |
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
Определение минимума Р |
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
и |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
С |
|
|
Нет |
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
Проходбт |
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
НМТ ? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
Да |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вычисление УОЗ |
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
Счетчик после |
|
Нет |
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
прерывания=0? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
c=0? |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вычисление момента |
||||
|
|
|
|
Да |
|
|
|
|
|
|
|
|
|
|
зажигания, индикация |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Уменьшение УОЗ на 1О |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 54. Упрощенный алгоритм программы для управления УОЗ
63
Если было прерывание, уменьшаем счетчик циклов и УОЗ. Определяем время подачи искры, включаем светодиод индикации детонации, возвращаемся в начало цикла loop().
Один из вариантов программного кода управления УОЗ для контроллера Ардуино представлен ниже.
unsigned int uoz = 10; // устанавливаем глобальные переменные: unsigned int speed = 0; //угол опережения зажигания, скорость и unsigned int presure = 0; //давление
int rPin = A0; // устанавливаем входной штырек для АЦП
unsigned int rValue = 0; // значение напряжения с переменного резистора |
|
volatile int compar = 0; // величина на выходе компаратора - вывод 2 |
|
volatile int n = 0; // число измерений |
И |
|
|
volatile unsigned int pValue = 0; // цифровое значение напряжения с датчика
давления |
|
|
|
|
|
|
|
Д |
|
volatile unsigned long mAir; // сумма значений давления воздуха → масса |
|||||||||
воздуха |
|
|
|
|
|
А |
|||
volatile unsigned int kFiil; |
|
|
|||||||
|
|
|
|
|
|||||
void setup(){ |
|
|
|
б |
|
||||
|
pinMode(2, INPUT); |
|
|
|
|||||
|
|
|
|
|
|
|
|
||
|
pinMode(3, INPUT); |
и |
|
|
|
||||
|
Serial.begin(9600); |
|
|
// старт последовательного вывода данных (для |
|||||
тестирования) |
|
|
|
|
|
|
|
|
|
|
attachInterrupt(0, blink, RISING); |
// прерывание на цифровом входе 2 (по |
|||||||
|
|
С |
|
|
|
|
|
||
спадающему фронту FALLING) |
|
|
|
||||||
} |
attachInterrupt(1, blank, RISING); |
|
|
||||||
|
|
|
|
|
|
|
|
|
|
void loop(){ |
|
|
|
|
|
|
|
|
|
|
n = 0; |
|
|
|
|
|
|
|
|
|
delay(200); |
|
|
|
|
|
|
|
|
|
rValue = analogRead(rPin); |
|
// |
считываем значение с переменного |
|||||
резистора |
|
|
|
|
|
|
|
|
|
|
rValue = map(rValue, 0, 1023, 0, 255); //масштабируем |
||||||||
|
analogWrite(3, rValue); |
|
// Pin3 - выход ШИМ |
||||||
|
//Вывод на монитор |
|
|
|
|
|
|
|
|
|
Serial.print(a, DEC); |
|
// число измерений |
||||||
|
Serial.print(" mAir= "); |
|
|
|
|
|
|||
|
Serial.println(mAir/1024); |
//масса воздуха |
|||||||
} |
mAir=0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64
void blink() |
// |
Внутри функции значения, возвращаемые millis(), не |
|||||
изменяются, delay()не работает,Serial.println(); нельзя!!! |
|||||||
{ |
|
|
|
|
|
|
|
compar = LOW; |
|
|
|
|
|
|
|
while(compar == LOW){ |
|
|
|
|
|||
pValue = analogRead(A1); |
|
|
|
||||
compar = digitalRead(2); |
|
|
|
|
|||
for (int i=0; 100; i++) { |
|
|
|
|
|||
} |
|
|
|
|
|
|
|
pValue = pValue/16; |
|
|
|
|
|||
mAir += pValue; |
|
|
|
|
|
||
a++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
void blank() // |
|
|
|
|
|
|
И |
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
time = millis(); |
|
|
|
|
|
|
|
time_ms = time - otime; |
|
|
Д |
||||
otime = time; |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
return time_ms; |
|
|
|
|
А |
|
|
} |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
if(speed > 5000) // если скорость вращения больше 5000, то |
|||||||
|
|
|
|
б |
|
|
|
k = 0; // не учитываем изменение мощности |
|
||||||
if(speed > 2000) // если скорость вращения больше 2000, |
|||||||
|
|
|
и |
|
|
|
|
k = 1- (speed -2000)/3000; // вычисляем коэффициент влияния изменения |
|||||||
мощности |
|
|
|
|
|
|
|
} |
С |
|
|
|
|
||
float getHeading(){ |
|
|
|
|
|
||
float heading |
= |
|
atan2(scaled.YAxis, scaled.XAxis); // высчитываем |
||||
направление, корректируем значения с учетом знаков if(heading < 0) heading += 2*PI;
if(heading > 2*PI) heading -= 2*PI;
return heading * RAD_TO_DEG; // переводим в градусы
}
}
Следует иметь в виду, что приведенные в методических указаниях электрические схемы, алгоритмы и коды программ использовались для модели поршневой машины, описанной с целью обучения разработке устройств на базе микроконтроллеров. Копирование их в курсовые и дипломные проекты не будет поощряться преподавателем. Студентам нужно предлагать свои схемы и код.
65