Merhaba, bu yazımda ADC (Analog to Digital Converter) (Analog Dijital Dönüştürücü) konusunu ele alacağım ve örnek kodları paylaşacağım.
ADC, analog sinyali bizim dijital sistemimizin algılayabileceği dijital veriler haline dönüştürür.

STM32F100RB mikrodenetleyicimizde bulunan ADC birimi 12 Bitlik çözünürlüğe sahiptir. ADC birimimiz 12 bit çözünürlükte olduğu için çevrim sonucumuz 0 ile 4095 (212 – 1) arasında olacaktır.
Bu devremizde:
- adcValue değeri 1000’den küçük olduğunda tüm ledlerimiz sönecektir.
- adcValue değeri 1000 ile 2000 arasında olduğu zaman yeşil ledimiz yanacaktır.
- adcValue değeri 2000 ile 3000 arasında olduğu zaman yeşil ve sarı ledlerimiz yanacaktır.
- adcValue değeri 3000den büyük olduğunda ise yeşil, sarı ve kırmızı ledlerimiz yanacaktır.
Devre Şeması

Proje Kodu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#include "stm32f10x.h" // Device header #include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC #include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO #include "stm32f10x_adc.h" // Keil::Device:StdPeriph Drivers:ADC void InitGPIOs(void); void InitADC(void); uint16_t readADC(void); static uint16_t adcValue=0; int main(){ InitGPIOs(); InitADC(); while(1){ adcValue = readADC(); if(adcValue<1000){ GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2); }else if(adcValue>=1000 && adcValue<2000){ GPIO_SetBits(GPIOB, GPIO_Pin_0); GPIO_ResetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_2); }else if(adcValue>=2000 && adcValue<3000){ GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1); GPIO_ResetBits(GPIOB, GPIO_Pin_2); }else if(adcValue>=3000){ GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2); } } } void InitGPIOs(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Potansiyometre RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // Ledler // Ledler GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); // Potansiyometre GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOA, &GPIO_InitStruct); } void InitADC(void){ ADC_InitTypeDef ADC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; // En Degerli Bit Saga Dayali ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; ADC_InitStruct.ADC_NbrOfChannel = 1; ADC_InitStruct.ADC_ScanConvMode = DISABLE; ADC_Init(ADC1, &ADC_InitStruct); ADC_Cmd(ADC1, ENABLE); } uint16_t readADC(void){ 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); } |