Witam, próbuję zrobić prosty miernik częstotliwości przy użyciu ATMega8 i jego wbudowanego komparatora analogowego. O ile pomiar dla sygnałów prostokątnych działa bez zarzutu, to już dla sinusoidy pokazuje bzdury - np. dla sinusa 110 Hz, wychodzi 3,5 kHz i nie mogę rozgryźć dlaczego tak jest.
W swoim testowym obwodzie, sinusoidę generuję za pomocą PWM, innym ATMega8. Jeden okres składa się tylko z 64 próbek, ale obwód RC bardzo ładnie wszystko wygładza (zaobserwowane na oscyloskopie). Sądziłem, że mogę rozwiązać problem zmieniając sinusoidę na sygnał prostokątny i tym samym doszedłem do poniższego układu (wiem, tranzystor może nie najbardziej sensowny do zadania, ale taki miałem pod ręką - zamierzam go później wymienić). Bramkę dodałem żeby zmniejszyć czas narastania (być może potem nie będzie potrzebna?) i mieć absolutną pewność co do poziomów napięcia, za nią sygnał jest przyzwoitym prostokątem (również zaobserwowane na oscyloskopie), niestety efekt jest identyczny, jak przy pomiarze częstotliwości zaraz za obwodem RC. Dodam, że to co na schemacie zaznaczyłem jako 2V podłączone do AIN1, to w rzeczywistości potencjometr. Przy jego pomocy sprawdziłem działanie układu przy różnych napięciach z przedziału 0-5V na AIN1 i generalnie jakie by ono nie było, nie widać poprawy.
Co do kodu, próbowałem również wariant z przerwaniem zewnętrznym zamiast użycia komparatora analogowego - efekt ten sam.
Czy ktoś ma jakiś pomysł i mógłby mnie naprowadzić na właściwy trop?
Kod miernika:
Układ testowy:
![[atmega8][c] Prosty miernik częstotliwości [atmega8][c] Prosty miernik częstotliwości](https://obrazki.elektroda.pl/69_1228088937_thumb.png)
W swoim testowym obwodzie, sinusoidę generuję za pomocą PWM, innym ATMega8. Jeden okres składa się tylko z 64 próbek, ale obwód RC bardzo ładnie wszystko wygładza (zaobserwowane na oscyloskopie). Sądziłem, że mogę rozwiązać problem zmieniając sinusoidę na sygnał prostokątny i tym samym doszedłem do poniższego układu (wiem, tranzystor może nie najbardziej sensowny do zadania, ale taki miałem pod ręką - zamierzam go później wymienić). Bramkę dodałem żeby zmniejszyć czas narastania (być może potem nie będzie potrzebna?) i mieć absolutną pewność co do poziomów napięcia, za nią sygnał jest przyzwoitym prostokątem (również zaobserwowane na oscyloskopie), niestety efekt jest identyczny, jak przy pomiarze częstotliwości zaraz za obwodem RC. Dodam, że to co na schemacie zaznaczyłem jako 2V podłączone do AIN1, to w rzeczywistości potencjometr. Przy jego pomocy sprawdziłem działanie układu przy różnych napięciach z przedziału 0-5V na AIN1 i generalnie jakie by ono nie było, nie widać poprawy.
Co do kodu, próbowałem również wariant z przerwaniem zewnętrznym zamiast użycia komparatora analogowego - efekt ten sam.
Czy ktoś ma jakiś pomysł i mógłby mnie naprowadzić na właściwy trop?
Kod miernika:
#define F_CPU 4000000L
#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd.c"
volatile char bufor[10];
volatile uint16_t liczba=0;
ISR(ANA_COMP_vect)
{
liczba++;
}
ISR(TIMER1_COMPA_vect)
{
lcd_clrscr();
lcd_gotoxy(0, 0);
itoa(liczba,bufor,10);
lcd_puts(bufor);
lcd_puts(" Hz");
liczba = 0;
}
int main()
{
ACSR = _BV(ACIE)|_BV(ACIS1)|_BV(ACIS0); // komparator: włącza przerwania przy narastających zboczach
OCR1A = 15625;
TCCR1B = _BV(CS12)|_BV(WGM12);;
TIMSK |= _BV(OCIE1A); // timer1: tryb CTC, odmierza dokładnie 1sec i generuje przerwanie
lcd_init(LCD_DISP_ON);
sei();
for(;;);
return 0;
}Układ testowy:
