Sunday, 31 August 2014

Mengendalikan Kecepatan Motor DC dengan nilai ADC berbasis Mikrokontroler

Salammm resistorr!!!
Haduuhh setelah sekian lama ga nulis karena  kemaren lagi sibuk - sibuknya dengan kerjaan yang ga jelas wkwkwkwk tapi walaupun udah lama ditinggal untung ga ada sarang laba - labanya wkwkwkwk..

Lanjut lagii, pada kesempatan kali ini kita akan membahas bagaimana cara  memberi nilai kecepatan motor DC berdasarkan dari data ADC yang diterima dimikrokontroler.



Berikut langkah - langkahnya
1. Buat rangkain di ISIS (dari Proteus yaa bukan yg lagi trend skrg wkwkwkwk), kira - kira rangkaiannya seperti ini.

Setelah siap membuat rangkain diatas, lanjut kita ke pemrogramannya
2. Buka CVAVR, File, New, pilih jenis mikrokontroler dan frekuensi Crystall yang digunakan. Kali ini saya menggunakan atmega8535 dengan frekuensi 11.059200 MHz



3. Buka Tab LCD, lalu pilih letak PORT yang digunakan untuk LCD, serta jangan lupa untuk memilih panjang line dari jenis LCD yang digunakan. Disini saya menggunakan jenis lcd 16x2 jadi saya pilih char/line 16.


4. Lanjut setting ADC, buka Tab ADC, Conteng Use 8 bit karena akan kita samakan dengan setting timer 1 yang juga 8 bit. Sedangkan untuk clock nya pilih yang paling kecil saja.



5. Yang terakhir kita seting timer, tepatnya pada timer 1.
Pilih clock value untuk timer 1yang jumlahnya paling kecil.
Sedangkan mode kita pilih yang fast pwm top 00FFh.
Dan untuk yang Output A dan Output B dari timer 1 kita pilih mode Non-Inverted.




Setelah itu kita baru membuat programnya secara keseluruhan.
berikut listing programnya.


  1. #include <mega8535.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. // Alphanumeric LCD Module functions
  5. #asm
  6.    .equ __lcd_port=0x15 ;PORTC
  7. #endasm
  8. #include <lcd.h>

  9. #include <delay.h>

  10. #define ADC_VREF_TYPE 0x20

  11. // Read the 8 most significant bits
  12. // of the AD conversion result
  13. unsigned char read_adc(unsigned char adc_input)
  14. {
  15. ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
  16. // Delay needed for the stabilization of the ADC input voltage
  17. delay_us(10);
  18. // Start the AD conversion
  19. ADCSRA|=0x40;
  20. // Wait for the AD conversion to complete
  21. while ((ADCSRA & 0x10)==0);
  22. ADCSRA|=0x10;
  23. return ADCH;
  24. }


  25. char buff[20];
  26. void gerak(int kecepatan1, int kecepatan2);
  27. // Declare your global variables here

  28. void main(void)
  29. {

  30. PORTA=0x00;
  31. DDRA=0x00;

  32. PORTB=0x00;
  33. DDRB=0x00;

  34. PORTC=0x00;
  35. DDRC=0x00;

  36. PORTD=0x00;
  37. DDRD=0x3F;

  38. TCCR0=0x00;
  39. TCNT0=0x00;
  40. OCR0=0x00;

  41. TCCR1A=0xA1;
  42. TCCR1B=0x0D;
  43. TCNT1H=0x00;
  44. TCNT1L=0x00;
  45. ICR1H=0x00;
  46. ICR1L=0x00;
  47. OCR1AH=0x00;
  48. OCR1AL=0x00;
  49. OCR1BH=0x00;
  50. OCR1BL=0x00;

  51. ASSR=0x00;
  52. TCCR2=0x00;
  53. TCNT2=0x00;
  54. OCR2=0x00;

  55. MCUCR=0x00;
  56. MCUCSR=0x00;

  57. TIMSK=0x00;

  58. ACSR=0x80;
  59. SFIOR=0x00;

  60. ADMUX=ADC_VREF_TYPE & 0xff;
  61. ADCSRA=0x87;
  62. SFIOR&=0xEF;

  63. // LCD module initialization
  64. lcd_init(16);

  65. while (1)
  66.       {
  67.       // Place your code here
  68.       
  69.       lcd_gotoxy(0,0);
  70.       sprintf(buff,"Speed= %d (ADC1)",read_adc(0));
  71.       lcd_puts(buff);
  72.       lcd_gotoxy(0,1); 
  73.       sprintf(buff,"Speed= %d (ADC2)",read_adc(1));
  74.       lcd_puts(buff);
  75.       delay_ms(50);
  76.       lcd_clear();  
  77.       
  78.       gerak(read_adc(0),read_adc(1));

  79.       };
  80. }

  81. void gerak(int kecepatan1, int kecepatan2)
  82. {
  83.     PORTD.0=1;
  84.     PORTD.1=0;
  85.     OCR1B=kecepatan1;   
  86.     
  87.     
  88.     PORTD.2=1;
  89.     PORTD.3=0;
  90.     OCR1A = kecepatan2;
  91. }

Berikut simulasinya pada software Isis Proteus





Sekian Dulu yaaa..
semoga bermanfaat..
terima kasihh...
Salamm resissstorrrrrrr!!!!!!!!!!!



No comments:

Post a Comment