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