ADC (Analog to Digital Converter) Mikrokontroler

Gambar 1 - Analog Sinyal (www.maxembedded.com)
Gambar 1 - Analog Sinyal (www.maxembedded.com)
Gambar 1 – Analog Sinyal (www.maxembedded.com)

Sebagaian besar data yang ada di dunia ini merupakan data analog, misalnya: temperatur, tekanan, tegangan listrik dll. Sebagai contoh temperatur di dalam boiler sebesar 800 C: saat boiler dinyalakan, temperatur tersebut tidak akan langsung menunjukkan angka 800, tetapi akan naik secara bertahap dari temperatur normal, 400 C, 500 C hingga mencapai 800 C. Gambar di atas merupakan contoh dari sinyal analog.

Data analog yang ada akan diproses menggunakan sebuah sinyal prosessing, sebagai input sinyal analog, akan tetapi pemrosesan sinyal analog, kurang efiisien dikarenakan akurasi nya relatif kecil, error yang cukup besar dan kecepatan pemrosesan sendiri yang relatif lambat. Sehingga data analog yang hendak diproses perlu diubah ke data bentuk digital menggunakan Analog to Digital Converter (ADC).

Gambar 2 - Proses pengakuisisian sinyal (www.maxembedded.com)
Gambar 2 – Proses pengakuisisian sinyal (www.maxembedded.com)

Proses akuisisi sinyal terdiri dari tiga tahap, pada tahap pertama adalah tahap pengindraan/sensing, oleh sensor terhadap besaran fisis yang akan di ukur atau diproses secara lanjut, dimana sensor sendiri adalah sebuah komponen yang mengubah besaran fisis menjadi besaran elektrik yang dapat berupa tegangan, arus atau hambatan. Sehingga besaran fisis yang di-sensing akan diubah menjadi besaran elektrik yang masih merupakan sinyal analog. Tahap kedua adalah tahap konversi sinyal analog menjadi sinyal digital dengan menggunakan Analog to Digital Converter(ADC), sehingga dihasilkan sinyal digital, pada tahap ketiga sinyal digital tersebut kemudian menjadi input pada komponen pemrosesan sinyal, dimana komponen yang sering digunakan sebagai pemrosesan sinyal adalah mikrokontroler (MCU).

Pada mikrokontroler keluarga AVR seri ATMEGA 8/16/32/8535, fitur ADC sudah build in di dalam chip. Fitur internal ADC inilah yang menjadi salah satu kelebihan mikrokontroler ini jika dibandingan dengan beberapa jenis mikrokontroler lainnya, sehingga tidak perlu menggunakan rangkaian ADC eksternal tambahan. Atmega memiliki resolusi ADC 10 bit yang berarti nilai ADC memiliki rentang nilai 2 pangkat 10 (2^10) = 1024. Hal tersebut artinya ADC akan memiliki rentang nilai antara 0 hingga 1024. Selain itu, resolusi ADC juga dapat menggunakan ADC 8 bit dan Jika ADC 8 bit, maka nilai ADC nya adalah 2^8.

Dengan 8 channel (PA0 – PA7), rangkaian internal ADC memiliki catu daya tersendiri yaitu pin AVCC. Dimana fitur lebih lengkapnya dapat dilihat pada gambar berikut :

  • 10 – bit Resolution
  • 5 LSB Integral Non-Liniearity
  • ±2 LSB Absolute Accuracy
  • 13 – 260 µs Conversion Time
  • Up to 15 kSPS at maximum Resolution
  • 8 Multiplexed Single Ended Input Channels
  • 7 Differential Input Channels with Optional Gain of 10x and 200x
  • Optional left adjustment for ADC result Readout
  • 0 – Vcc ADC input Voltage Range
  • Selectable 2.56V ADC reference Voltage
  • Free running or Single Conversion Mode
  • ADC Start Conversion by Auto triggering on Interrupt Sources
  • Interrupt on ADC Conversion Complete
  • Sleep Mode Noise Canceler

Rumus konversi nilai sinyal analog menjadi besarnya tegangan dengan nilai ADC adalah sebagai berikut :

Rumus ADC
Rumus ADC

Pada rumus di atas, System voltage merupakan besarnya tegangan input ADC atau AVCC. Sebagai contoh, jika sistem kita menggunakan  tagangan 5V , menggunakan resolusi ADC 10 bit dan tegangan analog sebesar 2.12V, maka berapakah nilai ADC?

Perhitungan ADC

Berikut ini adalah salah satu contoh aplikasi dari fitur ADC yang paling sederhana, yaitu mengubah pembacaan nilai tegangan analog input menjadi nilai data digital atau nilai ADC dimana tegangan analognya berasal dari potensiometer yang dirangkai sebagai pembagi tegangan. Jika potensiometer diputar maka nilai tegangan akan berubah, dalam artian semakin kecil atau semakin besar itu tergantung dari rangkaian pembagi tegangan yang dibuat, sehingga nilai ADC yang terbaca dan ditampilkan ke LCD juga akan berubah. Mikrokontroler yang digunakan adalah ATMEGA16 dengan rangkaian sebagai berikut:

Gambar 3 - Rangkaian ADC pada Proteus
Gambar 3 – Rangkaian ADC pada Proteus

Pada aplikasi ADC ini digunakan compiler Codevision AVR, dimana untuk mengaktifkan fitur ADC menggunakan codevison AVR ini adalah dengan memberi tAnda centang pada ADC enabled seperti pada gambar di bawah ini:

Gambar 4 - Opsi ADC pada CVAVR
Gambar 4 – Opsi ADC pada CVAVR

Adapun coding-an  program yang digunakan adalah sebagai berikut:

Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 12.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/
int ADC;
char temp[16];

#include <mega16.h>
#include <stdlib.h>
#include <delay.h>

// Alphanumeric LCD functions
#include <alcd.h>

#define ADC_VREF_TYPE 0x00

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: ADC Stopped
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
      {
        ADC=read_adc(0);
        lcd_clear( );
        lcd_gotoxy(0,0);
        lcd_putsf("Nilai ADC");        
        itoa(ADC,temp);
        lcd_gotoxy(0,1) ;
        lcd_puts(temp);
        delay_ms(500);

      }
}

Jika artikel ini bermanfaat buat Anda, mohon untuk di Share because “Sharing is Caring”

Download:

source code CVAVR , Simulasi Proteus

Referensi:

  1. maxembedded.com,
  2. learn.sparkfun.com

9 thoughts on “ADC (Analog to Digital Converter) Mikrokontroler”

Leave a Reply

Your email address will not be published. Required fields are marked *