Микропроцессорный светодиодный тахометр АЗЛК

Замена штатному тахометру, отображает светящийся столбик из 80-ти светодиодов

Отображает светящийся столб на шкале светодиодов, работает с КСЗ на УЗАМ Описание всей панели приборов, в которую установлен описываемый ниже тахометр, смотреть в статье Панель приборов АЗЛК.

Схема работает с контактной системой зажигания на УЗАМ. Будет ли правильно работать с другими двигателями, обещать не могу.

Микропроцессорный светодиодный тахометр АЗЛК

Дело в том, что во входной цепи нет никаких специальных элементов для устранения дребезга контактов, дребезг фильтруется программно. Программа считает, что прошел передний фронт импульса, если высокий сигнал на входе удерживается не менее заданного времени. Эта задержка подбиралась методом научного тыка. При уменьшении задержки показания станут завышенными из-за подсчета фронтов от дребезга, при увеличении задержки на большой частоте появляются пропуски в подсчете штатных импульсов.

В результате получилась программа, которая устойчиво работает и дает показания, совпадающие с показаниями тахометра от приборки RAR в дипазоне 500 - 5500 об/мин. Но нет гарантии, что эта схема будет работать с другими двигателями, или с другим типом системы зажигания, т.к. обосновать выбранную величину задержки я не могу ни чем, кроме проведенных испытаний.

Светодиоды подключены к выходам Out1-Out15 типа "открытый коллектор". Это позволило запитать диоды от 12В с последовательным включением по 4 диода. Микросхемы MBI уравнивают ток (и таким образом яркость свечения) при последовательном включении нескольких светодиодов в неполной цепочке. Такое включение также снижает потребляемый ток.

Тахометр подключается к стандартным выводам жгута проводки для подключения штатного тахометра.

Диапазон измерения 0-8000 об/мин с шагом 100 об/мин.

Прошивка

Можно скопировать текст между строчками - в текстовый редактор, подойдет NOTEPAD, и сохранить файл с расширением HEX. Такой файл можно будет использовать для прошивки микропроцессора.
[code]
-------------------
:020000040000FA
:10000000850186018B018101640083160030850023
:1000100001308600C730810083125F2014308D00CC
:1000200058208D0B1028542010308D000B1D1628E1
:100030000B118D0B16285F20542020203A201D28FC
:100040008C0120308E0005308D008B101630810021
:100050000B118B1C3328061C30288E0B33288C0A7E
:100060008B1020308E000B1D29288D0B26288C0C20
:100070008C1308005F200C080339013E8D008615A3
:100080004328502086118D0B41288C0C8C138C0C2E
:100090008C138C0A4C2858208C0B4B2854200800B9
:1000A00006150000061108008614000086100800DE
:1000B00086155020861150205020502008008611AF
:0C00C00050308D0050208D0B622808008D
:02400E00F13F80
:00000001FF
-----------------------
[/code]

Программа

Далее исходный текст программы для тех, кто может и задумает что-нибудь поправить.
[code]
;тахометр
list p=16F84A
#include
__config _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

; Константы
bitSDI equ 3
bitCLK equ 2
bitLAT equ 1
iniRPT equ 5
iniTMR equ d'022' ; d'100'
iniDBL equ d'032'

; Переменные
cntIMP equ 0x0C ; счетчик импульсов
cntRPT equ 0x0D ; счетчик повторов
cntDBL equ 0x0E ; счетчик времени дребезга контактов

; программа
org 0x000
clrf PORTA
clrf PORTB
clrf INTCON
clrf TMR0
clrWDT

bsf STATUS,RP0
movlw b'00000000' ; все биты RA на вывод
movwf PORTA
movlw b'00000001' ; RB0 на ввод, остальные биты порта на вывод
movwf PORTB ; выключаем подтягивающие резисторы,
movlw b'11000111' ; TMR0 на внутренний такт с предделителем 256
movwf OPTION_REG ; прерывания запрещены, будем проверять флажки
bcf STATUS,RP0

; пролог
; включить всю шкалу

call SendCLR
movlw d'20'
movwf cntRPT
loopPRE1
call SendQRT
decfsz cntRPT,f
goto loopPRE1
call SendLAT
; подождать 1 с = 16 тиков (1 тик = 64К мкс = 65 мс)
movlw d'16'
movwf cntRPT
loopPRE2
btfss INTCON,T0IF
goto loopPRE2
bcf INTCON,T0IF
decfsz cntRPT,f
goto loopPRE2
; выключить
call SendCLR
call SendLAT

; глобальный цикл
Main_loop
call COUNT_IMP
call SHOW_COUNT
goto Main_loop

COUNT_IMP ; фаза измерения

clrf cntIMP ; обнуляем сквозной счетчик
movlw iniDBL
movwf cntDBL ; инициализируем счетчик блокировки дребезга
movlw iniRPT
movwf cntRPT ; цикл подсчета импульсов
;(5 раз отсчет таймером по 60мс)
bcf INTCON,INTF
ms300
movlw iniTMR ; при 4Мгц и предделителе 1:256
; получается 1 тик таймера 256 мкс
movwf TMR0 ; TMR0 должен отсчитывать от 22
; до 256 в течение 59,904 мс
bcf INTCON,T0IF
ms60
btfss INTCON,INTF ; если был фронт импульса датчика,
; то идем на обработку счетчиков
goto NoINCR ; датчик молчит, идем проверять таймер
DoINCR
btfss PORTB,0
goto ClrINT ; если RB0=0, то сбрасываем прерывание
; если RB0=1, то
decfsz cntDBL,f ; задерживаем дальнейшие действия
goto NoINCR ; до обнуления счетчика дребезга
; закончилась задержка на время дребезга
incf cntIMP,f ; +1 в счечик импульсов
ClrINT
bcf INTCON,INTF ; сбросили флаг внешнего прерывания
movlw iniDBL
movwf cntDBL ; инициализируем счетчик блокировки дребезга
NoINCR
btfss INTCON,T0IF ; повторяем маленький цикл,
goto ms60 ; пока TMR0 не скажет: хватит!
decfsz cntRPT,f ; отсчитали 60 мс, нужно повторить 5 раз,
goto ms300 ; чтобы интервал отсчета получился 0,3 сек
; отсчитали 300 мс
rrf cntIMP,f ; делим сосчитанное число импульсов пополам
bcf cntIMP,7
return

SHOW_COUNT ; фаза индикации результатов измерения
; занулить биты индикатора
call SendCLR
; вывод непоного квартета шкалы
movfw cntIMP
andlw 3 ; остаток от деления на 4
addlw 1 ; +1
movwf cntRPT ; в счечик повторений
bsf PORTB,bitSDI
goto loopMOD+2 ; войти в цикл с проверки счетчика
loopMOD
call SendCLK
bcf PORTB,bitSDI
decfsz cntRPT,f
goto loopMOD
; вывод полных квартетов шкалы
rrf cntIMP,f
bcf cntIMP,7
rrf cntIMP,f
bcf cntIMP,7 ; целочисленное деление
;на 4 счетчика импульсов
incf cntIMP,f ; дает число полных квартетов шкалы
goto loopDIV+1 ; войти в цикл с проверки счетчика
loopDIV
call SendQRT
decfsz cntIMP,f
goto loopDIV
; переключение на индикацию нового замера
call SendLAT
return

; подпрограммы

SendCLK ; формирование тактового импульса CLOCK
bsf PORTB,bitCLK
nop
bcf PORTB,bitCLK
return

SendLAT ; вывод импульса защелки LATCH
bsf PORTB,bitLAT
nop
bcf PORTB,bitLAT
return

SendQRT ; вывод полного квартета
bsf PORTB,bitSDI ; для каждого полного квартета выводим 1000
call SendCLK
bcf PORTB,bitSDI
call SendCLK
call SendCLK
call SendCLK
return

SendCLR ; очистить шкалу
bcf PORTB,bitSDI
movlw d'80'
movwf cntRPT
loopCLR
call SendCLK
decfsz cntRPT,f
goto loopCLR
return

end
[/code]

Источник http://www.club.azlk.ru

Теги: 

 
 
Rambler''s Top100