Berikut ini adalah salah satu contoh pulsa yang dihasilkan untuk menggerakan servo dengan sudut 0o,90o, dan 180o
Pulsa ini dapat dihasilkan dari pin OCR pada mikrokontroler. Perlu pengaturan register timer pada mikrokontroler agar dapat dihasilkan pulsa dengan lebar yang sesuai kita inginkan. Hal yang sangat penting adalah pengaturan frekuensi dan lebar pulsa on dan pulsa off. Oleh karena itu perlu dihitung berapa konstanta-konstanta timer yang di atur pada mikrokontroler.
Dua parameter utama yang diperlukan untuk mencari konstanta-konstanta timer adalah nilai clock mikrokontroler dan nilai clock timer (ditentukan dari prescaler). Dari kedua parameter itu kita dapat merancang lebar pulsa high dan pulsa low dengan frekuensi tertentu yang sesuai untuk menggerakan motor servo, seperti pulsa pada gambar di atas.
Sebagai contoh kita menggunakan clock eksternal 11.059200 MHz. Untuk pembangkitan PWM kita menggunakan Timer1. Alasan menggunakan Timer1 karena timer ini dapat menampung data sebesar 16 bit sehingga dapat dihasilkan resolusi yang cukup besar untuk menggerakan servo. Maksud resolusi ini adalah besarnya nilai sudut step dari servo, semakin besar resolusi maka step gerakan servo semakin halus, dan sebaliknya jika resolusinya kecil maka gerakan servo akan terlihat patah-patah.
Mode PWM yang digunakan adalah Phase Correct PWM top=ICR1 dengan prescaler 8 sehingga nilai clock timer adalah 1382.4 KHz. Dengan demikian kenaikan counter pada timer dapat dihitung dari periodenya yaitu 1/1382.4 KHz = 7.2338x10-7 s atau sekitar 72.34 mikrosekon.
Periode PWM yang kita ingin hasilkan adalah 20 ms, karena kita menggunakan mode Phase Correct PWM maka periodenya adalah dua kalinya dari kenaikan counter timer, sehingga nilai counter timer adalah 10 ms. Nilai top dari timer bergantung dari ICR1 dimana nilainya dihitung dari pembagian total waktu yang kita inginkan dengan periode timer yaitu 10 ms / 7.2338x10-7 = 13823.99. Nilai inilah yang perlu dimasukan ke register ICR1. Karena register adalah tipe data integer maka perlu dibulatkan menjadi 13824. Dalam bilangan hexadimal menjadi 0x3600.
Berikut adalah pengaturan timer dengan menggunakan CodeWizardAVR. Untuk keluaran PWM dihasilkan hanya pada Out A yaitu port OCR1A dengan Non-Inv agar pulsa yang dihasilkan tidak dilakukan pembalikan.
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1382.400 kHz // Mode: Ph. correct PWM top=ICR1 // OC1A output: Non-Inv. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x82; TCCR1B=0x12; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x36; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;
Hal yang perlu diperhatikan juga adalah port pada OCR1A perlu dijadikan sebagai output.
Untuk mengatur sudut putaran servo kita perlu menghitung rentang nilai OCR1A yang perlu diberikan ke motor servo agar dapat bergerak dari sudut 0o hingga 180o. Sama seperti cara sebelumnya untuk menghitung nilai top dari counter timer, maka nilai OCR1A diperoleh dari pembagian pulse on yang diperlukan dengan periode timer. Untuk sudut 0o diperlukan pulsa on dengan lebar 1 ms. Dengan membaginya dengan dua karena mode Phase Correct PWM maka menjadi 0.5 ms. Sehingga 0.5 ms / 7.2338x10-7 s = 691.19 atau dalam integer 691.
Sedangkan untuk sudut 180o, pulsa yang perlu diberikan adalah 2 ms. Diperoleh nilai integer untuk OCR1A adalah 1 ms / 7.2338x10-7 s = 1382.39 atau 1382.
Dari sinilah kita dapat membuat fungsi untuk menggerakan motor servo dengan parameter sudut yang kita inginkan. Berikut adalah fungsinya,
void servoA(int degree) { int x = 1037 - (int)degree*346.0/90.0; OCR1A = x; }
Dengan cara yang sama dengan di atas dapat dihitung konstanta-konstanta timer yang diperlukan dengan konfigurasi nilai clock dan prescaler timer yang ada. Semakin besar perbedaan nilai integer OCR1a untuk sudut 0o dan sudut 180o maka resolusi timer makin kecil dan membuat gerakan servo menjadi lebih halus.
Berikut ini adalah simulasi kontrol motor servo menggunakan ISIS Proteus (download simulasi dan program disini)
Untuk meyakinkan bahwa pulsa yang dihasilkan sudah sesuai maka kita dapat mengeceknya dengan menggunakan osiloskop.
Semoga Bermanfaat.
Didedikasikan untuk TRUI (Tim Robotika UI) AppNotes
28 comments:
kalo baut at8535 yah
thanks din,,,,infonya....sekalian tambahin "jangan sampai menjalankan program yang beda di proteus" hahahhaha
yang mempengaruhi arah putar motor apa ya?
maaf pak numpang tanya
void servoA(int degree)
{
int x = 1037 - (int)degree*346.0/90.0;
OCR1A = x;
itu 1037, 346, dan 90 didapat dari mana ya?
mohon bantuannya pak. klo bisa penjelasanya kirim ke email saya aji06121988@gmail.com
nice info pak.,sangat membantu
int x = 1037 - (int)degree*346.0/90.0;
pulsa 2 ms diperoleh dengan mengisi register OCR1A = 1382
sedangkan 1 ms yaitu register OCR1A = 691
dimana 1ms - 2ms itu akan menggerakan sudut servo -90 deg sampai 90 deg (atau 0 deg sampai 180 deg)
sehingga jika ingin posisi 0 deg, maka 691 + (1382-691)/2 = 1036.5 ~ 1037
nah (int)degree*346.0/90.0 itu supaya bisa input nya derajat aja
dimana dimulai dari posisi 0 deg (yaitu 1037), dimana nanti tergantung input -90 deg sampai 90 deg akan mengkonversi ke dalam nilai register OCR1A
Pak, masih belum jelas dengan angka 356.0/90.0 dan (int)degree itu apa dan gimana penggunaanya, contoh aja misal jika ingin sudut 70 derajat, bagai mana cara penggunaan dari persamaan fungsi "int x" itu.
mohon penjelasannya.
Trimakasih
Oh angka 346.0/90.0 ya?
yang penting itu angka 346 nya, dimana itu di dapat dari 691/2 = 345.5 ~ 346
Itu hanya faktor skala saja.
Biar gampang mungkin kaya gini jelasinnya
Sudut Servo => 0 - 90 - 180
Pulsa => 1 ms - 1.5 ms - 2 ms
OCR => 691 - 1037 - 1382
jadi kalo mau 70 deg, maka nilai timer harus
OCR = 691 + 70/90*346 = 960.11 ~ 960
Trimakasih banyak penjelasan yg sangat membantu n bermanfaat.
kalau untuk mengontrol lebih dari 2 misalnya 8 servo gimana caranya pak? OCR1 yg ada cuma OCR1A dan OCR1B
mohon bantuannya pak. trims
gan,,ane masih bingung ttg pwm....
ane mau buat program untuk putar motor servo dari 0 drajat ke 90 derajat kmudian berhenti/delay 5 detik trus kembali ke posisi 0 derajt lagi,,,,mhon bantuanya mas admin...
ni email sya mas,,: styaone1@gmail.com
bang saripudin, itu kalo servonya ada 3 di masukan mana datanya? mohon bantuan nya
Kalo servo asli biasanya yang kabelnya warna putih atau oranye untuk data, kalo merah hitam standar untuk power. Yang di proteus itu koneksi kabel yang tengah jadi data.
Gan, saya kan ngontrol PWM pada motor brushless. Motor brushlessnya bekerja pada 1-2ms.
Clock eksternalnya saya gunakan 16M.Hz.
Kira-kira Mode PWM yang digunakan itu apa ya? Apakah harus Phase Correct PWM top=ICR1 atau juga bisa Phase Correct PWM top=OCR1A?
Nilai clock timernya brapa ya klo gunakan clock eksternal 16M.Hz?
Apakah periode PWMnya juga harus 20ms?
Para suhu mohon bantannya untuk membuat timer untuk mini servo dengan pilihan waktu 30s, 60s, 90s, dst dengan penambahan waktu 30s, pergerakan servonya dari 0 ke 90 derajad, setelah itu ke bali ke 0 lagi, harapan saya alat tersebut di kasih lampu atau suara agar saya dapat mengetahui bahwa alat itu bekerja.
Terimakasih
mnta bhantuanya ..
untuk kendali servo menggunakan BASCOM AVR pada ATmega8535 bagamana ?? trimakasih
gan kalo membaca input PWM mennggunakan mikrokontroler bagaimana? misal membaca receiver rc yang ditampilkan di LCD.
gan, source code ini waktu saya simulasikan di rangkaian saya sendiri kok g jalan ya??? bisanya di rangkaian punya agan ,, kira2 kenapa ya??
waktu coba pakai mikrokontroler apa? kemudian crystalnya pakai berapa MHz?
atmega 16 pake crystall 12.000000MHz, soalnya yg 11.059200MHz g ada gan di kota ane
Kalo pakai crystal 12MHz di program yang saya buat di tulisan ini ga akan bisa, akan berbeda konfigurasi baud-rate nya
Mau tanya mas, klo pake Timer 1 prescaler 8, harga PWM untuk tiap sudut servo di atas sama bisa dipake untuk semua jenis motor servo?
Atau tiap motor servo perlu di cari terlebih dahulu PWM tiap2 sudutnya?
@David : harga PWM untuk ke servo standarnya 1000-2000us, tapi kebanyakan tidak tentu, kadang 900 - 2100us, 800 - 2200us, dll dan di atur di faktor pengalinya
Terima kasih untuk infonya, pak. Mau tanya kalau rumus untuk sudut penyalaan servo itu ada kah?
untuk yang ini
void servoA(int degree)
{
int x = 1037 - (int)degree*346.0/90.0;
OCR1A = x;
}
ini untuk putaran sudutnya berapa iya gan?
gan mau tanya ,jadi untuk source code full pada cv avr menggunakan atmega 16 untuk contoh putaran 10 derajat pada motor servo bagaimana?perbedaan motor servo dan continous terlatak dimananya?servo yang saya punya ketika saya sambungkan berputarnya 360 drjt gan
mungkin bisa di kirim di email saya ferykurniawan37@gmail.com atau bisa dijawab disini
Pa, untuk memutar 90 detajat kemudian kembali ke semula itu bagaimana?? Mohon bantuannya.. terimakasih
Post a Comment