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

10/16/2007 - 20:39

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

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

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

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

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

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

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

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

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

Прошивка

Можно скопировать текст между строчками - в текстовый редактор, подойдет NOTEPAD, и сохранить файл с расширением HEX. Такой файл можно будет использовать для прошивки микропроцессора.

-------------------
:020000040000FA
:10000000850186018B018101640083160030850023
:1000100001308600C730810083125F2014308D00CC
:1000200058208D0B1028542010308D000B1D1628E1
:100030000B118D0B16285F20542020203A201D28FC
:100040008C0120308E0005308D008B101630810021
:100050000B118B1C3328061C30288E0B33288C0A7E
:100060008B1020308E000B1D29288D0B26288C0C20
:100070008C1308005F200C080339013E8D008615A3
:100080004328502086118D0B41288C0C8C138C0C2E
:100090008C138C0A4C2858208C0B4B2854200800B9
:1000A00006150000061108008614000086100800DE
:1000B00086155020861150205020502008008611AF
:0C00C00050308D0050208D0B622808008D
:02400E00F13F80
:00000001FF
----------------------- 

Программа

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

;тахометр
 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

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

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