Если переход был зафиксирован, то сравнивается текущее значение периода вращения коленчатого вала и, если оно не более сохраненного, то длительность импульса делится пополам и записывается для последующей коррекции в (adrk,tmp):
call _make_ex ; подготавливаем adrk и tmp
clrf _status ; сбрасываем STATUS
rrf adrk,f ; делим на 2 длительность сигнала
rrf tmp,f ; "топливо"
return ; выход: в (adrk,tmp) - скорр. длительность
_make_ex movf tjdh,w ; записываем в adrk и tmp
movwf adrk ; подготовленное для коррекции значение
movwf o_inj_h ; длительности сигнала "топливо"
movf tjd,w ; в (o_inj_h,o_inj) вместо старого значения
movwf tmp ; длительности записываются скорректированное
movwf o_inj ; значение сигнала "топливо"
cr_inj_com Основная подпрограмма коррекции длительности сигнала “топливо”, аналогичная по структуре подпрограмме коррекции “зажигания”.
Вначале вызывается подпрограмма create_inj, определяющая переход на двойной счет сигнала “топливо”. Выходные результаты работы этой подпрограммы, записанные в регистрах (adrk,tmp) переписываются в пару (sumh,suml). Проверяется значение сигнала IDL - при равенстве нулю идем на уменьшение длительности сигнала на 25%.
В остальном все выполняется аналогично, как с коррекцией сигнала “зажигание: определение текущего интервала коррекции, чтение значения коррекции из внутреннего EEPROM, анализ прочитанного значения, коррекция значения, находящегося в паре (sumh,suml). По окончанию коррекции происходит уменьшение скорректированного значения на 25% , и прибавление текущего времени к полученному значению длительности. При выходе из подпрограммы анализируется флаг переноса, для определения переполнения старшего разряда времени окончания выдачи импульса.
Средняя длительность работы подпрограммы (при коррекции сигнала на 15% длительности) составляет 135 тактов.
make_inj_t Подпрограмма коррекции длительности сигнала “топливо”, выполняющая настройку длительности выходного импульса для каждой пары форсунок.
Вначале работы подпрограммы проверяется условие: достигла ли программа того момента времени, когда требуется начать выдачу импульса: вычисляется значение разности текущего времени и момента начала импульса. Если эта разность не более нуля, то определяется какой импульс (на какую пару форсунок) будет выдаваться в данном периоде:
btfss flagh,7 ; если очередь импульса 1,4 форсунок
goto m_i_t_1 ; идем туда
По значениям бита 7 регистра flagh определяется активная пара форсунок в данном периоде (“0” соответствует 1,4 форсункам, “1” - 2,3 форсункам). Далее эта часть программы разветвляется на две структурно одинаковые ветви, каждая из которых отвечает за свою пару форсунок.
Производится вызов подпрограммы cr_inj_com входными параметрами которой является значение измеренной длительности сигнала впрыска, находящееся в паре (tjdh,tjd). При выходе из этой подпрограммы анализируется флаг переноса (C общего регистра STATUS), и, при выполнении проверки, устанавливается флаг переноса для скорректированного значения. Следом за этим идет перезапись скорректированного значения из регистров (sumh,suml) в нужную регистровую пару (tj1h,tj1) или (tj2h,tj2).
check_inj1 (check_inj2) Подпрограмма, аналогичная check_outC, отвечающая за выходной сигнал “топливо” (соответственно за 1,4 и 2,3 форсунки). Подпрограмма анализирует флаг переполнения, и когда этот флаг сброшен, сравнивает значение текущего времени и момента прекращения выдачи импульса “топливо”. При положительном исходе проверок выдача импульса прекращается, устанавливается флаг окончания и подпрограмма заканчивает свою работу. Длительность работы подпрограммы 16 циклов.
2.4. Выбор элементной базы. Разработка принципиальной схемы
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.