pomiar imulsow itp

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Arko
-
Posty: 16
Rejestracja: 02 gru 2006, 11:04
Lokalizacja: okolice Kielc
Kontakt:

pomiar imulsow itp

Post autor: Arko » 18 cze 2009, 20:50

Cześć.
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 :) więc nie czepiam się.. ale...
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

MiW
Użytkownik
Posty: 226
Rejestracja: 28 sty 2007, 11:32
Lokalizacja: Kraków
Kontakt:

Post autor: MiW » 22 cze 2009, 22:05

Nie wiem czy nie piszę zbyt późno, ale może coś się jeszcze przyda.

By sprytnie mierzyć czas dodatniego poziomu logicznego można ustawić zewnętrzne przerwanie na reakcję na każdą zmianę logiczną.
W procedurze obsługi przerwania sprawdzamy czy stan jest niski czy wysoki.
Jeżeli wysoki (zmienił się z niskiego) -zapisujemy pełny okres odczytany z timera i zerujemy timer.
Jeżeli niski - zapisujemy czas trwania stanu wysokiego odczytany z timera.

Podejrzewam, że chciałbyś poradzić sobie jeszcze z prędkością.
Ustawiamy drugi timer na odmierzanie sensownego czasu (przerwanie na przepełnienie)
Do drugiego przerwania zewnętrznego podpinamy czujnik drogi. W procedurze obsługi zwiększamy zmienną oznaczającą przejechaną drogę.
A prędkość to droga przejechana w jednostce czasu. W przerwaniu timera wystarczy więc odjąć wartość drogi "z poprzedniego przerwania" od aktualnej.

W identyczny sposób możesz obliczyć przyspieszenie - w tym samym przerwaniu timera :razz:

Zdaj relację z chwilowego zużycia paliwa zmierzonego w Twoim cudzie techniki.

ODPOWIEDZ