Всем привет!

 

Пару лет назад начала периодически появляться ошибка о недостаточной эффективности катализатора. Ну, не удивительно, авто около 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г.

                На главную страницу                     На страницу Мое Авто

 

              

Hosted by uCoz