Kamis, 30 September 2010

RPM Motor DC : Menghitung kecepatan dalam RPM

Baca dulu :

Berikut ini adalah langkah terakhir dalam menentukan kecepatan putaran motor DC dalam RPM (Revolutions Per Minute) , dan untuk mengingat kembali, berikut spesifikasinya :
  • Motor DC satu arah.
  • Sensor berupa encoder piringan menggunakan lubang.
  • Lubang = logika 0, No lubang = logika 1.
  • Banyak lubang 4 buah dengan perbedaan 90 derajat.
  • Update nilai RPM setiap 1 detik.
  • Interupsi encoder dengan mode Falling Edge / NGT

Logika perhitungan RPM
Encoder yang digunakan adalah tipe piringan yang menggunakan lubang atau garis hitam-putih, banyaknya lubang adalah 4 buah lubang maka 1 putaran = 4 lubang.







Kasus 1: Interupsi eksternal mendeteksi 2400 lubang dalam waktu 1 menit yang berarti :
  • 1 menit terdeteksi 2400 lubang (Clock lubang), maka
  • 2400 / 4 = 600 putaran atau 600 RPM
Kasus 2: Interupsi eksternal mendeteksi 1800 lubang dalam waktu 30 detik yang berarti :
  • 30 detik = 30/60 = 0,5 menit
  • 1800 / 4 = 450 putaran dalam 30 detik, maka
  • 450 / 0,5 = 900 RPM
Kasus 3: Interupsi eksternal mendeteksi 60 lubang dalam waktu 200 mS yang berarti :
  • 200 mS = 200 / 60000 = 0,0033333 menit
  • 60/ 4 = 15 putaran dalam 200 mS, maka
  • 15 / 0,0033333 = 4500,045 RPM
Kasus 4: Interupsi eksternal mendeteksi 100 lubang dalam waktu 1 S yang berarti :
  • 1 S = 1 / 60 = 0,016667 menit
  • 100 / 4 = 25 putaran dalam 1 S, maka
  • 25 / 0,016667 = 1.499,97 RPM

Coding CoViAVR
Pada post sebelumnya, Timer yang digunakan adalah timer 8 bit, lalu interupsi eksternal menggunakan mode falling edge, tampilan data RPM akan ditampilkan ke komputer melalui port serial dengan protokol 9600,8,N,1.

Langkah-langkah :
  • Jalankan program CoViAVR, buat project baru, dan gunakan CodeWizzardAVR.
  • Atur komunikasi serial, interupsi Eksternal dan timer 8 bit.

























Selanjutnya silahkan lihat coding berikut :

Oiya.. lupa aktifin kedap-kedip LED-nya..
Silahkan koreksi sendiri ya..
Udah teranjur d upload gambarnya..
CMIIW.. Ok.

Semoga manfaat ;)

Selasa, 28 September 2010

RPM Motor DC : Pengaturan Timer 8 bit

.
Seperti yang saya katakan sebelumnya bahwa pengaturan timer 8 bit agak sulit dibanding pengaturan timer 16 bit karena timer 8 bit memiliki nilai 0 - 255 sedangkan timer 16 bit bernilai 0 - 65536.
Nilai frekuensi yang digunakan adalah 10.800 Hz dan untuk mendapatkan nilai 10.800 counting, timer 8 bit tidak mampu menghitungnya sehingga digunakan variabel / memori tambahan agar dapat diperoleh 10.800 counting.

Perhitungan Nilai Counting Timer
Nilai frekuensi clock yang digunakan adalah 10.800 Hz atau 10,8 kHz dan timer 8 bit hanya mampu hingga 255 hitungan maka :
10.800 / 255 = 42.35294
10.800 / 250 = 43.2
10.800 / 220 = 49.0909
10.800 / 200 = 54
10.800 / 180 = 60
10.800 / 108 = 100
Dari nilai-nilai diatas jangan gunakan nilai pecahan karena kurang akurat dan gunakan nilai yang hasilnya bulat (dan maksimum) atau nilainya 200, maka :
255 - 200 = 55 atau 0x37 dalam heksadesimal.

Nilai 55 atau 0x37 adalah nilai Start Value timer yang akan digunakan sedangkan nilai 54 atau 0x36 adalah nilai memori counting, jika nilai memori telah sama dengan 54 berarti frekuensi telah mencapai 1 Hz.

Pengaturan Timer 0 / 8 bit Timer
Timer 0 pada AVR (ATmega8535) adalah timer 8 bit sehingga mempunyai Counting Value dari 0 - 255 atau 0x00 - 0xff.
Langkah-langkah pengaturan timer :
  • Diatas kertas tentukan nilai counting yaitu 200 counting yaitu Start Value = 55 atau 0x37 dan memori counting = 54 atau 0x36.



  • Gunakan CodeWizzardAVR dan tentukan jenis Chip serta Clocknya. Saya gunakan ATmega8535 dengan clock 11.059.200 Hz atau 11,0592 MHz.
  • Pada Tab timer sub tab Timer 0 dan atur seperti pada gambar.










  • Berikan nilai awal timer (Timer Value) 0x37 agar didapatkan counting sebanyak 200 pada timer 0.
  • Buat global variabel dengan nama unsigned char cnt_1Hz;
  • Untuk mengecek benar tidaknya, gunakan coding berikut yang akan mematikan dan menyalakan LED pada PORTC setiap 1 Hz.



  • Jika nyala LED telah sesuai, selesai dah.
Next : fiuhh cape.. tar dlu dah..

Semoga Manfaat ;)

RPM Motor DC : Pengaturan Timer 16 bit

.
Setelah merancang dan membuat alat dengan sempurna selanjutnya mengatur timer agar selalu mengupdate nilai PWM setiap 1 detik.
Seperti yang saya katakan sebelumnya, update setiap 1 detik sebenarnya cukup lama tetapi agar mudah memahami penggunaan timer maka digunakan nilai 1 detik

Perhitungan Nilai Counting Timer

Mikrokontroller AVR memiliki jantung berupa clock internal ataupun external dengan satuan MHz dan clock ini juga digunakan oleh Timer sebagai pemicu counting yang menyebabkan Value Timer bertambah hingga terjadi Overflow.
Pada AVR Timer/Counter : Introduction saya umpamakan seperti menaiki tangga dan frekuensi menaiki tangga tersebut maksimum senilai dengan nilai Clock kristalnya.

Clock yang akan saya gunakan pada mikrokokntroller AVR adalah 11,0592 MHz sehingga nilai Clock timer maksimum 11,0592 MHz dan ini sangat cepat.
Oleh sebab itu gunakan prescaler yaitu faktor pembagi clock, prescaler ini menjadi faktor pembagi sumber clock sehingga nilai clock yang ke timer menjadi lebih kecil. (Datasheet ATmega8535 hal 85/321)

Pada CodeWizzardAVR telah dibuat faktor pembaginya (prescaler) sehingga kita hanya tinggal menggunakan saja. Nilai frekeunsi yang akan digunakan pada sumber clock dibawah nanti adalah nilai clock terendah yaitu 10,8 kHz atau 10.800 Hz.

1 detik adalah 1 Hz sehingga jika ingin update nilai RPM setiap 1 detik maka interupsi timer diatur setiap 1 Hz / 1 detik. Yaitu clock timer 10.800 Hz dibagi dengan nilai tertentu sehingga didapatkan 1Hz maka:

10.800 Hz / 10.800 = 1 Hz artinya overflow yang akan mengaktifkan interupsi terjadi ketika Timer Value telah mengcounting 10.800 hitungan.

Pengaturan Timer 1 / 16 bit Timer
Timer 1 pada AVR (ATmega8535) adalah timer 16 bit sehingga mempunya Counting Value dari 0 - 65535 atau 0x0000 - 0xffff.
Pertama kali saya mencoba membahas timer 16 bit karena lebih mudah dipahami akan tetapi timer yang digunakan pada perancangan nanti adalah timer 8 bit. Alasannya karena menggunakan timer 8 bit agak sulit akan tetapi output PWM OC1A dan PWM OC1B lebih sering digunakan khususnya pada aplikasi mobil robot yang harus mengatur kecepatan motor DC kedua rodanya, sehingga sebisa mungkin gunakan timer 0 terlebih dahulu.

Langkah-langkah pengaturan timer :

  • Diatas kertas tentukan nilai counting yaitu 10.800 counting maka :
65.535 - 10.800 = 54.735
54.735 = 0xD5CF dalam nilai heksadesimal.
Nilai 0xD5CF adalah nilai awal timer (Start Value)
  • Buka aplikasi CoViAVR dan buat Project baru.
  • Gunakan CodeWizzardAVR dan tentukan jenis Chip serta Clocknya. Saya gunakan ATmega8535 dengan clock 11.059.200 Hz atau 11,0592 MHz.
  • Pada Tab timer sub tab Timer 1 dan atur seperti pada gambar.










  • Berikan nilai awal timer (Value) 0xD5CF agar didapatkan counting sebanyak 10.800 counting.
  • Untuk mengecek benar tidaknya, gunakan coding berikut yang akan mematikan dan menyalakan LED pada PORTC setiap 1 Hz / 1 detik.
  • Jika nyala led telah sesuai, selesai dah.

Next : RPM Motor DC : Pengaturan Timer 8 bit

Semoga Manfaat ;)

Selasa, 21 September 2010

RPM motor DC : Perancangan Alat

.
Saya akan mencoba menulis salah satu aplikasi dalam menggunakan timer.
Pada kasus ini mikrokontroller berfungsi sebagai penghitung kecepatan putaran motor DC dengan satuan RPM atau Tachometer.
Spesifikasi :
  • Motor DC satu arah.
  • Sensor berupa encoder piringan menggunakan lubang.
  • Lubang = logika 0, No lubang = logika 1.
  • Banyak lubang 4 buah dengan perbedaan 90 derajat.
  • Update nilai RPM setiap 1 detik.
  • Interupsi encoder dengan mode Falling Edge / NGT
Update nilai 1 detik sebenarnya cukup lama, nilai 1 detik dipilih agar nanti penjelasan pada timernya mudah dipahami.

Rangkaian Encoder
Rangkaian sensor encoder banyak diinternet dan sensornya pun banyak dijual di pasaran dengan harga terjangkau. Selain itu juga bisa dibuat menggunakan sensor cahaya seperti LDR atau sensor phototransistor atau sensor InfraRed meskipun hasilnya kurang presisi dibanding menggunakan sensor encoder.
Seperti pada link berikut :
http://letsmakerobots.com/node/12293
http://thedenneys.org/pub/robot/encoders/

Tambahan :
  • Gunakan IC 74HC14 (untuk kecepatan tinggi dan jika lubang pada piringan encoder sangat banyak) atau 74LS14 (murah dan kecepatan rendah) agar output pada sensor encoder menjadi kotak sempurna (Sinyal digital).
  • Setelah rangkaian encoder selesai, uji coba dulu rangkaian tersebut dengan menggunakan AVOmeter, jangan lanjut ke proses selanjutnya jika belum sempurna.
  • Pasang rangkaian tampilan indikator LED di port mikrokontroller sebagai indikator Lubang terdeteksi.
Diagram Blok Alat
Gambar diagram blok dibawah ini adalah perancangan alat yang akan digunakan.
Output sensor Encoder menjadi input IC 74HC14 agar sinyalnya menjadi kotak sempurna yang menjadi input digital INT0 (Interupsi 0) pada port mikrokontroller AVR.
Pada PORTC.0 ditambahkan LED indikator yang LED ini akan menyala atau mati (toggle) setiap terdeteksi lubang pada encoder.
Output PWM pada timer 1 OC1A digunakan untuk mengendalikan kecepatan motor DC.

Atur Interupsi Sensor
Hubungkan output sensor Encoder pada mikrokontroller pin INT0 atau INT1 (terserah tapi harus sesuai dengan codingnya). Interupsi yang saya coba pilih adalah interupsi 0 / INT0.

Buka aplikasi CoViAVR dan gunakan CodeWizzardAVR seperti berikut : Pilih : Falling edge / NGT.









  • Low Level : Sinyal input akan dianggap interupsi jika sinyal input berada pada Low Level / Logika 0.
  • Any Change : Sinyal input akan dianggap interupsi jika terjadi perubahan sinyal dari logika 0 - logika 1 atau logika 1 ke logika 0.
  • Falling Edge : Sinyal input akan dianggap interupsi jika terjadi perubahan input dari logika 1 ke logika 0.
  • Rising Edge : Sinyal input akan dianggap interupsi jika terjadi perubahan input dari logika 0 ke logika 1.
Pada fungsi interupsi eksternal INT0 tulis sebagai berikut :
(Jangan lupa DDRC.0 = 1 yaitu PORTC.0 sebagai output)
Program chip dan coba cek lagi sensor encodernya.

Uji coba dan LED pada PORTC.0 harus mati-nyala-mati-nyala setiap sensor encodernya di halangi-tidak dihalangi (dengan benda gelap). Klo belum cek rangkaian sampai sempurnya.

Next : RPM Motor DC : Pengaturan Timer 16 bit

Semoga manfaat ;)

Senin, 20 September 2010

AVR Timer : Timer Value and Compare Match

.
Penggunaan Timer secara mendasar yaitu scanning Timer Value setiap saat, yaitu dengan cara mengaktifkan timer lalu timer akan counting secara otomatis dan pada Main loop (program utama) selalu deteksi nilai counting timer (Timer Value), dan jika counting timer = timer yang diinginkan, maka selanjutnya lakukan proses yang diinginkan.

Seperti pada contoh sebelumnya, anda ingin counting hanya sebanyak 250 counting (dari 0 - 249) lalu setiap saat pada Main Loop mengecek register Timer Value apakah telah mencapai 250 hitungan atau tidak, maka hal ini membuang siklus waktu, memperlambat proses, dan tidak efisien.
Sedangkan jika menggunakan flag OV (OverFlow) sebagai detektor, pada timer 8 bit flag OV akan aktif jika counting timer lebih dari 255 (OV = nilai 256) yang artinya nilainya kelebihan 6 counting dari nilai counting 250 yang diinginkan.
Oleh sebab itu dibutuhkan solusi lain yaitu dengan menggunakan Start Value (Timer Value) atau Compare Match.

Start Value

Start Value timer adalah nilai awal Timer Value saat proses counting timer terjadi. Yaitu dengan menentukan nilai awal timer, misal Timer Value = 0x05h maka timer tidak dimulai dari 0x00 tetapi dari nilai 0x05. Timer Value adalah register nilai timer yang terus bertambah sebagai counting timer.

Compare Match
Compare Match adalah membandingkan nilai Timer Value dengan nilai tertentu yang telah didefinisikan pada register pembanding. Jika nilai Compare Match dan Timer Value telah sama maka flag pada status akan set dan Timer Value akan reset (ke nilai awal 0x00 / nilai yg telah didefinisikan).

Mode Timer CTC
AVR memiliki fungsi spesial yang disebut "Clear on Timer Compare" atau CTC. Mode operasi CTC terjadi secara hardware dengan membandingkan nilai timer (Timer Value) saat ini dengan nilai timer yang ditentukan. Dan karena terjadi secara hardware maka tidak perlu secara software untuk terus mengecek Timer Value saat ini, cukup dengan melihat status flag-nya saja. Selain itu mode CTC secara otomatis akan mereset nilai Timer Value menjadi 0x00 jika nilai pembanding timer telah sama, dan anda lakukan hanya mereset flagnya saat nilai timernya tercapai.

Sumber : www.avrfreaks.net dan datasheet AVR.
(Panjang bener bacanya... Bahasa inggris jadi agak pusing artiinya... T T)




Pada post selanjutnya akan saya coba beri contoh menghitung putaran motor DC menggunakan interupsi timer.

CMIIW ...^^v...

Rabu, 15 September 2010

AVR Timer/Counter : Introduction

.
Kali ini saya mencoba share mengenai Timer/Counter.
Topik ini baru saya pelajari dari datasheet dan internet.
Jadi harap maklum jika masih ada kesalahan pemahaman.
Mohon koreksinya. ^_^v

Timer/Counter adalah 2 hal yang serupa tapi tak sama.
Jika dimisalkan anda berlari jarak 100 meter dengan waktu tempuh 20 detik sebanyak 150 langkah maka 20 detik adalah timernya, 150 langkah adalah counternya, dan kecepatannya 5 m/s.

Untuk aplikasi yang umum misalnya seperti mengukur kecepatan motor DC dengan menggunakan encoder yang menggunakan piringan-hitam putih sebagai sensor detektor encoder maka keliling piringan hitam-putih adalah jarak, time sampling adalah timernya dan banyaknya count hitam-putih adalah langkahnya.
Sebelum ke aplikasi sebaiknya pahami dulu dasarnya.

Dasar Timer
Semua AVR memiliki fitur Timer/Counter 8 bit, ada pula yang memiliki timer 16 bit. Timer/Counter bisa sebagai Timer jika menggunakan internal clock atau sebagai Counter jika pin external digunakan sebagai sumber clock untuk menghitung (counting). Beberapa AVR juga dapat menggunakan kristal 32,768 KHz sebagai sumber eksternal clock.

Timer/Counter pada AVR bekerja secara asinkron dengan AVR Core atau dengan kata lain Timer/Counter memiliki sirkuit yang terpisah dengan AVR Core sehingga dapat bekerja secara independen pada Main program, berinteraksi dengan control dan count register, dan berinteraksi dengan interupsi timer. Timer pada AVR dapat digunakan untuk menghasilkan Output pada pinnya seperti pada penggunaan PWM.


Gambar disamping adalah ilustrasi timer 8 bit dan timer 16 bit.
Jika timer dimisalkan anak tangga, timer 8 bit memiliki 256 anak tangga dengan nilai 0-255 (0x00 - 0xFF) dan timer 16 bit memiliki 65536 anak tangga dengan nilai 0-65535 (0x0000 - 0xFFFF).

Counting timer seperti menaiki anak tangga tersebut satu-persatu dengan waktu yang tetap.
Misalkan anda menaiki 1 anak tangga setiap 1,5 detik maka pada nilai 255 total waktu anda adalah 1,5 x 255 = 382,5 detik, sehingga tampak bahwa timer adalah counter dengan waktu yang periodik.
Jika telah mencapai 255 dan masih naik terus maka akan terjadi OverFlow (melimpah/kelebihan nilai) yang berarti flag overflow (tanda terjadi OV) akan SET yaitu berlogika 1 dan nilai register counting akan mulai dari 0 (reset) atau mulai dari anak tangga 0.
Overflow ini dapat digunakan sebagai interupsi atau fungsi lainnya.

t pada gambar adalah resolusi waktu dengan persamaan 1/frekuensi sumber clock.
Jika menggunakan sumber clock dengan frekuensi 250 Hz maka resolusi waktu adalah 1/250 Hz = 0.004 detik.
Jika pada aplikasi anda menggunakan timer untuk LED mati 1 detik dan nyala 1 detik sedangkan sumber clock yang anda gunakan adalah 250 Hz yang memiliki resolusi 0.004 detik maka:
  • 0.004 detik x Count = 1 detik
  • Count = 1 / 0.004
  • Count = 250
Didapatkan nilai Count = 250 yang artinya nilai counting timer untuk mendapatkan 1 detik adalah dari 0-250, sehingga masih bisa menggunakan timer 8 bit.
Sebaliknya jika sumber clock yang digunakan mencapai 1000 Hz dengan resolusi waktu 1/1000 = 0.001 detik maka :
  • 0.001 detik x Count = 1 detik
  • Count = 1 / 0.001
  • Count = 1000
Nilai Count 1000 tidak bisa menggunakan timer 8 bit secara langsung dan ada 2 cara mengatasinya yaitu menggunakan timer 16 bit atau menggunakan timer 8 bit yang diulang 4 kali
(4 x 250 = 1000).

Mencari ilmu tidak cukup hanya untuk mengetahui tapi untuk dipahami."
Semoga Manfaat ;)

Topik yang Populer