22 Eylül 2016 Perşembe

6- STM32F4 ADC Kullanımı

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.

Hiç yorum yok:

Yorum Gönder