Arduino UNO Rev3 kristal osilatörü ne kadar kararlı?

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,557
Elimdeki orijinal Arduino UNO Rev3 ün kristal osilatörünün kararlılığını nasıl ölçebiliriz bakalım. Bunun üzerinde ayrı, kendi başına çalışan bir kristal osilatör yok, 16 MHz lik bir kristal doğrudan Atmega328 e bağlı ve içeride işlemcinin saat frekansı üretiliyor. Şimdi bu kristalin üzerinde ölçüm yapsam, devreyi yükleyip ya frekansı değiştirmiş olacağım, yada kapasitif yükleme aşırı fazla ise saat frekansı hiç üretilmeyecek. O yüzden bu şekilde ölçemeyiz.

Atmega'yı özel olarak programlayarak belki saat sinyalinin dışarı çıkması sağlanabilir, ayrıntılarına bakmadım, ama bununla uğraşacağımıza, doğrudan saat frekansına senkron olarak çalışan bir program yazıp bu programın çalışma timing'ini gözlemleyebiliriz. Bunun için aşağıdaki basit programı kullanacağım. Bu program 10 ms de bir kesme rutininin çağrılmasını sağlıyor. Bu rutin içerisinde de, 12 numaralı pinde bir pals üretiyorum.

Kod:
/* tanimladigimiz kesme fonksiyonunun saniyede kac defa
   cagirilacagini belirleyen degisken */
int isr_rate = 100;

void setup()
{
  /* 12 numarali pini cikis olarak tanimliyoruz */
  pinMode(12, OUTPUT);

  /* Atmel 328 in birinci timer'ini kesme kaynagi
     olarak yapilandiriyoruz */
  TCCR1A = 0;
  TCNT1 = 0;
  OCR1A = 16000000 / (isr_rate * 64) - 1;
  TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
  TIMSK1 |= (1 << OCIE1A);
}

ISR(TIMER1_COMPA_vect)
{
  /* daha once cikis olarak tanimladigimiz 12 numarali pin'de,
     osiloskop'ta kesmenin olusumunu gozlemlemek icin bir pulse uretiyoruz */
  digitalWrite(12, 1);
  delayMicroseconds(100);
  digitalWrite(12, 0);
}

void loop()
{
  /* ana programda hicbir sey yapmiyoruz, sadece tanimladigimiz
     kesme fonksiyonu belirli araliklarla cagiriliyor */
}
 
Bu programı çalıştırıp osiloskop ile frekans ölçümü yapınca 100.03 Hz lik bir pals dizisi üretildiğini görüyorum. Ama hem daha hassas hem de daha uzun vadeli ölçüm yapmak için elimdeki SR625 frekans metreyi kullanacağım. Bu cihazdan ölçüm sonuçları RS232 portu üzerinden okunabiliyor. Bu ölçüm sonuçlarını okumak için basit bir python programı yazdım. Program seri porta "ölçüm yap" komutunu gönderiyor ve ölçülen değeri de okuyup text haline dönüştürüyor ve bir text dosyaya yazıyor.

Python:
#!/usr/bin/python

import serial
ser = serial.Serial('/dev/ttyUSB0')
f = open("meas.txt", 'w')

while True:
    ser.write(b'MEAS? 0\n')
    line = ser.readline()
    f.write(line.decode('ascii'))
    f.flush()

Text dosyanın içeriği:

Kod:
1.00028546E2
1.00028470E2
1.00028396E2
1.00028358E2
1.00028268E2
1.00028203E2
1.00028142E2
1.00028054E2
1.00028022E2
 
Tabi burada ilk oluşan değerleri hesaba katmamak lazım. Hem frekans metrenin hem de arduinonun stabil bir sıcaklığa erişmesi için bir süre beklemek lazım. Sabaha kadar değerleri topladıktan sonra MATLAB'de hem bir grafiğini çizdireceğim hem de maksimum, minimum değerleri belirleyeceğim.
 
Gece boyunca 2797 ölçüm yapılmış. minimum değer 100.0257 maksimum değer 100.0271. Ortalama değer olan 100.0267 ye göre maksimum sapma 0.001 Hz, yani 10 ppm.

1655711011315.png
 
Bir osilatörün frekans hatası ile kararlılığı farklı kavramlar. Osilatörün kararlı olması çok daha değerli birşeydir, çünkü frekans hatasının kalibrasyon ile veya farklı metotlarla giderme olanağı olabiliyorken, kararsız bir osilatöre kararlılık katmak çok daha zordur, çoğunlukla da imkansızdır.

Mesela bu osilatörün 100 Hz üretmesini istiyoruz, ama en kötü durumda 100.0271 Hz üretiyor. Yani %0.0271 veya 271 ppm frekans hatası var. Osilatörün kararlılığı ise bundan çok daha iyi. 3000 ölçüm sonucunda sadece 10 ppm lik bir sapma var.

Mesela bir kronometre uygulaması yapılıyorsa, frekans hatasını da biliyorsak, zaman sayacını peryodik olarak bilinen hataya göre kompanze edebiliriz. Böylece peryodik olarak zaman hatasını sıfırlamış oluruz. Ama kararsız bir osilatörde zaman hatası her zaman olacaktır.
 
Grafiğin başlangıcındaki artış trendi büyük ihtimalle gece sıcaklık düşmesine bağlı olan bir durum. Eğer ölçümlere devam etseydim, gün içinde tekrar alt sınırdaki değerlerde gezinecekti. Eğer sabit bir ortam sıcaklığı temin edilirse, kararlılık da 10 ppm den çok daha iyi olacaktır.

Yani frekans hatasını kompanze edersek, 10 ppm ile bu kronometrenin günlük yapacağı zaman hatası en fazla

[math]24 \times 3600 \times 10\times 10^{-6} = 0.864\ s[/math]
Yani bir saniyenin altında.
 
Mesela grafiği sıcaklığın düştüğü zamandan sonrasına kısıtlarsak, minimum değer 100.0267 maksimum değer 100.0271 ortalama değer 100.0269. Buradan da kararlılık 2 ppm oluyor.

Yani sadece sıcaklığın kontrol altında olması, kararlılığı 5 kat arttırdı. Buradan da fırın kontrollü kristal osilatörlerin (OCXO) neden kullanıldığını görebiliyoruz.

1655715033046.png
 
  • Beğen
Reactions: umk
Harici osilatörü var yani. Sen mcu'nun çıkışından test yapmış oluyorsun anladığım kadarıyla. Peki mcu'daki trasistörler normalde bile sızdırdığı için hesapta osilatörün çıkışına göre farklılık olabilir mi?

Harici osilatör yok. MCU clock'una bakmıyorum ben, programın kontrol ettiği bir pine bakıyorum.
 
Burada yanlış anlaşılacak bir konuyu da açıklığa kavuşturayım. Bu yapılan deneyden çıkarılabilecek tek sonuç şu: Orijinal Arduino UNO Rev3 ün saat kaynağı, eğer ortam sıcaklığı fazla değişmiyorsa, 10 ppm kararlılıkla çalışıyor. Ama ortam sıcaklığında büyük değişkenlik varsa, saat kaynağının frekansında da 10 ppm den kat kat fazla değişimler olacaktır.

Bir kristalin öz salınım frekansının sıcaklıkla değişimi, tipik olarak bir üçüncü derece (kübik) denklem karakteristiğine sahiptir. Yani düşükten yüksek sıcaklığa doğru, bir aralıkta sıcaklık ile artan frekans, bir aralıkta sıcaklık ile azalan, sonraki aralıkta da tekrar artan bir karakteristik.

1655806600099.png
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,659
Mesajlar
97,354
Üyeler
2,438
Son üye
İbrahimSönmez

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top