Metoda pomiaru częstotliwości.
Metoda pomiaru częstotliwości.
Witam serdecznie,
Szukam efektywnego rozwiązania dot. pomiaru częstotliwości fali sinusoidalnej (może być ze składową stałą lub bez wtedy jest rozłożona symetrycznie wzdłuż osi 0). Do tej pory myślałem o:
- przetworniku scalonym f/u
- wprowadzić sygnał na przerzutnik Schmitta i nastepnie zliczać impulsy,
- mialem tez na myśli programowe rozwiązanie jednak nie za bardzo wiem jak się do tego zabrać.
Potrzebuje liczyć częstotliwość sygnału sinusoidalnego, czy to programowo czy tez za pośrednictwem układów analogowych i dopiero potem na uC (atmega8).
Szczerze to nie mogę sobie poradzić z przerzutnikiem - żaden symulator mi prawidłowo moich konfiguracji nie odbiera (w ogóle nie działa wg zamierzenia i różnych stron w internecie). Dlatego szukam pomocy tutaj, może mnie ktoś naprowadzi?
Szukam efektywnego rozwiązania dot. pomiaru częstotliwości fali sinusoidalnej (może być ze składową stałą lub bez wtedy jest rozłożona symetrycznie wzdłuż osi 0). Do tej pory myślałem o:
- przetworniku scalonym f/u
- wprowadzić sygnał na przerzutnik Schmitta i nastepnie zliczać impulsy,
- mialem tez na myśli programowe rozwiązanie jednak nie za bardzo wiem jak się do tego zabrać.
Potrzebuje liczyć częstotliwość sygnału sinusoidalnego, czy to programowo czy tez za pośrednictwem układów analogowych i dopiero potem na uC (atmega8).
Szczerze to nie mogę sobie poradzić z przerzutnikiem - żaden symulator mi prawidłowo moich konfiguracji nie odbiera (w ogóle nie działa wg zamierzenia i różnych stron w internecie). Dlatego szukam pomocy tutaj, może mnie ktoś naprowadzi?
Dobrze sygnał w zakresie od 20 Hz do max 5kHz. Fala sinusoidalna ze zmienną amplitudą (niewielki stopień). Jest to tylko jeden z parametrów jakie mierzę dla tej fali (pomiar też amplitudy). Atmega dlatego, że używam tego uC w projekcie. Jeżeli ktoś chciałby wiedzieć to sygnał przychodzi z ostatniego stopnia wzmacniaczy (z wtórnika napięciowego). Dokładność musi być dobra tak ±50 Hz.
Zastanawiam się nad wybraniem opcji z komparatorem analogowym atmegi i timerem ktory zlicza jego przeładowania (przechwytywanie). Nie znalazłem jednak info nt. tego jak to dokładnie działa. Mianowicie:
- czy zliczanie działa w tle (niejako przerwania działają ale zliczanie w tle ?)?
- czym różni się tryb przechwytywania od komparatora a normlane przerwania od komparatora ?
Zwłaszcza drugie pytanie - nie znalazłem nic wartościowego. Natomiast oślą łączkę przeczytałem i znalazłem kilka informacji.
- czy zliczanie działa w tle (niejako przerwania działają ale zliczanie w tle ?)?
- czym różni się tryb przechwytywania od komparatora a normlane przerwania od komparatora ?
Zwłaszcza drugie pytanie - nie znalazłem nic wartościowego. Natomiast oślą łączkę przeczytałem i znalazłem kilka informacji.
Zastanawiam się nad wybraniem opcji z komparatorem analogowym atmegi i timerem ktory zlicza jego przeładowania (przechwytywanie). Nie znalazłem jednak info nt. tego jak to dokładnie działa. Mianowicie:
- czy zliczanie działa w tle (niejako przerwania działają ale zliczanie w tle ?)?
- czym różni się tryb przechwytywania od komparatora a normlane przerwania od komparatora ?
Zwłaszcza drugie pytanie - nie znalazłem nic wartościowego. Natomiast oślą łączkę przeczytałem i znalazłem kilka informacji.
- czy zliczanie działa w tle (niejako przerwania działają ale zliczanie w tle ?)?
- czym różni się tryb przechwytywania od komparatora a normlane przerwania od komparatora ?
Zwłaszcza drugie pytanie - nie znalazłem nic wartościowego. Natomiast oślą łączkę przeczytałem i znalazłem kilka informacji.
- joon
- Użytkownik
- Posty: 2076
- Rejestracja: 30 cze 2007, 22:56
- Lokalizacja: Kraków, Przemyśl, Warszawa
- Kontakt:
Konfiguracja timera
DDRB &= ~(1<<PB1);
PORTB |= (1<<PB1); //PB1 wejście podciagnięte do plusa
TCCR1B |= (1<< CS12) |(1<< CS11); //zrodło zewnętrzne - zbocze opadające
TIMSK |= (1<<TOIE1); //przepełnienie
przerwanie:
ISR(TIMER1_OVF_vect)
{
licznik++;
}
a w programie po odliczeniu za pomocą drugiego timera jakiegoś odcinka czasu wystawiasz flagę. W pętli głównej jeśli flaga jest postawiona, zwalniasz ja a następnie:
reszta = TCNT1; //pobieranie wartości z licznika
TCNT1=0; //zerowanie licznika
czestotliwosc = licznik * 65536; //liczba przepełnień Timera1* pojemność Timera1
czestotliwosc = czestotliwosc + reszta; //obliczam częstotliwosc dla przerwania podstawy czasu co sekundę.
Fragmenty programu napisanego na M32 w ramach nauki programowania parę miesięcy temu. Można by było wprowadzić jeszcze parę poprawek ale to już twoje zadanie
DDRB &= ~(1<<PB1);
PORTB |= (1<<PB1); //PB1 wejście podciagnięte do plusa
TCCR1B |= (1<< CS12) |(1<< CS11); //zrodło zewnętrzne - zbocze opadające
TIMSK |= (1<<TOIE1); //przepełnienie
przerwanie:
ISR(TIMER1_OVF_vect)
{
licznik++;
}
a w programie po odliczeniu za pomocą drugiego timera jakiegoś odcinka czasu wystawiasz flagę. W pętli głównej jeśli flaga jest postawiona, zwalniasz ja a następnie:
reszta = TCNT1; //pobieranie wartości z licznika
TCNT1=0; //zerowanie licznika
czestotliwosc = licznik * 65536; //liczba przepełnień Timera1* pojemność Timera1
czestotliwosc = czestotliwosc + reszta; //obliczam częstotliwosc dla przerwania podstawy czasu co sekundę.
Fragmenty programu napisanego na M32 w ramach nauki programowania parę miesięcy temu. Można by było wprowadzić jeszcze parę poprawek ale to już twoje zadanie