AVR 16-Bit PWM ile RGB Uygulaması

Bu uygulamada ATmega328PB’nin 16-bitlik zamanlayıcılarını kullanarak oldukça hassas bir PWM renk uygulaması yapacağız. Daha önceki RGB uygulamasından farklı olarak bu sefer RGB LED’in ayaklarını zamanlayıcıların karşılaştırma çıkışı ayaklarına bağlamamız gereklidir. 16-bit zamanlayıcı kullandığımız için TC1, TC3 ve TC4 zamanlayıcılarının OCxA ayaklarını kullanacağız. Datasheete baktığımızda bu çıkışlar şu fiziksel ayaklara denk gelmektedir.

PB1 (Kırmızı) → OC1A
PD0 (Yeşil) → OC3A
PD1 (Mavi) → OC4A

Bu bağlantıyı yaptıktan sonra kodu çalıştıralım.

Öncelikle PORTD0, PORTD1 ve PORTB1 ayaklarını çıkış olarak ayarlamaktayız. Zamanlayıcının her sinyal çıkışında bunu atlamamak gerekli. Sonrasında ise PWM olarak her bir zamanlayıcıyı tek tek ayarlıyoruz. Gördüğünüz gibi daha önce 16-bit PWM uygulamasında yazdığımız kodu her bir zamanlayıcı için sadece yazmaçların numaralarını değiştirerek tekrar uygulamaktayız. Daha sonrasında ise işi daha da kolaylaştıma adına rgb_renk() adında bir fonksiyon yazdım. Şimdi bu fonksiyonda neler yaptığımı açıklayayım.

Öncelikle biz 16-bit zamanlayıcı kullandığımız için her bir zamanlayıcının karşılaştırma değeri (OCR) 0 ile 65535 arasında olacaktır. Mesela kırmızı LED’i yakmak istiyorsak bu LED’in parlaklık oranı bu değer aralığında olacaktır. RGB LED’de renkleri üç rengi karıştırarak elde ettiğimiz için her bir renk için 16-bit değer olduğundan 65535 * 65535 * 65535 yani toplamda yaklaşık 281 trilyon adet renk elde etme imkanımız vardır. Bu muhteşem bir şey olsa da bilgisayarlardaki RGB renk formatı 8 x 8 x 8 bit olduğu için 16 milyon ile sınırlıdır. Bu yüzden buna uyumluluk sağlaması açısından değerlerimizi 8 bit sola kaydırmaktayız. Böylelikle kirmizi = kirmizi << 8; ifadesiyle 0–255 arası değerler 0–65535 arasına yayılmış olur.

En son olarak OCR1A, OCR3A ve OCR4A yazmaçlarına değerleri atayıp zamanlayıcıları güncellemekteyiz. Yukarıdaki kodda kırmızıya 10 değerini verdik ve diğerleri 0 olarak ayarlandı. Bu durumda kırmızının çok sönük bir biçimde yanması gerekli.

Bu fonksiyon bizim istediğimiz RGB değerinde rengi elde etmemizi sağlayacaktır. Bir bakıma CSS’de de kullanılan rgb(r, g, b) fonksiyonuna benzedi. Web tasarımında kullandığımız RGB paletlerinden birini kullanarak bu değeri fonksiyona yazabiliriz.

Ben burada aşağıdaki rengi seçtim ve rgb() fonksiyonu altında bana yazmam gereken renk değerlerini gösterdi.

Şimdi bu değerleri kendi fonksiyonuma aktarıyorum.

rgb_renk(0, 102, 255);

Bunu denediğimde şöyle bir renk elde ettim.

Birebir aynı olmasa da benzer bir renk elde ettim. Burada istenilen rengi elde etmek için pek çok etmen söz konusu. Bu LED konusu o kadar basit olmayıp hakkında kitaplar bile yazılmıştır. O yüzden daha iyi renk elde etme noktasında araştırmayı size bırakıp bir sonraki uygulamaya geçiyorum.

--

--