ARM Tabanlı Mikrodenetleyiciler
ile
Analog Digital Converter İşlemi
Merhaba. Arm programlama hakkındaki yazılara devam ediyoruz. Bugünkü yazıda Keil ile arm programlama yaparken nasıl ADC ( Analog Digital Converter ) işlemi yapıyoruz, onu göstermeye çalışacağım.
Öncelikle ADC nedir ? Ne işe yarar ? Hangi amaçla biz bu modülü kullanıyoruz, bu kavramları açıklamak istiyorum.
Analog Digital Converter : Zamanın her anında değer alan sinyallere analog sinyal, zamanın belirli anlarında değer alan sinyallere ise dijital sinyal denir. Isı, ışık, nem, basınç gibi sinyaller her an değer aldığı için analog sinyallerdir. Esasen bütün dünya analogdur.
Bilgisayarların, cep telefonlarının ve elektronik sistemlerin beyni olan işlemci ise bu analog değerleri algılayamaz. Bilgisayarlar için sadece 1 yada 0 değeri vardır. Ya evet yada hayır gibi düşünebiliriz bunu. Burada ADC ihtiyaçlar sonucu ortaya çıkmış bir sistemdir. Diyelim ki biz sıcaklık 25 dereceyi geçtiği zaman otomatik olarak klimayı açacak bir sistem yapmak istiyoruz. Ama bunun için öncelikle sistemimiz sıcaklık değerlerini karşılaştırabilecek özelliğe sahip olmalıdır. İşte bu gibi anlarda analog değerleri manipüle edip kendi amaçlarımıza uygun olarak kullanmak için ADC olaya dahil oluyor.
Yukarıdaki grafikte gözüktüğü gibi analog sinyal ( burada sinüs kullanılmış ) zamanın belirli aralıklarına bölünerek o an ki değerleri alınır. Bu aralıklar o kadar küçüktür ki insan duyuları bu zaman aralıklarını algılayamaz. Bu işleme örnekleme denir. Örnekleme işleminden sonra sinyal hala analog sinyaldir. Bu sinyalin 1 ve 0'larla ifade edilmesi gerekir.
Mikroişlemcilerin ADC modülleri genelde 8, 10, 12 bitlik olurlar. 10 bitlik bir modül ( 2 ^ 10 = 1024 ) defa örnekleme işlemi yapar. 1024 değeri aynı zamanda ADC modülünün çözünürlüğüdür. Bu değer ne kadar artarsa mikroişlemci o kadar hassas Analog Digital Converter işlemi yapacaktır. Mikroişlemciler genelde 5 V ile çalışır. 5 % 1024 = 48 mV sensörün algıladığı her bir adımda işlemcide değişecek gerilim miktarıdır.
Şimdi kuantalama işleminde ;
0.00 mV = 0000000000
48mV*1 = 0000000001
.
.
.
48mV*4 = 0000000100
.
.
.
48mV*1023 = 1111111111
değerleri 1 ve 0'lar olarak ifade edildikten sonra ADC işlemi tamamlanmış olur. Bilgisayarlar bu şekilde analog değerleri kullanarak karşılaştırma yaparlar ve insanların kullanımına sunarlar.
Şimdi ADC'nin ne olduğunu anlayabildiysek Arm'da bu işlemin nasıl yapıldığına geçebiliriz. Projemiz oldukça basit ; potansiyometreden alınan analog değerlere göre STM üzerinde bulunan ledleri yakacağız.
1 ) uint16_t Read_ADC ( void ) fonksiyonu analog digital converter işlemi için gereklidir. Hangi portun, hangi kanalın kullanılacağı bu fonksiyon içerisinde belirlenir. Yazılımsal olarak ADC işlemi bu fonksiyon içerisinde başlatılır. return ADC_GetConversionValue(ADC1); komutu ile analog veriler alınmaya başlar. Bu fonksiyon arm'da adc işlemi gerçekleştirmek için her zaman şarttır. Kopyalanıp yapıştırılabilir.
2 ) int main () fonksiyonu altında GPIO ve ADC modüllerinin komutlarını kullanmak için InitTypeDef'ler çağırılıyor.
3 ) Veri göndermek için kullanılacak D portunun clock bus'ı aktif ediliyor, veri almak için kullanılacak A portunun clock bus'ı aktif ediliyor. Ayrıca ADC modülünün de clock bus'ı da aktif ediliyor. Bu clock bus'ları aktif ediyoruz çünkü hem GPIO hem de ADC modülleri zamana bağlı olarak çalışıyor.
4 ) Daha önceki yazımızda paylaştığımız gibi sırasıyla veri gönderilecek bacağın ve veri alınacak bacağın konfigürasyonları yapılıyor. Bu konfigürasyonlar sırasıyla D ve A portuna atılıyor. Bu hafızaya atma işlemi yapılmalıdır. Aksi taktirde komutlar çalışmaz.
5 ) GPIO'nun konfigürasyonları yapıldığı gibi ADC modülünün de konfigürasyonları yapılmalıdır. Bu konfigürasyonların yanına açıklamalarını yazdım. Burada bu bilgilerin GPIO_Init ve ADC_Init fonksiyonları ile haberleşme portlarına atılması önemlidir. Kodların çalışması için bu fonksiyonların kullanılması zorunludur. ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b ; komutu ile adc işleminin 12 bitlik çözünürlükle yapılacağı belirtilmiştir. ADC_Cmd( ADC1, ENABLE ) ; komutu ile Adc modülü aktif hale getirilir.
6 ) ADC_Data = Read_ADC () ; komutu ile analog veriler okunmaya başlar. Verilere göre ledler yakılır veya söndürülür.
👏👏👏
YanıtlaSilsemih hocam merhaba, stm32f407de dc motor hız kontrol uygulaması için yardımcı olurmusunuz. bu uygulamanında kodunu verirmisiniz. iremkilic922@gmail.com
YanıtlaSil