Sunday, 14 June 2015

Multiplexer Untuk Membaca ADC

Salam kapasitor!!!
Pada postingan kali ini, kita akan membahas menggunakan multiplexer untuk mendapatkan input yang banyak saat menggunakan fitur ADC. Karena mengapa? karena pada dasarnya mikrokontroler hanya menyediakan 8 buah pin saja untuk input ADC. Oleh karena agar kita dapat memaksimalkannya kita gunakan multiplexer sebagai solusinya.

Apa sih multiplexer? Secara umum, multiplexer adalah sebuah cara untuk memilih data input kemudian di teruskan kebagian outputnya. Untuk pemilihan input ditentukan pada bagian kendalinya. Untuk tipenya bermacam - macam ada 4 to 1, 8 to 1 16 to 1 dll.


Berikut contoh skematiknya dari simulasi proteus menggunakan atmega16 & LCD 20x4.



Note :
- Jenis IC yang digunakan adalah 4051.
- Output IC langsung masuk ke PIN ADC.
- PIN kendali pada IC adalah PIN A B C.

Berikut listring programnya.


  1. #include <mega16.h> 
  2. #include <delay.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>

  5. char data[17];
  6. int data_adc[10];
  7. int data_adc2[10];
  8. void adc();
  9. int i;

  10. // Alphanumeric LCD Module functions
  11. #asm
  12.    .equ __lcd_port=0x15 ;PORTC
  13. #endasm
  14. #include <lcd.h>

  15. #include <delay.h>

  16. #define ADC_VREF_TYPE 0x00

  17. // Read the AD conversion result
  18. unsigned int read_adc(unsigned char adc_input)
  19. {
  20. ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
  21. // Delay needed for the stabilization of the ADC input voltage
  22. delay_us(10);
  23. // Start the AD conversion
  24. ADCSRA|=0x40;
  25. // Wait for the AD conversion to complete
  26. while ((ADCSRA & 0x10)==0);
  27. ADCSRA|=0x10;
  28. return ADCW;
  29. }

  30. // Declare your global variables here

  31. void main(void)
  32. {

  33. PORTB=0x00;
  34. DDRB=0x0F;

  35. // Analog Comparator initialization
  36. // Analog Comparator: Off
  37. // Analog Comparator Input Capture by Timer/Counter 1: Off
  38. ACSR=0x80;
  39. SFIOR=0x00;

  40. // ADC initialization
  41. // ADC Clock frequency: 691,200 kHz
  42. // ADC Voltage Reference: AREF pin
  43. // ADC Auto Trigger Source: None
  44. ADMUX=ADC_VREF_TYPE & 0xff;
  45. ADCSRA=0x84;

  46. // LCD module initialization

  47. lcd_init(20);

  48. while (1)
  49.       {
  50.       // Place your code here 
  51.       

  52.       adc();
  53.        sprintf(data,"%d %d %d %d",data_adc[0],data_adc[1],data_adc[2],data_adc[3]);   
  54.        lcd_gotoxy(0,0);
  55.        lcd_puts(data); 
  56.        sprintf(data,"%d %d %d %d",data_adc[4],data_adc[5],data_adc[6],data_adc[7]);   
  57.        lcd_gotoxy(0,1);
  58.        lcd_puts(data);  
  59.   
  60.        sprintf(data,"%d %d %d %d",data_adc2[0],data_adc2[1],data_adc2[2],data_adc2[3]);   
  61.        lcd_gotoxy(0,2);
  62.        lcd_puts(data); 
  63.        sprintf(data,"%d %d %d %d",data_adc2[4],data_adc2[5],data_adc2[6],data_adc2[7]);   
  64.        lcd_gotoxy(0,3);
  65.        lcd_puts(data);  
  66.        
  67.        delay_ms(50);
  68.        lcd_clear();
  69.        
  70.        
  71.        
  72.        
  73.       };
  74. }

  75. void adc()
  76. {

  77. for(i=0;i<=7;i++)
  78. {
  79. PORTB=i;
  80. data_adc[i]=read_adc(0);
  81. data_adc2[i]=read_adc(1);
  82. }

  83. }
Dan berikut video simulasinya.




Sekian postingan kali inii.
Semoga bermanfaat.
Salam Kapasitorrr!!!

No comments:

Post a Comment