XC8 Dersleri 2 – ADC
Register kullanımını anladıysak artık çevre birimlerine geçebiliriz.Bu yazıda Analog Dijital Converter (ADC)’ı anlatmaya çalışacağım.Yine benim vazgeçilmezim olan PIC12F1822 ile devam etmek istiyorum.Bu MCU da 10-Bitlik ADC bulunmakta.2^10 dan 1024 değerlik bir ölçüm yapabileceğimizi görüyoruz.Bu projede RA1 de bulunan Potansiyometre ile gerilimi değiştirerek RA0 daki LED durumu değiştirelim.1024 değer olduğundan bizim değerimiz 511 ve üzeri ise LED yansın diğer durumda sönsün.
Projeye Clock ayarlarını yaparak başlayalım.Yine gazı kökleyerek 32MHz kullanalım.Bu arada sigorta ayarlarını size bırakıyorum.Bir önceki yazıdan ki işlemleri uygulayabilirsiniz.
/*****************************************************
* Function Name : Clock_Init
* Description : 32MHz Internal OSC selected
* Input : None
* Return : None
******************************************************/
static void Clock_Init(void) {
// 8MHz Internal Oscillator Selected
OSCCONbits.IRCF = 0b1110;
// 4x PLL Enabled
OSCCONbits.SPLLEN = 0b1;
// Wait 1 Second
Delay_ms(1000);
// Wait for PLL Enabled
while(!OSCSTATbits.PLLR);
// Wait for OSC Enabled
while(!OSCSTATbits.HFIOFR);
}
Bir LED makrosu tanımlayalım ve GPIO ayarını yapalım.
#define LED (PORTAbits.RA0)
#define LED_TRIS (TRISAbits.TRISA0)
/*****************************************************
* Function Name : GPIO_Init
* Description : GPIO Configuration
* Input : None
* Return : None
******************************************************/
static void GPIO_Init(void) {
// LED Tris is Output
LED_TRIS = 0;
// LED is Low (Logic 0)
LED = 0;
}
Şimdi mainde fonksiyonları çağıralım ve birde ADC_Init() fonksiyonu oluşturalım.
uint16_t ADC_Value;
/***********************************************************
* Function Name : main
* Description : main program
* Input : None
* Return : None
***********************************************************/
void main(void) {
Clock_Init();
GPIO_Init();
ADC_Init();
for(;;) {
ADC_ReadValue(1);
if(ADC_Value >= 511)
LED = 1;
else
LED = 0;
}
}
ADC Init fonksiyonumuzu yazalım.Satırların üzerine kodların açıklamasını yazdım.Her kodun anlamı aşağıda mevcut.
/*******************************************************************************
* Function Name : ADC_Init
* Description : ADC Configuration
* Input : None
* Return : None
*******************************************************************************/
void ADC_Init(void) {
// Bit 1 Analog Input
ANSELAbits.ANSA1 = 0b1;
//Channel 1 Selected
ADCON0bits.CHS = 0b00001;
// Result Format Selection Right justified.
ADCON1bits.ADFM = 0b1;
// Conversion Clock FOSC/8 Selected
ADCON1bits.ADCS = 0b001;
//ADC Enable
ADCON0bits.ADON = 0b1;
// Conversion Status
ADCON0bits.GO_nDONE = 0b1;
}
Read işlemi için gerekli fonksiyon
/*******************************************************************************
* Function Name : ADC_Init
* Description : ADC Configuration
* Input : None
* Return : None
*******************************************************************************/
void ADC_ReadValue(uint8_t adc_channel) {
// Select the A/D channel
ADCON0bits.CHS = adc_channel;
// Turn on the ADC module
ADCON0bits.ADON = 1;
// Start the conversion
ADCON0bits.GO_nDONE = 1;
// Wait for the conversion to finish
while (ADCON0bits.GO_nDONE);
// Conversion finished, return the result
ADC_Value = ((ADRESH << 8) + ADRESL);
}
ADC okuma işlemi bu kadar arkadaşlar.
Esen kalın !

Son yorumlar