Program Kodları
//AÇIKLAMA
//Bu uygulamada ilk başta yükselen kenarda giriş yakalamayı aktif ettik. Yükselen-düşen-yükselen
//şeklinde yakalama işlemine devam ettik. Yakalama kesmesi olduğunda sayaç değerini ICR1’e kaydettik.
//TCCR1B |= (1 << ICES1); ve TCCR1B |= (0 << ICES1); komutları ile kenar değiştirme yaptığımızda
//ICES1’in hep 1 olduğu görüldü . Bu nedenle bitSet(); ve bitClear(); komutlarını kullandık.
int tasma_sayisi, i = 0;
float t, t1, t2, T1, T2;
float T_Atmega = (1.0 / 16000000.0);
int kenar;
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ı
bitSet(TCCR1B, 6); //yükselen kenar yapıldı.ICES1=0 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, 125);
if (i == 2)
{
T2 = (T2 + (65536 * tasma_sayisi));
t1 = T1 * T_Atmega;
t2 = T2 * T_Atmega;
t = t2 - t1;
Serial.print("duty_cycle = "); Serial.print(t, 6); Serial.println(" sn");
Serial.print("taşma_sayısı= "); Serial.println(tasma_sayisi);
i = 0;
tasma_sayisi = 0;
}
}
ISR(TIMER1_CAPT_vect)
{
if (i == 0)
{
T1 = ICR1;
bitClear(TCCR1B, 6); //düşen kenar yapıldı
bitSet(TIFR1, 5); //giriş yakalama bayrağı temizlendi
i++;
}
else if (i == 1)
{
T2 = ICR1;
bitSet(TCCR1B, 6); //yükselen kenar yapıldı
bitSet(TIFR1, 5); //giriş yakalama bayrağı temizlendi
i ++;
}
}
ISR(TIMER1_OVF_vect)
{
tasma_sayisi++;
}
Devre Şeması
0 comments:
Yorum Gönder