Kendali Motor Servo Menggnakan Mikrokontroler AVR
Kendali Motor Servo Menggnakan Mikrokontroler AVR
lebih lama dari 1,5 ms maka poros motor servo akan berputar ke arah posisi 180 atau ke kanan (searah
jarum jam).
Lebih jelasnya perhatikan gambar dibawah ini.
Ketika lebar pulsa kendali telah diberikan, maka poros motor servo akan bergerak atau berputar ke posisi
yang telah diperintahkan, dan berhenti pada posisi tersebut dan akan tetap bertahan pada posisi tersebut.
Jika ada kekuatan eksternal yang mencoba memutar atau mengubah posisi tersebut, maka motor servo
akan mencoba menahan atau melawan dengan besarnya kekuatan torsi yang dimilikinya (rating torsi
servo). Namun motor servo tidak akan mempertahankan posisinya untuk selamanya, sinyal lebar pulsa
kendali harus diulang setiap 20 ms (mili detik) untuk menginstruksikan agar posisi poros motor servo
tetap bertahan pada posisinya.
3.Motor servo dengan avr
Perhitungan OCR1 untuk menghasilkan lebar pulsa dari 1ms 2ms (sesuai settingan servo) adalah.
OCR1A= (((sudut + 90)/90)*1000)/4;
Dimana nilai 1ms 2ms tersebut akan menghasilkan nilai sudut dari -900 sampai 900. Perhitungan di atas
didapat berdasarkan bahwa couter berjalan dalam interval 250kHz atau 4us sehingga untuk
menghasilkan gelombang 1ms 2ms adalah.
Atau jika kita menggunakan MS-Exel untuk mendapat persamaannya maka setelah membuat table dari
data sumbu x untuk sudut x={-90,90} dan y untuk OCR1A={250,500} maka kita bisa mendapatkan
persamaan linier dengan cara menghitung secara matematik dan di dapat persamaan seperti di bawah ini:
y = 1.388x + 375
dan kita ganti nilai x dan y sehingga menjadi.
OCR1A = (unsigned int)((1.388*(float)sudut) + 375);
: ATmega8535
Program type
: Application
Clock frequency
: 16.000000 MHz
Memory model
: Small
: 0
: 128
*****************************************************/
#include <mega8535.h>
#include <delay.h>
// Declare your global variables here
void set_servo(int sudut)
{
OCR1A= (((sudut + 90)/90)*1000)/4;
//OCR1A = (unsigned int)((1.388*(float)sudut) + 375);
}
void main(void)
{
PORTD=0x00;
DDRD=0x20;
TCCR1A=0x82;
TCCR1B=0x1B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x13;
ICR1L=0x87;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
while (1)
{
// Place your code here
set_servo(-90); //set servo ke -90 derajat
delay_ms(1000); //tahan posisi servo selama 1000ms
set_servo(90);