Merhaba,
Bu yazımda STM32F429 MCU üzerinde tek kanal ADC okuma uygulamasının yapılışını açıklayacağım.
Öncelikle STM32F429 MCU’sune ait ADC yapısından biraz bahsediyorum.
3 adet ADC modülü mevcuttur fakat 16 kanaldan okuma yapabilir.
Aşağıdaki tablodan şunu anlamalıyız. Bir kanal farklı ADC modülleri altından kontrol edilebilir. Bu da bize büyük bir esneklik sağlamaktadır.
Biz uygulamamızı ADC1 modülünün Channel 0’ı üzerinden yapacağız. Yani kullanacağımız ADC pini PA0 olacaktır.
Şimdi hemen CubeMX’i açıp MCU seçimimizi yapalım ve işimize başlayalım 🙂
1) ADC1 modülü ve IN0 seçeceğiz. Bunun dışında voltaj değişimlerini algılayabilmemiz için 3 adet LED çıkışına ihtiyacımız vardır. Bunun için PC0, PC1 ve PC2 pinlerimizi GPIO_Output olarak yapılandıracağız.
2) Configuration sekmesine girerek ADC1’e tıklayacağız. Buradan ADC modülümüzün ayarlarını yapacağız. Bize 8 bit 10 bit 12 ve 15 bit seçenekleri sunuluyor. Böylece ADC’mizin istenilen bit sayısında ve istenilen çözünürlük seviyesinde olmasını ayarlayabilmemiz mümkün 🙂
Ben hesap kolaylığı ve alışılmışlık açısından 8 biti seçtim. ADC’mize 5V uygulandığında 2^8= 255 hesaplanır.
Siz istediğiniz bit değerini seçebilirsiniz. Fakat yazılımda kullanacağınız sayısal değerler verdiğim örneğe göre farklılık göstereceğinden hesaplama konusunda dikkat etmelisiniz 🙂
3) Yukarıdaki ayarları tamamladıysanız “Project” menüsü altından Generate Code tıklayın ve Open Project’e basarak proje dosyamızı açın. Burada MDK-ARM5 yada 4 seçmeyi unutmayın(Keil kullanıyorsak eğer 🙂 )
4) Projemizden ilgili modülümüzün driver dosyasını açalım ve birlikte inceleyelim.
İlk olarak bizden _HAL_RCC_GPIOx_CLK_ENABLE komutu uygulamamızı istiyor. Bizim ADC kanalımız PA0’dır yani komutun aslı _HAL_RCC_GPIOA.. şeklinde olmalıdır.
main dosyamızı açıp Ctrl-F ile bu komutu arattığımızda CubeMX’in bunu bizim yerimize otomatik olarak yazdığını görebiliriz 🙂 Bu sebeple yazmamıza gerek yoktur.
stm32f4xx_hal_adc.c driver dosyamıza geri gelip incelememize devam ediyoruz 🙂
Execution of ADC conversions bölümünü incelediğimizde ilk olarak HAL_ADC_Start fonksiyonunun uygulanması gerektiğini görüyoruz.
Bunun dışında ADC değerini HAL_ADC_GetValue fonksiyonu ile alındığını görüyoruz.
Şimdi bunları dikkate alarak main.c dosyamızı geri açalım ve gerekli kodları yazalım 🙂 🙂
5) ADC modülümüzü 8 bit olarak ayarladığımız için uint8_t veri; yazarak 8 bitlik bir değişken tanımlıyoruz.
Kırmızı ile belirtilen bölgede ADC’mizin handletype’ı yer almaktadır.(hadc1)
Bu değer ADC_Start ve ADC_GetValue fonksiyonlarını çalıştırmak için gerekli olacaktır.
6) main.c dosyamızda main fonksiyonu altına inerek HAL_ADC_Start fonksiyonumuzu aşağıdaki gösterilen şekilde handletype’i kullanarak uyguluyoruz.
7) while(1) sonsuz döngümüze giriyoruz. Burada ADC değerini deger değişkeni içine alıp, gelen değere göre LED’leri yakıp söndüreceğiz.
Yazılan programda PA0’dan ADC voltajı okunur(0-5V arası).
Bu voltaj sonucunda 5V için 255(8bit için), 0V için 0.. ara değerler için ise orantılı bir değer hesaplanır.
Örneğin :
5V 255
2V x
____________
orantısı kurulduğunda x içindeki değer 2V’un sayısal karşılığıdır.
Yukarıda verilen kodda okunan voltaj sayısal değere çevrilerek deger değişkeni içine yazılır.
if(veri<50)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);
}
Bu kısımda ise 50 değeri yine bir voltajı simgeler.
255 5V
50 x
________
x= (50*5)/255 = 0.98V
Yani bu kod der ki ; PA0’a uygulanan voltaj 0.98V’dan küçükse PC1 ve PC2’deki LED’leri söndür, PC0’daki LED’i yak.
Alttaki diğer if’lerde de aynı mantık söz konusu. Yani farklı voltaj değerleri için farklı LED’ler ışık verecektir.
PA0’a bir potansiyometre, PC0, PC1 ve PC2’ye ise LED’ler bağlayarak çalışmasını gözlemleyebilirsiniz. 🙂
Gelecek yazılarda DMA, Çok kanallı ADC okuma ve UART konuları hakkında bilgi vereceğim.
Umarım sizin için yararlı olmuştur. İmzamda e-posta adresimi bulabilirsiniz.
İyi çalışmalar 🙂
Çağatay KAYNAK
Elektrik – Elektronik Mühendisi
cagataykaynak@gmail.com
Bir yanıt yazın