Пару лет назад начала периодически появляться ошибка о недостаточной эффективности катализатора. Ну, не удивительно, авто около 200...250 тыс. км проехало уже. Поставил обманку.
Обманка работала хорошо, но потом вышел из строя ввернутый в нее диагностический датчик кислорода, и при попытке вывернуть неисправный датчик я и обманку сломал.
Решил на замену и датчику кислорода и подыхающему катализатору сделать обманку заместо диагностического датчика кислорода.
Из старого хлама, лежащего без дела в гараже, было:
- какая-то плата от стиральной машины, плата от трубоукладчика и Ардуино Нано.
и
Обманку решил сделать по такой схеме:
Данная обманка берет сигнал с управляющего датчика кислорода и выдает на ЭБУ сигнал имитирующий диагностический датчик кислорода, примерно по такому закону:
Выходное напряжение колеблется в пределах 0,6 - 0,75 вольт:
А также данная обманка имитирует изменение сопротивления нагревателя датчика кислорода в процессе разогрева - сопротивление нагревателя [ступенчато] меняется от 10 до 19 Ом.
Сделал. Установил на авто:
Для разработки ПО привлек сына, а тот привлек chatGPT :-))), и выдал готовый текст программы. Программа оказалась неработоспособной, и пришлось мне самому дорабатывать до готовности :-)))
// Определения пинов
#define RELAY_0_PIN 12
#define RELAY_1_PIN 10
#define RELAY_2_PIN 8
#define RELAY_3_PIN 6
#define SENSOR_INPUT_PIN 0
#define PWM_OUTPUT_PIN 3
// Константы
#define VOLTAGE_THRESHOLD 90 // 0.45V в аналоговом виде (10-bit ADC)
#define PWM_DELAY 150 // Задержка в миллисекундах (0.15 сек)
#define RELAY_DELAY 8000 // Задержка в миллисекундах (8 сек)
#define LOW_OXYGEN_PWM 100 // ШИМ для 0.6V ()
#define HIGH_OXYGEN_PWM 127 // ШИМ для 0.70V ()
// Переменные состояния
unsigned long startTime = 0;
int lastSensorValue = 0; // Храним последнее считанное значение датчика
void setup() {
analogWrite(PWM_OUTPUT_PIN, 0); // Низкое напряжение на выходе сначала
// Настройка пинов для реле как выходы
pinMode(RELAY_0_PIN, OUTPUT);
pinMode(RELAY_1_PIN, OUTPUT);
pinMode(RELAY_2_PIN, OUTPUT);
pinMode(RELAY_3_PIN, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
// Изначально низкий уровень (реле выключены)
digitalWrite(RELAY_0_PIN, LOW);
digitalWrite(RELAY_1_PIN, LOW);
digitalWrite(RELAY_2_PIN, LOW);
digitalWrite(RELAY_3_PIN, LOW);
digitalWrite(LED_BUILTIN, LOW);
// Настройка PWM выхода
pinMode(PWM_OUTPUT_PIN, OUTPUT);
// Настройка таймера2 для Fast PWM (высокая частота)
TCCR2A = _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
delay(RELAY_DELAY);
digitalWrite(RELAY_0_PIN, HIGH); // Включаем реле 0
digitalWrite(LED_BUILTIN, HIGH );
delay(RELAY_DELAY);
digitalWrite(RELAY_1_PIN, HIGH); // Включаем реле 1
digitalWrite(LED_BUILTIN, LOW);
delay(RELAY_DELAY);
digitalWrite(RELAY_2_PIN, HIGH); // Включаем реле 2
digitalWrite(LED_BUILTIN, HIGH );
delay(RELAY_DELAY);
digitalWrite(RELAY_3_PIN, HIGH); // Включаем реле 3
digitalWrite(LED_BUILTIN, LOW);
}
void loop() {
// Чтение аналогового датчика (управляющий датчик кислорода)
int sensorValue = analogRead(SENSOR_INPUT_PIN);
// Избегаем лишних срабатываний из-за шума.
// Проверяем, изменилось ли значение датчика значительно
if (abs(sensorValue - lastSensorValue) > 3) { // Чувствительность: изменение больше, чем на 3 единицы ADC
lastSensorValue = sensorValue; // Обновляем последнее значение
// Управление ШИМ выходом (имитация диагностического датчика кислорода)
if (sensorValue > VOLTAGE_THRESHOLD) {
delay(PWM_DELAY);
analogWrite(PWM_OUTPUT_PIN, HIGH_OXYGEN_PWM); // Низкий кислород, 0.7V
} else {
delay(PWM_DELAY);
analogWrite(PWM_OUTPUT_PIN, LOW_OXYGEN_PWM); // Высокий кислород, 0.6V
}
}
}
Работает приемлемо - чек не горит, ошибка Р0140 пропала совсем, но вот имитирует сопротивление нагревателя этот вариант обманки не очень хорошо - в памяти все равно висит ошибка Р0141 ( "Нагреватель ДК2 неисправен").
12 июля 2025г.
Померял сопротивление нагревателя ДК1 в процессе разогрева, нашел , что сопротивление меняется от 10 до 27 ом. Соответственно, попытался добиться нормальной работы обманки, увеличив сопротивление резисторов:
Однако, это ничего принципиально не изменило, в памяти остается висеть ошибка Р0141 ( "Нагреватель ДК2 неисправен").
27 июля 2025г.