> Эмулятор катализатора (второго лямбда зонда) Схема на микроконтроллере Attiny45
 Renemen
сообщение 24.05.12 - 07:51
Сообщение #1


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



Немного предыстории, чтобы было понятно для чего мне это было нужно:
В общем где -то с года 2 назад заменил дрыгатель F18B2 на F20B. Катался на мозгах от 1,8, но хотелось мне их заменить на соответствующие(не будем говорить об эффекте, просто хотелось и все). В общем поставил мозги от F20B6 и.. начались проблемы:
1) Эти мозги в качестве 1го датчика используют не простой лямбда зонд, а широкополосный laf-датчик(как на тоетах). Делать нечего - заменил ДК. В оригинальном исполнении этот датчик стоит прямо во впускном коллекторе, а у меня под двигателем уже, думал что будет плохо нагреваться, но все нормально, работает и так.
2) Мозги требуют 2й датчик кислорода, который типа диагностирует катализатор.
В моих старых мозгах от 1,8 - 2го датчика после катализатора даже не предусмотрено было(как и в выхлопной системе), варивать гайку в трубу под 2й датчик, как то нехотелось, к тому же сам катализатор у меня уже был удален и заменен на плямягасител. rolleyes.gif
В общем было решено ставить "обманку":

Итак, матчасть:
Обычно для этих целей выносят 2й датчик из основного потока газов путем вкручивания проставки. Либо вводят в цепь датчика простую времязадающую RC-цепочку.
Смысл этих манипуляций в том, чтобы сигнал 2го датчика отличался от 1го, другими словами работал с некоторым запозданием, достаточно даже 0,2-0,3 сек.
Поскольку датчика у меня небыло и даже штатного места под его у становку, вышеописаные способы отпадают. Т.к. ставить датчик ради того чтобы его же потом и обманывать - смысла нет никакого, лишняя деталь кароче.
Единственный вариант остается - взять сигнал с 1го датчика, модифицировать его и заслать на вход 2го датчика. Достаточно было бы опять же поставить RC-цепочку или что-то подобное.
Но! Всегда есть это чертово "НО"! 1й датчик то стоит широкополосный, и сигнал его радикально отличается от сигнала лямбда зонда!
Было испоробована масса вариантов просто тупо "на*№ать" мозг подсунув на вход разнообразные сигнала типа "замкнуть на массу, подать 0,8В, подать 0,5В, подать 0,2В, сделать зависимость от форсунок" но все это не принесло успеха, примерно на 2й-3й поездке мозг радостно зажигал джекичана!
Дело в том, что в мозгах заложен очень хитрый алгоритм проверки 2го датчика. Поскольку сигнал 2го датчика в обычном режиме всегда показывает "богатую смесь" 0,7-0,8В, т.к. катализатор дожигает весь остаточный кислород в выхлопных газах.
Чтобы проверить 2й датчик мозги намерянно, при езде по прямой без нагрузки на двигатель, в диапазоне оборотов от 2000 до 4000, игнорируя сигналй 1го датчика, начинают забеднять смесь вплоть до самого минимального прога (-28%) и если при этом никаких изменений сигнала 2го датчика не происходит - сразу смекают, что тут какая то фигня.

Другими словами, нам нужно расшифровать сигнал широкополосного датчика и когда он будет показывать бедную смесь - подать на вход 2го датчика напряжение 0,2В, а когда богатую или нормальную - 0,8В.
Всего то ничего.
А, забыл про ошибку подогрева 2й лямбды, мозги проверяют падения напряжения на шунте сопротивлением 0,1Ом в цепи подогрева лямбды.
Сопротивление подогрева лямбды примерно 10 Ом, сталобыть, когда включен подогрев на нагрев тартится 18Вт-20Вт, чтобы не делать печку из батареи резисторов(лампочек) и не растрачивать попусту такую мощность было решено увеличить сопротивление измерительного шунта в мозгах в 100 раз.
Заменив резистор шунта на 10 Ом, сопротивление подогрева получается 1000 Ом, что дает возможно использовать маленький резистор 0,25 Вт.

С сигналом от лямбды посложнее - Laf-датчик является источником тока в отличии от датчика лямбды, который является источником напряжения. Стало быть мозги меряют не напряжение на датчике, а ток который протекает через него. Ток через датчик колеблется от -20мА до +20мА прямопропорционально степени обеднения или обогащения смеси. Обычно ток протекает от -4 до 4 мА.
Чтобы измерить этот ток, необходимо внести в сигнальную цепть датчика сопротивление шунта и мерять подение на пряжения на нем. Логично что такое вмешательство может внести погрешность в измерении для самих мозгов и они будут формировать неправильную смес. По этому сопротивление шунта должно быть как можно меньше.
Поскольку микросхема Attiny45 способна усиливать сигнал на АЦП в 20 раз, решено было выбрать сопротивление шунта с большим запасом 0,5 Ом.
Вот такая схемка получилась:

Прикрепленное изображение


Как видно на схеме, я использовал еще сигнал тахометра, в основоном это нужно для отключения стартера при автозапуске сигнализации, но так же сигнал тахометра используется для изменения временной задержки формирования сигнала 2го датчика, для пущей правдоподобности. По большому счету эту часть схемы можно исключить.
Сигнал датчика 2го формируется с помошью ШИМ.
Листинг программы на басике:

Содержание:

Код
$regfile = "attiny45.dat"
$crystal = 8000000

Config Pinb.2 = Input
Config Portb.0 = Output
Config Portb.1 = Output
Config Int0 = Falling
Config Timer0 = Pwm , Compare A Pwm = Disconnect , Compare B Pwm = Clear Up , Prescale = 1
Config Timer1 = Timer , Prescale = 64
Adcsra = &B10000111                                         ' делитель 128                                         '
Adcsrb = &B10000000                                         ' 2х полярный вход ADC

Dim Cont_t1 As Byte
Dim Cont_imp As Byte
Dim Tacho(20) As Word
Dim Tachobuff As Byte
Dim Tachoready As Byte
Dim I As Byte
Dim Ti As Byte
Dim Rpm As Long
Dim Adczero As Integer
Dim Oxytime As Word
Dim Oxybuff(25) As Integer
Dim Oxypwm As Integer
Dim Oxymaxbuff As Byte
Dim Oxysum As Integer
Dim Oxystat(10) As Integer
Dim Stattime As Byte
Dim Stati As Byte
Dim Adctime As Byte
Dim Laflo As Byte
Dim Lafhi As Byte
Dim Reg As Byte

On Int0 Int0_int
On Timer1 Tim1_ovf

For I = 1 To 20
   Tacho(i) = 65535
Next I
Tachobuff = 4
Tachoready = 5

Oxymaxbuff = 25
Oxytime = 6120                                              'Время на "прогрев" 2го ДК

Enable Int0
Enable Timer1
Enable Interrupts
Config Watchdog = 1024
Reset Watchdog
Start Watchdog

Do
   Rpm = 0
   For I = 1 To Tachoready
      Rpm = Rpm + Tacho(i)
   Next I
   Decr I
   Rpm = Rpm / I
   Rpm = 3750000 / Rpm
   If Rpm > 350 Then Portb.0 = 1
   If Rpm < 270 Then Portb.0 = 0
   If Rpm > 1500 Then
      If Rpm > 2500 Then
         If Rpm > 3500 Then
            If Rpm > 4500 Then
               Tachobuff = 19
               Oxymaxbuff = 12
            Else
               Tachobuff = 17
               Oxymaxbuff = 16
            End If
         Else
            Tachobuff = 14
            Oxymaxbuff = 19
         End If
      Else
         Tachobuff = 9
         Oxymaxbuff = 22
      End If
   Else
      Tachobuff = 4
      Oxymaxbuff = 25
   End If
   If Adctime > 15 Then
      Adctime = 0
      Incr Stattime
      For I = 25 To 2 Step -1
         Oxybuff(i) = Oxybuff(i - 1)
      Next I
      Admux = &B10010111                                            'Усиление 20x, 2,56V
      Set Adcsra.6
      Bitwait Adcsra.6 , Reset
      Laflo = Adcl
      Lafhi = Adch
      If Lafhi.1 = 1 Then
         Lafhi = Lafhi Or 252
      End If
      Oxybuff(1) = Lafhi * 256
      Oxybuff(1) = Oxybuff(1) + Laflo
      Oxybuff(1) = Oxybuff(1) + Adczero
      Oxysum = 0
      For I = 5 To Oxymaxbuff
         Oxysum = Oxysum + Oxybuff(i)
      Next I
      Oxysum = Oxysum / Oxymaxbuff
      If Oxytime < 1656 Then
         If Oxysum > 0 Then
            Oxypwm = 70 + Oxysum
         End If
         If Oxysum < 0 Then
            Oxypwm = 20 + Oxysum
         End If
         If Oxypwm < 0 Then Oxypwm = 0
         If Oxypwm > 90 Then Oxypwm = 90
      Else
         Oxypwm = Oxytime / 24
'         I = Rnd(10)
'         Oxypwm = Oxypwm + I
      End If
      Pwm0b = Oxypwm
      If Stattime > 30 Then                                 ' коррекция "нуля" на +/- 5 отчетов, каждые 30 сек
         Stattime = 0
         Incr Stati
         Admux = &B10010101                                 ' Калибровка входа PB4, 2,56V
         Set Adcsra.6
         Bitwait Adcsra.6 , Reset
         Laflo = Adcl
         Lafhi = Adch
         If Lafhi.1 = 1 Then
            Lafhi = Lafhi Or 252
         End If
         Adczero = Lafhi * 256
         Adczero = Adczero + Laflo
         Oxystat(stati) = Adczero
         Adczero = 0
         For I = 1 To 10
            Adczero = Adczero + Oxystat(i)
         Next I
         Adczero = Adczero / 10
         If Stati > 9 Then
            Stati = 0
         End If
      End If
   End If
   Reset Watchdog
Loop


Int0_int:

   Stop Timer1
   If Cont_t1 > 0 Then
      Incr Cont_imp
      Tacho(cont_imp) = Cont_t1 * 256
      Tacho(cont_imp) = Tacho(cont_imp) + Timer1
      If Cont_imp > Tachobuff Then
         Tachoready = Cont_imp
         Cont_imp = 0
      End If
   End If
   Timer1 = 0
   Cont_t1 = 0
   Start Timer1

Return

Tim1_ovf:

   Incr Cont_t1
   If Oxytime > 0 Then Decr Oxytime
   Incr Adctime
   If Cont_t1 > 250 Then
      For Ti = 1 To 20
         Tacho(ti) = 65535
      Next Ti
      Tachobuff = 4
      Tachoready = 5
      Cont_t1 = 0
   End If

Return



Программа обкатана уже около 1000 км, все в норме, джекичан повержен.

Скомпиленая прошивка:
Прикрепленный файл  Honda_O2_emu_2.0.hex.zip ( 2,41 килобайт ) Кол-во скачиваний: 740


Сообщение отредактировал Renemen - 09.08.12 - 12:01



           
 Starick
сообщение 24.05.12 - 15:13
Сообщение #2


Хондавод
*

Группа: .Хондаводы.
Сообщений: 125
Имя: Игорь
Город: Украина, Николаев.
Машина: Civic, MA9, D15Z3.

Репутация: 10



Хех...Прикольно забацал... Могу немного дополнить. Все верно сказал, что сигналом ШЗЛ служит значение тока. Это все сделано ради помехоустойчивости полезного сигнала, напряжение до мозгов нормально хер доведешь (особенно при малых его значениях). Но, могу сказать, что скорее внутрях мозга также стоит шунт (Хотя, там может и использоваться какой -нибудь преобразователь, типа ток-напряжение), на котором токовый сигнал преобразуется в сигнал напряжения. Поэтому, если конструктив позволяет, то можно было твою платку всунуть в сам мозг, и не морочиться с шунтом, а сигнал снимать непосредственно уже с родного шунта в мозгах. И еще. Это из теории шумов. Так как сигнал слабый снимается с шунта, то вместе с полезным сигналом ты усиливаешь так же и шумы, что иногда бывают соизмеримы с полезным сигналом. Тут либо увеличивать значение полезного сигнала (введением большего сопротивления шунта твоего), либо, опять же, снимать сигнал напряжения непосредственно в мозгах.
Ну а в целом, ситуация хорошего разработчика. Создал нестандартную ситуацию себе и нестандартно ее решил. biggrin.gif

Сообщение отредактировал Starick - 24.05.12 - 15:17



           
 Renemen
сообщение 25.05.12 - 14:26
Сообщение #3


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



На счет сопротивления шунта- тоже думал какое выбрать, думал помехи будут и т.п. но нет, все четка меряется, почти микровольты. Где то читал, что у ацп типа в мегах стремные начальные 2 разряда типа шум один. Тут я не заметил этого, все очень пристойно, проц работает на 8 Мгц от внутреннего генератора, сама схема питается от внутреннего линейного стабилизатора 5В в мозгах.
В манауле еще есть прикольный геморой типа чтобы уменьшить шумы, преглагают проц загонять в сон, пока идет преобразование ацп. Мне это ессно не подходит, раз у меня еще тахометр.
А, на счет шунта в самих мозгах.. я ессно думал об этом, но там схема пипец какая сложная, там источник опорного напряжения какой то жуткий, примерно это выглядит так:

Прикрепленное изображение


Если в моих мозгах что-то подобное, я бы состарился раньше чем нашел бы что-куда идет, плата к тому же многослойная, похоже.
В общем я думаю что от шунта в 0,5 ома вреда никакого не будет. Специально сравнивал показания мозгов черед диагностику, с шунтом и без - никакой разницы ваще. Думаю шунт спокойно можно и больше брать.

Сообщение отредактировал Renemen - 25.05.12 - 14:31



           
 Flexd
сообщение 25.01.14 - 11:20
Сообщение #4


Хондавод
*

Группа: .Хондаводы.
Сообщений: 101
Имя: Александр
Город: Чебы
Машина: Accord VI 2.0

Репутация: нет



Цитата
Обычно для этих целей выносят 2й датчик из основного потока газов путем вкручивания проставки. Либо вводят в цепь датчика простую времязадающую RC-цепочку.
Смысл этих манипуляций в том, чтобы сигнал 2го датчика отличался от 1го, другими словами работал с некоторым запозданием, достаточно даже 0,2-0,3 сек.


Кто реально проделывал на наших 2ух литровых с широкополостной лямбдой что нибудь из этого? У меня горит чек и ругается на неэффективную работу катализатора.
Прикрепленное изображение

Делал такую схемку - не помогло, может конечно я повесил 1 МОм на другой сигнальный провод лямбды, но точно уверен что не на подогрев повесил.

Сообщение отредактировал Flexd - 25.01.14 - 11:20



           
 Victor2014
сообщение 07.02.14 - 16:25
Сообщение #5


Новенький


Группа: .Хондаводы.
Сообщений: 1
Имя: Victor
Город: Кишинев
Машина: civic

Репутация: нет



Добрый день.

Очень сильно заинтересовался вашим эмулятором ))
Хочу собрать свой, но для начало пытаюсь разобраться в программе, сам я совсем не давно увлёкся МК (PIC на ассемблере).

Помогите расшифровать название переменных:
Cont_t1 As Byte
Cont_imp As Byte
Tacho(20) As Word
Tachobuff As Byte
Tachoready As Byte
I As Byte
Ti As Byte
Rpm As Long - обороты
Adczero As Integer
Oxytime As Word
Oxybuff(25) As Integer
Oxypwm As Integer
Oxymaxbuff As Byte
Oxysum As Integer
Oxystat(10) As Integer
Stattime As Byte
Stati As Byte
Adctime As Byte
Laflo As Byte Слабый сигнал Laf
Lafhi As Byte Сильный сигнал Laf
Reg As Byte

Заранее благодарен.



           
 pent
сообщение 26.08.15 - 12:17
Сообщение #6


Новенький


Группа: .Хондаводы.
Сообщений: 1
Имя: сергей
Город: владивосток
Машина: интегра

Репутация: нет



Здравствуйте хочу собрать данную схему и возник острый вопрос фьзы заранее благодарен



           
 olegkonstantinov
сообщение 14.10.15 - 14:11
Сообщение #7


Новенький


Группа: .Хондаводы.
Сообщений: 1
Имя: Олег
Город: Москва
Машина: Honda Accord VII 2.0

Репутация: нет



Доброго времени суток, подскажите кто в курсе такая штука эмулятор катализатора будет работать на Honda Accord VII 2.0 2007г

Сообщение отредактировал olegkonstantinov - 14.10.15 - 14:12



           
 TOL
сообщение 15.10.15 - 03:12
Сообщение #8


Хондавод
*

Группа: .Хондаводы.
Сообщений: 374
Имя: Анатолий
Город: пригород ПК
Машина: CB+F23a obd2 ecu+T2C5+5lug+16rims

Репутация: 2



так на 7м аккорде же есть и лямбда вторая наверно и т.д. вкруть ее через проставку и забыть, зачем обманка электронная?






®
СВой
           
 300
сообщение 09.09.16 - 07:24
Сообщение #9


Новенький


Группа: .Хондаводы.
Сообщений: 1
Имя: Сергей
Город: Караганда
Машина: Nissan Sunny

Репутация: нет



Добрый день. Присоединяюсь по вопросу фьюзов.



           
 mara-tik
сообщение 13.09.16 - 15:45
Сообщение #10


Заслужен персональный rank title! (зовите админа или завхоза!)
**************

Группа: Модератор
Сообщений: 14.231
Имя: Нет данных
Город: Нет данных
Машина: Нет данных

Репутация: 105



300, чего?






®
v ro-SSII POL-nii byes-prye-DYEL

t.me/hondamotorru

t.me/+U5NDDbBAsfmurRff
           
 TheCos163
сообщение 05.08.20 - 22:59
Сообщение #11


Новенький


Группа: .Хондаводы.
Сообщений: 1
Имя: Денис
Город: Жигулевск
Машина: Honda Odyssey RA8 J30A 2003 г.

Репутация: нет



Цитата(Renemen @ 24.05.12 - 08:51 ) *
Немного предыстории, чтобы было понятно для чего мне это было нужно:
В общем где -то с года 2 назад заменил дрыгатель F18B2 на F20B. Катался на мозгах от 1,8, но хотелось мне их заменить на соответствующие(не будем говорить об эффекте, просто хотелось и все). В общем поставил мозги от F20B6 и.. начались проблемы:
1) Эти мозги в качестве 1го датчика используют не простой лямбда зонд, а широкополосный laf-датчик(как на тоетах). Делать нечего - заменил ДК. В оригинальном исполнении этот датчик стоит прямо во впускном коллекторе, а у меня под двигателем уже, думал что будет плохо нагреваться, но все нормально, работает и так.
2) Мозги требуют 2й датчик кислорода, который типа диагностирует катализатор.
В моих старых мозгах от 1,8 - 2го датчика после катализатора даже не предусмотрено было(как и в выхлопной системе), варивать гайку в трубу под 2й датчик, как то нехотелось, к тому же сам катализатор у меня уже был удален и заменен на плямягасител. rolleyes.gif
В общем было решено ставить "обманку":

Итак, матчасть:
Обычно для этих целей выносят 2й датчик из основного потока газов путем вкручивания проставки. Либо вводят в цепь датчика простую времязадающую RC-цепочку.
Смысл этих манипуляций в том, чтобы сигнал 2го датчика отличался от 1го, другими словами работал с некоторым запозданием, достаточно даже 0,2-0,3 сек.
Поскольку датчика у меня небыло и даже штатного места под его у становку, вышеописаные способы отпадают. Т.к. ставить датчик ради того чтобы его же потом и обманывать - смысла нет никакого, лишняя деталь кароче.
Единственный вариант остается - взять сигнал с 1го датчика, модифицировать его и заслать на вход 2го датчика. Достаточно было бы опять же поставить RC-цепочку или что-то подобное.
Но! Всегда есть это чертово "НО"! 1й датчик то стоит широкополосный, и сигнал его радикально отличается от сигнала лямбда зонда!
Было испоробована масса вариантов просто тупо "на*№ать" мозг подсунув на вход разнообразные сигнала типа "замкнуть на массу, подать 0,8В, подать 0,5В, подать 0,2В, сделать зависимость от форсунок" но все это не принесло успеха, примерно на 2й-3й поездке мозг радостно зажигал джекичана!
Дело в том, что в мозгах заложен очень хитрый алгоритм проверки 2го датчика. Поскольку сигнал 2го датчика в обычном режиме всегда показывает "богатую смесь" 0,7-0,8В, т.к. катализатор дожигает весь остаточный кислород в выхлопных газах.
Чтобы проверить 2й датчик мозги намерянно, при езде по прямой без нагрузки на двигатель, в диапазоне оборотов от 2000 до 4000, игнорируя сигналй 1го датчика, начинают забеднять смесь вплоть до самого минимального прога (-28%) и если при этом никаких изменений сигнала 2го датчика не происходит - сразу смекают, что тут какая то фигня.

Другими словами, нам нужно расшифровать сигнал широкополосного датчика и когда он будет показывать бедную смесь - подать на вход 2го датчика напряжение 0,2В, а когда богатую или нормальную - 0,8В.
Всего то ничего.
А, забыл про ошибку подогрева 2й лямбды, мозги проверяют падения напряжения на шунте сопротивлением 0,1Ом в цепи подогрева лямбды.
Сопротивление подогрева лямбды примерно 10 Ом, сталобыть, когда включен подогрев на нагрев тартится 18Вт-20Вт, чтобы не делать печку из батареи резисторов(лампочек) и не растрачивать попусту такую мощность было решено увеличить сопротивление измерительного шунта в мозгах в 100 раз.
Заменив резистор шунта на 10 Ом, сопротивление подогрева получается 1000 Ом, что дает возможно использовать маленький резистор 0,25 Вт.

С сигналом от лямбды посложнее - Laf-датчик является источником тока в отличии от датчика лямбды, который является источником напряжения. Стало быть мозги меряют не напряжение на датчике, а ток который протекает через него. Ток через датчик колеблется от -20мА до +20мА прямопропорционально степени обеднения или обогащения смеси. Обычно ток протекает от -4 до 4 мА.
Чтобы измерить этот ток, необходимо внести в сигнальную цепть датчика сопротивление шунта и мерять подение на пряжения на нем. Логично что такое вмешательство может внести погрешность в измерении для самих мозгов и они будут формировать неправильную смес. По этому сопротивление шунта должно быть как можно меньше.
Поскольку микросхема Attiny45 способна усиливать сигнал на АЦП в 20 раз, решено было выбрать сопротивление шунта с большим запасом 0,5 Ом.
Вот такая схемка получилась:

Прикрепленное изображение


Как видно на схеме, я использовал еще сигнал тахометра, в основоном это нужно для отключения стартера при автозапуске сигнализации, но так же сигнал тахометра используется для изменения временной задержки формирования сигнала 2го датчика, для пущей правдоподобности. По большому счету эту часть схемы можно исключить.
Сигнал датчика 2го формируется с помошью ШИМ.
Листинг программы на басике:

Содержание:

Код
$regfile = "attiny45.dat"
$crystal = 8000000

Config Pinb.2 = Input
Config Portb.0 = Output
Config Portb.1 = Output
Config Int0 = Falling
Config Timer0 = Pwm , Compare A Pwm = Disconnect , Compare B Pwm = Clear Up , Prescale = 1
Config Timer1 = Timer , Prescale = 64
Adcsra = &B10000111                                         ' делитель 128                                         '
Adcsrb = &B10000000                                         ' 2х полярный вход ADC

Dim Cont_t1 As Byte
Dim Cont_imp As Byte
Dim Tacho(20) As Word
Dim Tachobuff As Byte
Dim Tachoready As Byte
Dim I As Byte
Dim Ti As Byte
Dim Rpm As Long
Dim Adczero As Integer
Dim Oxytime As Word
Dim Oxybuff(25) As Integer
Dim Oxypwm As Integer
Dim Oxymaxbuff As Byte
Dim Oxysum As Integer
Dim Oxystat(10) As Integer
Dim Stattime As Byte
Dim Stati As Byte
Dim Adctime As Byte
Dim Laflo As Byte
Dim Lafhi As Byte
Dim Reg As Byte

On Int0 Int0_int
On Timer1 Tim1_ovf

For I = 1 To 20
   Tacho(i) = 65535
Next I
Tachobuff = 4
Tachoready = 5

Oxymaxbuff = 25
Oxytime = 6120                                              'Время на "прогрев" 2го ДК

Enable Int0
Enable Timer1
Enable Interrupts
Config Watchdog = 1024
Reset Watchdog
Start Watchdog

Do
   Rpm = 0
   For I = 1 To Tachoready
      Rpm = Rpm + Tacho(i)
   Next I
   Decr I
   Rpm = Rpm / I
   Rpm = 3750000 / Rpm
   If Rpm > 350 Then Portb.0 = 1
   If Rpm < 270 Then Portb.0 = 0
   If Rpm > 1500 Then
      If Rpm > 2500 Then
         If Rpm > 3500 Then
            If Rpm > 4500 Then
               Tachobuff = 19
               Oxymaxbuff = 12
            Else
               Tachobuff = 17
               Oxymaxbuff = 16
            End If
         Else
            Tachobuff = 14
            Oxymaxbuff = 19
         End If
      Else
         Tachobuff = 9
         Oxymaxbuff = 22
      End If
   Else
      Tachobuff = 4
      Oxymaxbuff = 25
   End If
   If Adctime > 15 Then
      Adctime = 0
      Incr Stattime
      For I = 25 To 2 Step -1
         Oxybuff(i) = Oxybuff(i - 1)
      Next I
      Admux = &B10010111                                            'Усиление 20x, 2,56V
      Set Adcsra.6
      Bitwait Adcsra.6 , Reset
      Laflo = Adcl
      Lafhi = Adch
      If Lafhi.1 = 1 Then
         Lafhi = Lafhi Or 252
      End If
      Oxybuff(1) = Lafhi * 256
      Oxybuff(1) = Oxybuff(1) + Laflo
      Oxybuff(1) = Oxybuff(1) + Adczero
      Oxysum = 0
      For I = 5 To Oxymaxbuff
         Oxysum = Oxysum + Oxybuff(i)
      Next I
      Oxysum = Oxysum / Oxymaxbuff
      If Oxytime < 1656 Then
         If Oxysum > 0 Then
            Oxypwm = 70 + Oxysum
         End If
         If Oxysum < 0 Then
            Oxypwm = 20 + Oxysum
         End If
         If Oxypwm < 0 Then Oxypwm = 0
         If Oxypwm > 90 Then Oxypwm = 90
      Else
         Oxypwm = Oxytime / 24
'         I = Rnd(10)
'         Oxypwm = Oxypwm + I
      End If
      Pwm0b = Oxypwm
      If Stattime > 30 Then                                 ' коррекция "нуля" на +/- 5 отчетов, каждые 30 сек
         Stattime = 0
         Incr Stati
         Admux = &B10010101                                 ' Калибровка входа PB4, 2,56V
         Set Adcsra.6
         Bitwait Adcsra.6 , Reset
         Laflo = Adcl
         Lafhi = Adch
         If Lafhi.1 = 1 Then
            Lafhi = Lafhi Or 252
         End If
         Adczero = Lafhi * 256
         Adczero = Adczero + Laflo
         Oxystat(stati) = Adczero
         Adczero = 0
         For I = 1 To 10
            Adczero = Adczero + Oxystat(i)
         Next I
         Adczero = Adczero / 10
         If Stati > 9 Then
            Stati = 0
         End If
      End If
   End If
   Reset Watchdog
Loop


Int0_int:

   Stop Timer1
   If Cont_t1 > 0 Then
      Incr Cont_imp
      Tacho(cont_imp) = Cont_t1 * 256
      Tacho(cont_imp) = Tacho(cont_imp) + Timer1
      If Cont_imp > Tachobuff Then
         Tachoready = Cont_imp
         Cont_imp = 0
      End If
   End If
   Timer1 = 0
   Cont_t1 = 0
   Start Timer1

Return

Tim1_ovf:

   Incr Cont_t1
   If Oxytime > 0 Then Decr Oxytime
   Incr Adctime
   If Cont_t1 > 250 Then
      For Ti = 1 To 20
         Tacho(ti) = 65535
      Next Ti
      Tachobuff = 4
      Tachoready = 5
      Cont_t1 = 0
   End If

Return



Программа обкатана уже около 1000 км, все в норме, джекичан повержен.

Скомпиленая прошивка:
Прикрепленный файл  Honda_O2_emu_2.0.hex.zip ( 2,41 килобайт ) Кол-во скачиваний: 740


Здравствуйте, а данный эмулятор будет работать на моторе J30A? Первый ДК широкополосный 4-х проводной. Есть ли возможность заказать данный эмулятор у вас? Понравился ваш подход к вопросу, не думаю что представленные в интернете обманки так же хорошо продуманы.



           
 
Теги
Нет тегов для показа


 



    
Текстовая версия · Удалить установленные форумом cookies · Отметить все сообщения прочитанными ·  Сейчас: 21.06.26 - 18:16