STM32F030 DISCOVERY ADC-2

ADC’NİN SINGLE MODDA KULLANIMI

Bu yazımda ADC’nin dönüşüm modlarından biri olan single modda nasıl dönüşüm işlemi yapacağımızı anlatacağım. Eğer ADC konusunda daha detaylı bilgi almak istiyorsanız bundan önceki yazımı okuyarak bu yazıma başlamanızı tavsiye ediyorum. ADC dönüşümü 3 farklı modda gerçekleştirilebilmektedir;

-Single Mod: Bu modda ADC olarak ayarlanmış kanallar belirlenen yönde 1 kez taranır fakat bir harici tetikleme veya yazılımsal olarak ADSTART biti set edilmediği sürece tekrar tarama işlemi başlamaz.(CONT biti resetlenerek bu moda girilir)

-Continous Mod: Bu modda ADC harici bir tetikleme geldiğinde veya ADSTART bit set edildiğinde tüm kanalları belirlenen yönde taramaya başlar ve tüm kanallar bittiğinde tekrar tetiklenmeye ihtiyaç duymadan tekrar tarar. Bu işlem ADSTP=1 yapılana kadar devam eder.(CONT biti set edilerek bu moda girilir)

Discontinuous Mod: ADC kanalların her biri için ayrı bir tetiklemeye ihtiyaç duyar. Yani bir tetiklemede kanalların hepsi taranmaz sadece 1 kanal dönüştürülür.

 

#include “stm32f0xx.h”
#include “main.h”
#define MAVI GPIO_Pin_8
#define YESIL GPIO_Pin_9
#define BUTON1 GPIO_Pin_0

int main(void)
{

float gelen;
ADC_Clock();
GPIO_Ayarla();
ADC_Ayarla();
while(1)
{
ADC1->CR|=ADC_CR_ADSTART; //Single mod olduğu için her dönüşümden önce tekrar başlatmamız gerekiyor.
if(ADC1->ISR|ADC_ISR_EOC) // Her bir kanal dönüştürüldüğünde EOC bayrağı set edilir. 
{
gelen=ADC1->DR;     // Kanaldan okunan veri gelen değişkenine aktarılır.
gelen*=(0.0008056640625); // Okunan değer voltaja çevriliyor.
if(gelen>=1)                                 //Eğer gelen voltaj 1V tan büyükse led yakılıyor.
GPIOC->BSRR=MAVI;
else
GPIOC->BRR=MAVI;
}
}
}
void ADC_Clock()
{
RCC->APB2ENR|=RCC_APB2ENR_ADC1EN; //ADC clock kaynağı APB olarak seçiliyor.
/*
Clock kaynagi olarak HS14 secilmek istenirse
RCC->APB2ENR|=RCC_APB2ENR_ADC1EN;
RCC->CR2|=RCC_CR2_HSI14ON;
while((RCC->CR2 &RCC_CR2_HSI14RDY)==0);
ADC1->CFGR2&=~ADC_CFGR2_CKMODE;

*/
}

void GPIO_Ayarla()
{

//Mavi ledin bağlandığı C8 pinin ayarları yapılıyor.
RCC->AHBENR|=RCC_AHBENR_GPIOAEN|RCC_AHBENR_GPIOCEN;
GPIOC->MODER|=GPIO_Mode_OUT<<16;
GPIOC->OTYPER|=GPIO_OType_PP<<8;
GPIOC->OSPEEDR|=GPIO_Speed_2MHz<<16;
GPIOC->PUPDR|=GPIO_PuPd_NOPULL<<16;

//ADC kanalı olarak CH2’yi kullanıyoruz. Bu nedenle bu pin analog olarak tanımlanıyor.
GPIOA->MODER|=GPIO_Mode_AN<<4;
GPIOA->OTYPER|=GPIO_OType_PP<<2;
GPIOA->OSPEEDR|=GPIO_Speed_50MHz<<4;
GPIOA->PUPDR|=GPIO_PuPd_NOPULL<<4;
}
void ADC_Ayarla()
{

//ADC 12bit çözünürlük| Sağa yaslanmış olarak| Yön olarak aşağıdan yukarı
ADC1->CFGR1|=ADC_Resolution_12b|ADC_DataAlign_Right|ADC_ScanDirection_Upward;

//Harici bir kesme kullanılmıyor
ADC1->CFGR1&=~ADC_CFGR1_EXTEN;

ADC1->CHSELR|=ADC_CHSELR_CHSEL2;// Sadece channel 2 seçiliyor
ADC1->SMPR|=ADC_SampleTime_239_5Cycles; // ADC örnek alma zamanı ayarlanıyor
ADC1->CR|=ADC_CR_ADEN; // ADC aktif hale getiriliyor

while(!ADC1->ISR&ADC_ISR_ADRDY); //ADC hazır olana kadar bekleniyor
ADC1->CR|=ADC_CR_ADSTART; // Kanal dönüşümü başlatılıyor
}

Single mod default olarak seçildiği için biz bunun için herhangi bir ayarlama yapmaya ihtiyaç duymadık.

 

 

 

 

Yorum bırakın