Микропроцессорный светодиодный тахометр АЗЛК
Замена штатному тахометру, отображает светящийся столбик из 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
- Для комментирования войдите или зарегистрируйтесь