XC8 Dersleri 2 – ADC

a2d_3bitsRegister 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 !

 

You may also like...

Bir yanıt yazın