Stm32 – ADC(Analog to Digital Converter)
3 This article was prepared in Turkish , good studies.
Herkese merhabalar bu blogda sizlerle ADC (Analog Digital Converter) yani “Analogdan Dijitale Çevirme”
işlemlerini göreceğiz.
Potansiyometre,ısı sensörü, gaz sensörü, ses sensörügibi kompanentlerden gelen analog verileri işleme tabi tutmak için ADC işlemini kullanıyoruz. ADC işlemini basit anlamak için bir potansiyometre kullanacağız. Hadi başlayalım.
İlk olarak potansiyometreyi tanımak gerekiyor , bunun için aşağıdaki bağlantıya tıklayın eğer biliyor iseniz devam edin.
[button text=”Potansiyometre Nedir” new_tab=”” size=”small” icon=”” url=”https://diyot.net/potansiyometre/#:~:text=Potansiyometreler%20%C3%A7o%C4%9Funlukla%20lambalar%C4%B1n%20parlakl%C4%B1k%20ayarlar%C4%B1nda,gerilim%2Dak%C4%B1m%20ayarlamas%C4%B1%20uygulamalar%C4%B1nda%20kullan%C4%B1l%C4%B1r.”]
Keil Uygulamamızı açıyoruz ve yeni proje başlatıyoruz. Manage Run Penceresinden aşağıdaki kutucukları işaretliyoruz bu kutucukların ne işe yaradığı yanlarında yazıyor.



Source Grup 1 yazana kısmında “Add New Items” diyerek “C” seçeneğini seçin ve dosyanıza bir isim verin.
Programları yüklemek için git.
Kütüphaneleri ekleyerek başlıyoruz
#include "stm32f10x.h"
#include "stm32f10x_adc.h"
Analog sinyalleri okumak için değişken tanımlıyoruz.
uint16_t adcDeger = 0;
Her zamanki gibi GPIO işlemlerini bir fonksiyonda başlatıyoruz.
void gpioConfig(){
GPIO_InitTypeDef GPIOinitStructurer;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIOinitStructurer.GPIO_Mode = GPIO_Mode_AIN;
GPIOinitStructurer.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOA,&GPIOinitStructurer);
}
Yukarıdaki adımlar sırasıyla ;
1 – Structer oluşturma
2 – Portları aktif etme
3 – Pin Modunu Belirleme
4 – Hangi pin’i aktif ettik
5– Yapilan ayarlamayi bildirdik / başlattık.
Dipnote: Daha detaylı bilgi için ”Giriş” dersimize gözat. [button text=”Git” new_tab=”” size=”small” icon=”” url=”https://samettasoglu.com/2022/12/22/stm32fx-giris/”]
Burada dikkat edilmesi gereken nokta şu ADC işlemi için hangi portlar ve hangi pinler kullanılıyor ?
Aşağıdaki dökümanlardan bu bilgilere erişebiliriz.

Sarı kutu içerisinde ADC yazan pinlere bağlantımızı gerçekleştirebiliriz.
Hangi pinlerin müsait olduğuna baktık şimdide hangi portların müsait olduğuna bakalım çünkü işlem yapacağımız faz hatını bu bilgiyle aktif edeceğiz.
[button text=”Tıkla ve Dökümana Git” new_tab=”” size=”medium” icon=”” url=”https://drive.google.com/file/d/12XjzaJWOmaomDUyWb6ZHoofwiLZ32VX2/view”]
DİKKAT BU DOKUMAN STM32F100RB cihazına aittir, siz kendi kartınızın dökümanına ulaşın.
PA0 -> ADC_IN0
PA1 -> ADC_IN1
PA2 -> ADC_IN2
veya
PC0 -> ADC_IN10
PC1 -> ADC_IN11
diye gidiyor , lütfen bu IN0,IN1,ON10 vs. aklınızda iyi tutun.
Dökümandan aldığım bilgileri bu şekilde derledim .
Şimdi tüm bu bilgilere baktığımızda RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); kodunu görüyoruz , burada A portunu aktif ettik ve dikkat edin faz hattı olara APB2 yi seçtik.
ADC’nin modunu belirleyelim.
GPIOinitStructurer.GPIO_Mode = GPIO_Mode_AIN;
AIN -> Alternative Input
Olarak modunu başlatık ve ardından pinini belirledik. !!! Dikkat edin pin0 olarak seçtik , yani PA0 olarak işlem yapacak.
Bu işlemlerin hepsi Genel Amaçlı Giriş Çıkış (GPIO) işlemleri içindi yani port,pin,faz atamaları içindi bir sonraki fonksiyon ADC işlemlerini ayarlamak için olacak , hadi gelin bunada bir göz atalım.
void adcConfig(){
ADC_InitTypeDef ADCinitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
ADCinitStructure.ADC_ContinuousConvMode = ENABLE;
ADCinitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADCinitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADCinitStructure.ADC_Mode = ADC_Mode_Independent;
ADCinitStructure.ADC_NbrOfChannel = 1;
ADCinitStructure.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1,&ADCinitStructure);
ADC_Cmd(ADC1,ENABLE);
}
1 – ADC işlemleri için structure oluşturduk.
2 – RCC(Real Clock Control) ile ADC1 Faz hattını aktif ettik.
3 – ContinuousConvMode ile sürekli okuma işlemini Aktif ettik.
4 – ADC_DataAlign ile sinyalin sağ tarafa yatık olmasını istedik.
5 – ExternalTrigConv kısmını trigger kulanmadığımız için none yaptık.
6 – ADC_Mode kısmını bağımsız bir mod olarak belirledik.
7 – ADC_NbrOfChannel cihaza kaç adet ADC işlemi yapacak isek o kadar sayı girmek gerekiyor , biz 1 tane kullanacağız.
8 – ADC_ScanConvMode multi modda kullanılır , biz kulanmadığımız için disable yaptık.
Ve bu şekilde ADC Yapısını kurduk ve artık potansiyometre (veya analog sensörlerden) okuma yapabileceğiz ama bu işimain() kısmında yapmak istemiyorum bunun için bir adet daha fonksiyon yazacağız.
uint16_t readADC(){
ADC_RegularChannelConfig( ADC1, ADC_Channel_0 , 1 , ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd( ADC1 , ENABLE);
while(ADC_GetFlagStatus(ADC1 , ADC_FLAG_EOC) == RESET );
return ADC_GetConversionValue(ADC1);
}
ADC_RegularChannelConfig( ADC1, ADC_Channel_0 , 1 , ADC_SampleTime_55Cycles5); kodu ile ADC1,ADC2 , ADC3 gibi değerler alabilir bunuda kartınızın datasheedini inceleyerek anlayabilirsiniz. Hangi channel olacağına ki burada dikkat edilmesi gerek çünkü yukarda size aklınızda iyi tutun dediğim şeye göre burasını belirliyoruz yani biraz daha açıklamak gerekirse “PA0 -> IN0″ dı yani “IN0 -> channel_0” oluyor burdan yola çıkarsak “PC0 – > channel_10” oluyor. Üçüncü sıradaki değer ise , eğerki birden daha fazla ADC kullanıyorsak orda sıra veriyoruz ve biz 1 tane kullanacağız bu yüzden 1 veriyoruz , eğer 2 tane kullansaydık cihazdaki duruma ve öneme göre sıralama yapmamız gerekecekti. Son sırada ise okuma daha hassas ve doğru olsun diye 55 Cycles olarak belirledik.
ADC_SoftwareStartConvCmd( ADC1 , ENABLE); kodu ile ADC1 okumasını aktif et.
while(ADC_GetFlagStatus(ADC1 , ADC_FLAG_EOC) == RESET ); kodu ile kabaca yukardaki kod satırında ki okuma işlemini sürekli kontrol et. Daha fazla bilgi edinmek için fonksiyona sağ tık yap “Go To Definition of …” diyerek kütüphanesine gidebilirsin , eğer nasıl yapılacağını detaylı öğrenmek istiyorsan [button text=”Tıkla” new_tab=”” size=”” icon=”” url=””]
return ADC_GetConversionValue(ADC1); kodu ile okunan değerimizi return ediyoruz yani dışarıya dönüyoruz.
Gerisi kolay 😀
main içerisinde GPIO ve ADC yapısını yazıyoruz ve sonsuz dönen bir while açıyoruz . While içerisine en başta belirlediğimiz değişkene okunan ADC değerlerini gönderiyoruz.
int main(){
gpioConfig();
adcConfig();
while(1){
adcDeger = readADC();
}
}
Artık buradan itibaren okunan değerle ne yapılacağını siz belirleyin ister verileri STMStudio da görün ister okunan verilere göre farklı işlemler yaptırın hayal gücünüze ve projelerinizdeki amaçlara kalmış birşey.




