Programlama Kodları
//AÇIKLAMA
//Bu uygulamada Arduino'nun 5. pininden analogWrite() komutu ile PWM sinyali üretip,
//Arduino'nun 8. pininden Timer1 yakalama kesmesi ile frekansın kaç olduğu hesapladık.
//Uygulamayı fiziksel Arduino'da yaptık.
//Kesme alt programları içerisinde seri port ekranına yazdırma işlemi yapılmamalıdır.
int tasma_sayisi, i = 0;
unsigned int T, T1, T2, Frekans;
void setup()
{
Serial.begin(9600);
pinMode(8, INPUT); //ICP1 girişi
pinMode(5, OUTPUT); //PWM çıkışı
cli();
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= (0 << CS12) | (0 << CS11) | (1 << CS10); //prescaler 1 yapılıyor
TCNT1 = 0; //Timer sayaç başlangıç değeri
TIFR1 |= (1 << ICF1); //giriş yakalama bayrağı temizlendi
//Timer1 giriş yakalama kesmesi ayarları
TCCR1B |= (1 << ICES1); //ICES1=0 ise; düşen kenar. ICES1=1 ise yükselen kenar
TIMSK1 |= (1 << ICIE1); //Timer1 giriş yakalama kesmesi aktif edildi
TCCR1B |= (1 << ICNC1); //Gürültü önleyici aktif edildi.
//Timer1 taşma kesmesi ayarları
TIMSK1 |= (1 << TOIE1); //Overflow kesmesi aktif edildi
sei();
}
void loop()
{
analogWrite(5, 127);
Serial.print("Frekans = "); Serial.print(Frekans); Serial.println(" Hz");
}
ISR(TIMER1_CAPT_vect)
{
if (i == 0)
{
T1 = ICR1;
i++;
}
else
{
T2 = ICR1;
T2 = (T2 + (65536 * tasma_sayisi));
T = T2 - T1;
if (T != 0)
{
Frekans = 16000000 / T;
}
else if (T == 0)
{
Frekans = 0;
}
i = 0;
tasma_sayisi = 0;
}
}
ISR(TIMER1_OVF_vect)
{
tasma_sayisi++;
}
Devre Şeması
0 comments:
Yorum Gönder