AVR ADS1115 ADC Modülü Kullanımı

ADS1115 Texas Instruments’in ürettiği gayet hassas (16-bit) bir dijital ADC entegresidir. Biz bu entegre vasıtasıyla pek çok hassas analog ölçümü yapma imkanına sahip oluruz.

Analog entegrelere baktığımızda Texas Instruments ve Analog Devices firmalarnının göze çarptığını görürüz. Gerçekten her iki firma da analog yönüyle eşsiz entegreler üretmektedir. Bu yüzden bu iki firmanın ürünlerini inceleyip hatrımızda tutmakta fayda var. Bazen ufak bir entegre bizi büyük yükten kurtarmaktadır. Mesela sinyal jeneratörü yapmak istediğimde AD9833 entegresini keşfetmiş ve beklentimin çok daha üzerinde bir işlev ile karşılaşmıştım.

Bu entegre hakkında bilgi almak için yine üreticinin sağladığı teknik belgelere bakmamız gerekli.

https://www.ti.com/product/ADS1115#tech-docs

Burada bu entregreyi nasıl kullanacağımıza odaklanacağız. Bu kullanım bilgisini önceki entegrelerde olduğu gibi zamanlama diyagramları ve yazmaç bilgileri vermekte. Öncelikle zamanlama diyagramına bakıp ne sıra ile verileri yazıp okuyacağımız görelim.

Burada yazma işlemi için zaman diyagramını görmekteyiz. Öncelikle uydu aygıtın adres baytını yazıyor sonrasında adres işaretçisi yazmacına adres verisini yazıyor ve sonrasında üst bayt ve ardından alt bayt olmak üzere yazmak istediğimiz veriyi yazıyoruz. Bu durumda şöyle bir algoritma kuracağız.

  • I2C’yi yazma modunda başlat.
  • Aygıtın adres değerini yaz.
  • Yazmacın adres değerini yaz.
  • 16 bitlik verinin üst baytını yaz.
  • 16 bitlik verinin alt baytını yaz.
  • İletişimi bitir.

Görüldüğü gibi DS1307'den farkı verinin 8 bit değil de 16 bit genişlikte olmasıdır. Şimdi okumayı nasıl yaptığımıza bakalım.

Burada öncelikle I2C’yi yazma modunda açıp sadece okumak istediğimiz yazmacın adres değerini yazıp iletişimi bitiriyoruz. Ardından I2C’i okuma modunda başlatıp ilk yazmacı okuyoruz ve ardından ikinci yazmacı okuyoruz. Yani şöyle bir algoritma kuracağız.

  • I2C’yi yazma modunda başlat.
  • Aygıtın adres verisini yaz.
  • Okunacak adres verisini yaz.
  • İletişimi bitir.
  • I2C’yi okuma modunda başlat.
  • Aygıtın adresini yaz.
  • Üst baytı oku.
  • Alt baytı oku.
  • Bitir.

Şimdi ise yazmaçlara bakıp bunları nasıl kullanacağımızı öğrenelim.

Yazmaçlar şu şekilde sıralanmaktadır,

  • Adres işaret yazmacı
  • Çevirim yazmacı
  • Ayar yazmacı
  • Alçak eşik yazmacı
  • Yüksek eşik yazmacı

Bizim burada kullanacağımız iki gerçek yazmaç bulunmaktadır. Adres işaret yazmacı iletişim başladığı zaman yazdığımız adres değeri demektir. Çevirim yazmacı ise ADC çevirimi bittikten sonra okunan değeri tutmaktadır. Ayar yazmacıyla ise ADC birimini denetleyeceğiz.

Şurada görüldüğü üzere config yazmacında bulunan OS biti bizi doğrudan ilgilendirmektedir. Bu biti kontrol ederek çevirimi başlatmaktayız. Geri kalan kısımları kullanmayacağımız için varsayılan (default) değerinde bırakacağız.

Buraya kadar ADC modülünü en basit şekliyle nasıl kullanacağımızı öğrendik. Daha fazla özelliği kullanmak istiyorsak bunu bu yazmaç üzerinden yapma imkanımız var. Alıştırma yapma adına diğer özellikleri siz deneyebilirsiniz. Şimdi örnek koda geçelim.

Burada adc1115_oku() fonksiyonu 16 bitlik işaretsiz tamsayı değer döndürmektedir. Bu değeri nasıl elde ettiğimize şimdi bakalım.

i2c_start_wait(ADS1115_ADDR+I2C_WRITE);
i2c_write(0x01);

Burada I2C birimini yazma modunda başlatıp adres işaretçisine 0x01 değerini yazıyoruz. Datasheetten bunun “config” yazmacı olduğunu öğrendik.

i2c_write(0b10000000);
i2c_write(0x00);

Veri yazma şeklinin üst bayt + alt bayt şeklinde olduğunu görmüştük. Burada config yazmacının 31 numaralı bitini 1 yapmaktayız. İlk yazılan kısım üst bayt, ikinci yazılan kısım alt bayt olduğu için ikisini bir word (16 bitlik veri) olarak görmek gereklidir.

_delay_ms(8);

OS bitini 1 yaptık ve çevirim başladı. Bu çevirimin bitmesi için belli bir süre beklememiz gerekiyor.

i2c_start_wait(ADS1115_ADDR+I2C_WRITE);
i2c_write(0x00);
i2c_stop();

Bu sefer ise aygıta 0x00 adresindeki yazmacı okuyacağımızı bildiriyoruz. Bu yazmacın çevirilen analog değeri bulundurduğunu yine datasheetten öğrendik.

i2c_rep_start(ADS1115_ADDR+I2C_READ);
uint8_t msb = i2c_readAck();
uint8_t lsb = i2c_readNak();
uint16_t data = (msb << 8 | lsb);
return data;

Burada ise iki ayrı değişken tanımlayıp üst bayt ve alt bayt olarak okuyoruz ve bunları sonraki tanımladığımız data verisinde birleştirip geri döndürüyoruz.

Gördüğünüz gibi burada yaptığımız işler daha önce yaptığımız DS1307 ve DS3231 uygulamalarına benzemektedir. Gözlemlerime göre I2C ve SPI protokolünü kullanan bazı dijital entegreler daha fazla kullanıcı dostudur. Bazı entegrelerin kullanımı zor olup datasheette açık ifadeler yer almamakta ve kafa karıştırıcı olabilmektedir.

--

--