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

10/16/2017 - 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://club.azlk.ru

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