Pomiar niskich czestotliwości na AVR-niestabilny

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
Awatar użytkownika
M@ciej
Użytkownik
Posty: 736
Rejestracja: 13 sie 2005, 21:38
Lokalizacja: Szczecin

Pomiar niskich czestotliwości na AVR-niestabilny

Post autor: M@ciej » 04 wrz 2012, 12:49

Witam.

Napisałem programik na Atmega16 na pomiar niskich (do 80Hz) częstotliwości. Listing poniżej. Program zlicza wewnętrzne impulsy co 100us na Timer0 i gdy przyjdzie zbocze na INT2, oblicza częstotliwość. Na INT2 podaję badany przebieg prostokątny.

Problem mój w tym, że wynik pomiaru (mierzony z dokładnością do 1 miejsca po przecinku) jest niestabilny właśnie na tym ostatnim miejscu. Dla częstotliwości do 25Hz niestabilności nie widać, ale powyżej, pomiar na ostatnim miejscu zaczyna skakać, najpierw co 0.1, potem więcej, nawet co 0,6 dla 80Hz.

Czym to jest spowodowane? Nie mogę sobie z tym poradzić. Mierzyłem przebieg We na oscyloskopie i ten jest stabilny. Procek napędzany kwarcem zewnętrznym 16MHz.

Kod: Zaznacz cały


$regfile = "m16def.dat"
$crystal = 16000000

Config Porta = &B00111011
Config Portb = &B11111010
Config Portc = &B00011111
Config Portd = &B11111111

Config Int2 = Rising
On Int2 Zlicz
Enable Int2
Config Timer0 = Timer , Prescale = 8
On Timer0 Czas
Enable Timer0
Load Timer0 , 200                                         
Enable Interrupts

Dim Czest As Single
dim licznik as word

Reset Portb.0
Ddrb.0 = 0                                                  'ustawiamy HiZ
Set Portb.2

Do

Rem tu wyświetlanie właściwego wyniku na wyświetlaczach LED
Loop
End

Zlicz:                                                      'przerwanie od INT2
 Stop Timer0
 Czest = 1 / Licznik
 Licznik = 0
 Start Timer0
Return

Czas:                                                       'zaglada tu co 100 us
 Load Timer0 , 200                                          'pomijamy 56 i każemy mu zliczyć tylko 200 wartości                                      
 Incr Licznik
 If Licznik > 5000 Then
  Licznik = 65535
  Czest = 0
 End If
Return

maxzwp
-
Posty: 36
Rejestracja: 31 sty 2006, 15:13

Post autor: maxzwp » 05 wrz 2012, 12:35

Jak często odświeżasz wynik pomiaru?
Dla częstotliwości powyżej 5Hz na pewno nie musisz mierzyć każdego okresu (bo i tak nie zdążysz go wyświetlić), a czas na timer start/stop i dzielenie 1/Licznik (operacja zmienno przecinkowa!) w każdym przerwaniu potęgują błąd.
Usuń obliczenia z przerwania, a Timer odpalaj i startuj na przemian (pomiar co drugiego okresu).

Możesz też zbierać po kilka pomiarów i wyświetlając ich średnią, to powinno ustabilizować wskazania.

ODPOWIEDZ