MENGATUR KECEPATAN MOTOR DENGAN MIKROKONTROL AVR

PWM
(Pulse Width Modulation)

PWM merupakan salah satu cara yang tepat dalam pengaturan kecepatan motor. Kok bisa ya???
saya contohkan saja pada sebuah motor dengan spek:

Motor 220V/50Hz/1000rpm

Bagaimana mengatur kecepatan motor menjadi 500rpm?

jawabannya:
1. Kamu bisa mengurangi tegangan yang masuk ke motor sampai kecepatan 500rpm
2. Kamu bisa merubah frekuensi menjadi 25Hz

Kedua cara diatas sama-sama dapat mengurangi kecepatan motor sampai 500rpm. Tetapi.........

Dengan cara pertama memang kecepatan turun sampai 500rpm, tapi torsinya juga turun. Sedang cara kedua lebih efektif karena kecepatan turun sampai 500rpm tetapi torsinya tetap.

Bagaimana menurut kalian gaes? mau pilih yang mana?






Untuk mengatur frekuensi kita harus menggunakan sinyal berupa kondisi terbuka penuh (OFF) atau tertutup penuh (ON). Sedikit info untuk mendapatkan tegangan yang memiliki kondisi terbuka penuh (OFF) atau tertutup penuh (ON) dapat dilakukan dengan cara yaitu :

1. Komparator (Pembangkit Pulsa Analog)
    Dengan membandingkan masukan.




2. Pembangkit Pulsa Digital
    Dengan menggunakan mikrokontroler.

Dengan cara kedualah yang akan saya bahas disini. AVR memiliki fasilitas PWM pada reg ICR untuk frekuensi dan reg OCR untuk Duty Cycle.




Kalau kalian belum tahu Duty Cycle adalah waktu ON atau Waktu OFF pada satu periode. Tergantung pada sistem apa yang digunakan, apakah sistem inverting atau non-inverting. saya kasih gambarannya dibawah ini:



Ok yang kita akan coba praktikan adalah yang sistem Non-Inverting. Langsung saja kita mulai dari rangkaian schematik. Gambar rangkaian ini di software ISIS-Proteus.




Setelah jadi baru membuat program pada CodeVisionAVR. Perlu diketahui kalau fasilitas PWM pada ATMega16 ada 4 buah pin yaitu PWM 0 dengan 8 bit pada PORTB.3 ==> OC0, PWM 1 dengan 16 bit pada PORTD.4 ==> OC1B dan PORTD.5 ==> OC1A serta PWM 2 dengan 8 bit pada PORTD.7 ==> OC2.

Kita akan mengatur kecepatan 500rpm!!!!



Perhitungan Duty Cycle :

V out  =  V in  x  DC
DC     =  V out / V in
          =  6 / 12
          =  0,5

DC    =  50 %

Pada sistem minimum, Crystal yang kita gunakan adalah 12 MHz. Apabila menggunakan nilai crystal yang lain perhitungan juga berubah. selanjutnya kita setting parameter di CodeVisionAVR sebagai berikut:



Setelah itu kita tentukan nilai dari ICR1H  dan ICR1L dengan perhitungan sebagai berikut :

1 Siklus  =  1 / CV
               =  1 / 1.500.000 Hz
               =  0,66666 x 10^-6

Ingat !!!!   50 Hz  =  20 ms   jadi 1 Siklus seperti gambar ini :



ICR1  =  0,5 T / 1 Siklus  =  10 ms / 0,666666 x 10^-6
                                         =  14.999,999
                                         =  15.000         ====>  0x3A98

Yang kita gunakan adalah PORTD.4 merupakan PWM dengan 16 bit maka :

2^16  = 65.535
                                     
Karena nilai ICR1 < 65.535 maka bisa dilanjutkan dan sebaliknya jika nilai ICR1 > 65.535 maka harus menggunakan parameter nilai yang lain.

ICR1  =  0x3A98

Maka nilai  ICR1H  =  0x3A   dan   ICR1L  =  0x98

Masukan nilai tersebut diatas pada parameter program.

Kembali pada soal yang mengharuskan kita mengatur kecepatan motor ke 500rpm maka :


Kita bisa masukan program OCR1B=7500; pada program utama. Lihat program lengkap dibawah:



#include <mega16.h>

// Declare your global variables here

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

// Input/Output Ports initialization
// Port A initialization
DDRA=0x00; //Pengaturan PortA sebagai I/O
PORTA=0x00;  //Pengaturan status bit 0

// Port B initialization
DDRB=0x00; //Pengaturan PortB sebagai I/O
PORTB=0x00;  //Pengaturan status bit 0

// Port C initialization
DDRC=0x00;  //Pengaturan PortC sebagai I/O
PORTC=0x00;  //Pengaturan status bit 0

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=0x30;  //Pengaturan PortC sebagai I/O
PORTD=0x00;  //Pengaturan status bit 0

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1500.000 kHz
// Mode: Ph. correct PWM top=ICR1
// OC1A output: Non-Inverted PWM
// OC1B output: Non-Inverted PWM
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0 us
// Output Pulse(s):
// OC1A Period: 0 us
// OC1B Period: 0 us
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x3A; //dari perhitungan
ICR1L=0x98; //dari perhitungan
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=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);

// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);

// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

while (1)
      {
      // Place your code here
      OCR1B=7500; //kecepatan 500rpm
      }
}

=======> Selamat Mencoba danTerima Kasih <=========


Berlangganan update artikel terbaru via email:

0 Response to "MENGATUR KECEPATAN MOTOR DENGAN MIKROKONTROL AVR"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel