Ders 4: Stm32f407 ile ADC Kullanımı

Bu yazımızda stm32f407 ile kitimize bağlı olan potansiyometre(herhangi bir analog kaynak da olabilir) ile kit üzerindeki ledleri set edeceğiz.

► Bu işlem için bilmemiz/yapmamız gerekenler köşesine göz atacak olursak,

♦ Analog veri okuyacağımızdan stm32f4xx ADC kullanımını bilmemiz gerekmektedir

♣ Potansiyometreyi hangi pine bağlayacağımıza (tamamiyle keyfi seçilecek) karar vermek

♠ Kullanacağımız pinlerin ayarlarını yapmak(nasıl yapıldığı hakkında bilgi için önceki derslere göz atabilirsiniz)

◘ ADC Hakkında biraz konuşacak olursak,

adc_genel

Referance manuelden yola çıkacak olursak kullandığımız gelistirme kartının ADC birimi 12-10-8-6 bit çözünürlüğe sahip. Yani 16-14-9…vs bitlik ölçüm yapamayacağımız bilgisini öğreniyoruz. ADC olarak yetkilendireceğimiz pinlerin besleme voltajı,kullanılabilir ADC modları…vs hakkında genel bilgileri de elde ediyoruz.

Potansiyometreden veri okuyacağımızı göz önünde tutarsak biz “Single Conversiyon Mode” yi kullanacağız.Bu şekilde DMA kullanmadan sadece tek kanal üzerinden veriyi işleyip ve algoritmamıza göre diğer işlemleri yürüteceğiz.adc_single

(*Manuelin bu kısmını incelemenizi öneririm)

 

  • ADC adında proje oluşturuyoruz.Önceki projelerden farklı olarak “Manage Run” kısmında ADC blogunu da seçiyoruz.

manage_run

  • Proje ayarları yapıldıktan sonra kod yazma işlemi için hazırız.

▬ Öncelikle structure ayarları yapılmalı

▬ Clocklar ayarları yapılmalı

▬ ADC kanaldan veri okunacağı için veriyi saklayacak bir degisken tanımlanmalı(8 bit okuma için min 8 bitlik, 12bitlik okuma için min 16 bitlik degisken tanımlamayı unutmayalım)

1

2

8 bitlik okuma işlemi yaptıgımızdan maksimum 2^8 – 1 = 255 degeri elde ederiz,bu verileri doğrudan yada voltaj değerine değiştirip kullanabiliriz.Potansiyometreden min 0- max 255 arası elde ettiğimiz değere göre ledlerimizi set ettik. (Reset fonksiyonlarını tek satırda da yapabilirsiniz)

 

HATIRLATMA: ADC işlemi sırasında stm32f4xx_Adc.c kütüphanesini kullandık, kütüphaneyi incelemeyi unutmayın.

hatırlatma

#include "stm32f4xx.h"                  // Device header
 
uint16_t Read_ADC(void)
{
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1, ADC_SampleTime_56Cycles);  /*hesaplama islemi tek cycle da hesaplanmaz,genis sürede daha az ak1m ceker,
		tepki süresi önemli ise kisa tutulabilir */
	ADC_SoftwareStartConv(ADC1);     // adc1 üzerinde yazilimsal dönüsümü baslat 
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);  /*icerideki sart saglandikca assagiya inme while noktali virgül ile bitiyorsa,
		her dönüsüm sonrasi bayrak sifirlandi*/
	return ADC_GetConversionValue(ADC1);	
}	
int main()
{
	uint8_t adc_data; // 8 bitlik adc verisi saklayacak degisken
 
	GPIO_InitTypeDef GPIO_InitStructure;
	ADC_InitTypeDef ADC_InitStructure;
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
 
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
 
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12 |GPIO_Pin_13 |GPIO_Pin_14 |GPIO_Pin_15; //ledler secildi
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_Init(GPIOD, & GPIO_InitStructure);
 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;  // potansiyometrenin data pini A0 pinine baglanacak
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA, & GPIO_InitStructure);
 
	ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; // 4/8/16.. vs olabilir kristalin 4 de 1 i seçtik
	ADC_CommonInit(& ADC_CommonInitStructure);
 
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b; //8bitlik okuma islemi yapilacak
	ADC_Init(ADC1, & ADC_InitStructure);
 
	ADC_Cmd(ADC1, ENABLE);
 
	while(1)
	{
		adc_data = Read_ADC();
 
		if(adc_data < 51)
		{
			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(adc_data< 101 && adc_data>50)
		{
			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(adc_data< 151 && adc_data>100)
		{
			GPIO_ResetBits(GPIOD,GPIO_Pin_12);
			GPIO_SetBits(GPIOD,GPIO_Pin_13);
			GPIO_ResetBits(GPIOD,GPIO_Pin_14);
			GPIO_ResetBits(GPIOD,GPIO_Pin_15);
		}
		else if(adc_data< 201 && adc_data>150)
		{
			GPIO_ResetBits(GPIOD,GPIO_Pin_12);
			GPIO_ResetBits(GPIOD,GPIO_Pin_13);
			GPIO_SetBits(GPIOD,GPIO_Pin_14);
			GPIO_ResetBits(GPIOD,GPIO_Pin_15);
		}	
		else if(adc_data< 255 && adc_data>200)
		{
			GPIO_ResetBits(GPIOD,GPIO_Pin_12);
			GPIO_ResetBits(GPIOD,GPIO_Pin_13);
			GPIO_ResetBits(GPIOD,GPIO_Pin_14);
			GPIO_SetBits(GPIOD,GPIO_Pin_15);
		}			
	}
}

* ADC dönüştürme işlemleri sırasındaki teorik kısımlar için ulaşabilirsiniz.

Yorum

  1. By Gabriela

    Cevapla

    • By Oğuzhan Gültekin

      Cevapla

  2. By Muhammed

    Cevapla

    • By Oğuzhan Gültekin

      Cevapla

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir