Merhaba Arkadaşlar,
Sıradaki
örneğimiz Stm32f4 ile ADC ( Analog to Digital Converter) nasıl kullanılır,
bunun hakkında kısa bilgi ardından da kod paylaşımı yapılacaktır.
STM32F4’de
aşağıdaki tabloda gösterildiği gibi 3 adet ADC ve her birine bağlı olarak 16
kanal bulunmaktadır.
Son olarak da STM32F4’de ADC
12Bit çözünürlüğe sahiptir. ADC hakkında daha fazla bilgiye ihtiyaç olmadığı
için direkt kod yazımına geçebiliriz.
Aşağıdaki tabloda da görüldüğü
üzere ADC1, ADC2 ve ADC3 hepsi de APB2 bus hattına bağlıdır.
Artık kod yazma kısmına
geçebiliriz:
uint16_t
ADC_Degeri; // ADC için
değişken
1 - Öncelikle gerekli
kütüphane eklemelerini yapmamız gerek. Bunlar:
#include
"stm32f4xx.h" //stm32f4
kütüphanesi
#include
"stm32f4xx_gpio.h" //GPIO
kütüphanesi
#include
"stm32f4xx_rcc.h" //
RCC clock kütüphanesi
#include
"stm32f4xx_adc.h" //
timer kütüphanesi
2- Periph clock
hatlarını aktifleştirelim:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,
ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,
ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
3- Output portunu
ayarlamasını yapalım:
void GPIO_led_Config()
{
GPIO_InitTypeDef GPIO_InitStructure; // Port yönlendirmesi
/*
PD12, 13, 14 ve PD15 pinleri kullan1lacak */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 |
GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //Pinler cikis olarak belirlendi
GPIO_InitStructure.GPIO_OType =
GPIO_OType_PP; //Pin
PushPull olarak ayarlandi
GPIO_InitStructure.GPIO_PuPd =
GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_100MHz; //GPIO Bus hizi
100 MHz ayarlandi
GPIO_Init(GPIOD, &GPIO_InitStructure);
//Yukarida
tanimlanan bilgileri GPIOD adresine ait oldugu belirtilir
}
4- ADC pin
ayarlamaları için:
void ADC_GPIO_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin
= GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_AN; //Pinler
analog giris olarak belirlendi
GPIO_InitStructure.GPIO_OType
= GPIO_OType_PP; //Pin
PushPull olarak ayarlandi
GPIO_InitStructure.GPIO_PuPd
= GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed
= GPIO_Speed_100MHz; //GPIO Bus hizi
100 MHz ayarlandi
GPIO_Init(GPIOA,
&GPIO_InitStructure); //Yukarida
tanimlanan bilgileri GPIOA adresine ait oldugu belirtilir
}
4- ADC konfigürasyon ayarlamaları
için:
void ADC1_Config()
{
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler
= ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_DMAAccessMode
= ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay
= ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ScanConvMode
= DISABLE;
ADC_InitStructure.ADC_Resolution
= ADC_Resolution_12b;
ADC_InitStructure.ADC_ExternalTrigConv
= ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign
= ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion
= 1;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE);
}
5- ADC bilgisinin okunması
uint16_t ADC_Oku()
{
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_56Cycles);
//ADC için KANAL 0 SECILDI VE 56 CYCLES KONUMUNDA
ADC_SoftwareStartConv(ADC1); //DONUSUME BASLA DEDIK
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
//HER DÖNUSUM SONRASI BAYRAGI SIFIRLAYALIM
return ADC_GetConversionValue(ADC1);
}
//ANA Fonksiyon
int main(void)
{
Periph_Config();
GPIO_led_Config();
ADC_GPIO_Config();
ADC1_Config();
while
(1) //Sonsuz donguye girilir
{
ADC_Degeri
= ADC_Oku();
if
( ADC_Degeri < 1024 )
{
GPIO_ResetBits(GPIOD,
GPIO_Pin_12);
GPIO_ResetBits(GPIOD,
GPIO_Pin_13);
GPIO_ResetBits(GPIOD,
GPIO_Pin_14);
GPIO_ResetBits(GPIOD,
GPIO_Pin_15);
}
else
if ( 1024 < ADC_Degeri && ADC_Degeri < 2048 )
{
GPIO_SetBits(GPIOD,
GPIO_Pin_12);
GPIO_ResetBits(GPIOD,
GPIO_Pin_13);
GPIO_ResetBits(GPIOD,
GPIO_Pin_14);
GPIO_ResetBits(GPIOD,
GPIO_Pin_15);
}
else
if ( 2048 < ADC_Degeri && ADC_Degeri < 3072 )
{
GPIO_SetBits(GPIOD,
GPIO_Pin_12);
GPIO_SetBits(GPIOD,
GPIO_Pin_13);
GPIO_ResetBits(GPIOD,
GPIO_Pin_14);
GPIO_ResetBits(GPIOD,
GPIO_Pin_15);
}
else
if ( 3072 < ADC_Degeri && ADC_Degeri < 3800 )
{
GPIO_SetBits(GPIOD,
GPIO_Pin_12);
GPIO_SetBits(GPIOD,
GPIO_Pin_13);
GPIO_SetBits(GPIOD,
GPIO_Pin_14);
GPIO_ResetBits(GPIOD,
GPIO_Pin_15);
}
else
{
GPIO_SetBits(GPIOD,
GPIO_Pin_12);
GPIO_SetBits(GPIOD,
GPIO_Pin_13);
GPIO_SetBits(GPIOD,
GPIO_Pin_14);
GPIO_SetBits(GPIOD,
GPIO_Pin_15);
}
}
}
Aşağıda kodun resmini
bulabilirsiniz:
İyi Çalışmalar.