Zmodyfikowałem nieco programik częstościomierza z oślej łączki na swoje potrzeby. Chce zmierzyć ilość impulsów, czas dodatniego zbocza. Częstotliwość pokazuje chyba dobrze, ilość impulsów również ładnie liczy. Problem jest z pomiarem dodatniego zbocza. Co ok 6 sekund pokazuje prawidłową wartość, następnie spada lub czasem rośnie :-/.
Tym testowym programikiem chce pomierzyć sygnał drogi i ilości wtrysków w aucie. Informacje te chce wykorzystać do budowy auto - komputera.
Temat ten jest popularny. Jeśli ktoś ma podobne doświadczenia, listingi niech się podzieli
ps. są też problemy z częstym resetem procesora, mam to wszystko w pajączku
sygnał symuluje naciskając ręcznie przycisk, mam długie kable indukuje się sieć 50Hz czasem (za przyciskiem jest tranzystor bc548), wejście podciągnięte do plusa R4,7k i do masy przez C 100n :-/...
procek atmega8, wejście timer1 pind.5, wejście liczące czas dodatniego zbocza pinb1, kwarc 8mhz.
Kod: Zaznacz cały
' C030e Częstościomierz do 2MHz - odmierzanie 1s za pomocą Timer0
'+ impulsy z hallotronu ze skrzyni +czas dodatniego zbocza(wtrysku benzyny)
$regfile = "m8def.dat" 'informuje kompilator o pliku 'dyrektyw mikrokontrolera
$crystal = 8000000
Config Pinb.1 = Input
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portd.4 , Db7 = Portc.0 , E = Portd.6 , Rs = Portd.7 'konfiguracja linii
'mikrokontrolera‚ do których dołączono wyświetlacz LCD
Dim Timebase As Word , Licznik As Byte , Pomoc As Word , Flaga As Bit
Dim Wynik As Long 'Dim Wynik as Single
Dim S As Byte
Dim Droga As Integer
'Dim Drg As Long
Dim Pb1 As Byte
Dim Twtrysk As Word
Dim Tempczas As Word
Dim Fpomiar As Bit
Config Timer1 = Counter , Edge = Rising : Enable Timer0
Config Timer0 = Timer , Prescale = 64 : Enable Timer1
Enable Interrupts : On Timer0 Licz : On Timer1 Zwieksz Nosave
Timebase = 490 'bo 8mhx/1(prescaler)/255(timer0 pracuje w 8 bit czyli do 255) =31372, przerwanie co 32us :) 'teoretycznie 15625, u mnie trzeba było wpisać 15620
Droga = 0 'jesli prescale = 8 to przerwanie co 255us ,3921 sekunda
Twtrysk = 0 'prescale = 64 przerwaie co 2ms, 490 sekunda
Tempczas = 0
Cls
Lcd "Miernik czestotl"
Wait 1
Cls
'Set Pinb.1
Do
If Flaga = 1 Then 'co 1 sekundę
Flaga = 0 'jednorazowo
'Reset Fpomiar
'Droga = Timer1
Gosub Wyswietl 'wyświetl wynik pomiaru
Reset Fpomiar
End If
Loop : End
Licz: 'Timer0 przepełniony co 32us
Decr Timebase ' zmniejsz licznik Tb
If Fpomiar = 0 Then '
If Pinb.1 = 1 Then 'jesli wtrysk zalaczony
Incr Tempczas 'zwieksza zmienna tymczasowa do obliczania czsu wtrysku
Else 'jezeli wtrysk wylaczony to oblicza czas wtrysku
Twtrysk = Tempczas * 2 '32 'ilosc prob pomnozone przez odstep czasu miedzy probami [us * 10]
Tempczas = 0
Set Fpomiar 'ustawienie flagi ma powodowac zatrzymanie pomiaru dodatniego zbocza (liczy jedno zbocze na sekunde)
End If
End If
'Droga = Timer1
If Timebase = 0 Then 'po odliczeniu 1 sekundy:
Pomoc = Timer1 'przepisz stan licznika do zmiennej Pomoc
Timer1 = 0 'wyzeruj licznik - niech liczy dalej
Wynik = Licznik 'przepisz stan licznika przepełnień
Droga = Droga + Pomoc 'sumuje ilosc impulsow !!!
Licznik = 0 'potem wyzeruj też licznik przepełnień
Timebase = 490 'przerwanie co 2ms 2ms*490 = 1 sekunda
Flaga = 1 'flaga do wyświetlenia wyniku raz na sekundę
Incr S
If S = 59 Then
S = 0
End If
End If : Return 'koniec procedury obsługi przerwania
Zwieksz: 'obsługa przerwania - przepełnienie Timer1
Incr Licznik
'Incr Drg
Return 'odnotuj kolejne przepełnienie Timer1
Wyswietl:
Shift Wynik , Left , 16 'to samo co: Wynik = Wynik * 65536
'Wynik = Wynik * 65536 '- sprawdź długość kodu z mnożeniem
Wynik = Wynik + Pomoc 'dodaj zawartość licznika
Locate 1 , 1
Lcd "F= " ; Wynik ; "Hz " 'wyświetl wynik
Locate 2 , 1
Lcd S ; " sekundnik " 'sprawdzam czy dobrze policzone przerwania itp.
Locate 3 , 1
Lcd Droga ; " impulsy "
Locate 4 , 1
'Twtrysk = Twtrysk / 1000
'P = Pinb.1
Lcd "T wtrsk. " ; Twtrysk ; "ms " ; Pinb1 'co 1s wyswietla wyniki
Cursor Off
Return[ Dodano: 2009-06-20, 13:15 ]
pomierzyłem sobie dziś autko, mam escorta 1.8 16V '92r.
oto wyniki może się komuś przydadzą:
F. wtrysku: 8Hz przy 900 obr/min do 50Hz przy 6000obr/min liniowa zależność.
sygnał z hallotronowego czujnika drogi: 500 impulsów na 100 metrów.
Tego nieszczęsnego dodatniego zbocza nie mierzy...
Ciekawi mnie jaki jest czas wtrysku paliwa. Przy 8Hz okres wynosi 125ms, a przy 50Hz okres równy jest 20ms. To ile ten czas może wynosić? Wiem z książki serwisowej, że nie jest stały w moim autku. Zwiększa się ze wzrostem obciążenia.
pozdro