3.15. Kontrol motor DC¶
Motor DC besikat adalah kumparan kawat pada poros di dalam medan magnet. Alirkan arus melalui kumparan dan medan tersebut memberikan gaya padanya; gaya itu menjadi torsi pada poros. Sikat di dalam motor mengalihkan arah arus dalam kumparan saat poros berputar, sehingga torsi selalu mendorong poros ke arah yang sama. Berikan tegangan DC pada kedua terminal motor dan poros berputar; balikkan polaritasnya dan poros berputar ke arah lain.
Motor umumnya membutuhkan ratusan miliampere hingga beberapa ampere, pada tegangan suplai di atas rel logika 3,3 V kamera. Pin GPIO hanya dapat mengalirkan sekitar 25 mA dan tidak dapat membalik polaritas -- ia hanya dapat menggerakkan dua relnya. Tahap penggerak antara kamera dan motor harus mampu membawa arus motor, merutekan suplai motor bertegangan lebih tinggi yang terpisah, dan membiarkan kamera membalik polaritas sesuai perintah. H-bridge empat transistor adalah solusi standar.
3.15.1. H-bridge¶
H-bridge adalah empat sakelar yang disusun dalam bentuk H di sekitar motor:
H-bridge: empat sakelar (S1 -- S4) menghubungkan motor M antara Vmotor dan ground.¶
Menutup pasangan sakelar yang berbeda menentukan apa yang dilihat motor pada terminalnya:
S1 + S4 ditutup, S2 + S3 dibuka. Arus mengalir dari Vmotor melalui
S1, masuk keA, melintasi motor keB, dan melaluiS4ke ground. Motor berputar satu arah.S2 + S3 ditutup, S1 + S4 dibuka. Arus mengalir dengan arah sebaliknya melalui motor. Motor berputar ke arah lain.
Semua empat dibuka. Kedua terminal motor mengambang; motor meluncur bebas.
S3 + S4 ditutup (atau S1 + S2 ditutup). Kedua terminal motor dihubungkan ke rel yang sama; energi kinetik motor sendiri menggerakkan arus yang dipadamkan oleh pasangan yang tertutup sebagai panas. Motor mengerem.
Kombinasi terlarang adalah menutup kedua sakelar dalam kolom yang sama -- S1 + S3 atau S2 + S4 -- yang membentuk hubungan pendek dari Vmotor langsung ke ground. Ini disebut shoot-through, dan kode kamera tidak boleh mengizinkannya.
Dalam praktiknya, keempat sakelar adalah MOSFET (diperkenalkan di halaman Penggeseran level) di dalam IC driver terintegrasi. Chip tersebut mengekspos dua atau tiga pin input level logika yang dipetakan secara internal ke empat sakelar dan menyertakan logika interlock yang mencegah shoot-through, sehingga kode kamera tidak perlu mengelolanya secara langsung.
3.15.2. PWM dan induktansi motor¶
Mengatur kecepatan motor membutuhkan lebih dari sekadar hidup penuh dan mati penuh. Triknya sama dengan yang digunakan untuk LED di Peredupan LED dengan PWM: pukulkan sinyal penggerak pada frekuensi tinggi dan biarkan beban merata-ratakan hasilnya. Untuk LED, yang melakukan perataan adalah mata; untuk motor, itu adalah kumparan itu sendiri.
Kumparan motor memiliki induktansi yang signifikan. Arus melalui induktor tidak dapat berubah secara seketika; ia berubah dengan laju yang proporsional terhadap tegangan yang melintasinya. Memukulkan jembatan on dan off pada 20 kHz meningkatkan arus kumparan secara bertahap selama setiap fase on, dan selama fase off arus harus terus mengalir -- kumparan membalik tegangan di atasnya untuk mempertahankannya.
Tanpa tempat untuk pergi, arus tersebut akan memuncakkan tegangan pada sakelar yang baru dibuka ke atas dan dapat merusak transistor. Freewheeling diode pada setiap sakelar -- sering kali hanya dioda tubuh MOSFET sendiri di dalam chip driver -- memberikan jalur yang dibutuhkan arus. Arus mengalir melalui dioda dan kembali melalui salah satu sakelar yang masih tertutup, membentuk freewheel loop di mana arus meluruh secara bertahap melalui resistansi kecil jembatan dan motor itu sendiri. Dioda juga mematok tegangan pada sakelar yang dibuka dalam satu tegangan dioda dari rel mana pun yang dikembalikan loop, jauh di dalam area operasi aman MOSFET.
Rata-rata arus selama setiap periode PWM adalah yang menghasilkan torsi, dan rata-rata tersebut mengikuti duty cycle secara linier -- menggandakan duty kira-kira menggandakan torsi, dan pada beban konstan kira-kira menggandakan kecepatan. Berbeda dengan peredupan LED, di mana respons non-linear mata memerlukan kurva, sapuan linier duty_u16 sudah sesuai dengan sapuan linier usaha motor.
Frekuensi PWM hanya perlu melewati dua ambang batas:
Di atas ~20 kHz, sinyal pembawa berada di luar rentang pendengaran manusia. Di bawahnya, gaya magnet pada kumparan naik dan turun setiap pulsa PWM dan lilitan serta laminasi bergetar secara fisik pada frekuensi pembawa -- motor secara efektif menjadi speaker kecil yang memancarkan nada pada pitch PWM.
Jauh di atas ~50 kHz MOSFET dan driver gate-nya mulai kehilangan efisiensi akibat kerugian switching. Selama setiap transisi on-off, MOSFET sebentar membawa tegangan signifikan dan arus signifikan secara bersamaan, menghilangkan sejumlah kecil daya sebagai panas; kapasitansi gate MOSFET juga harus diisi dan dikosongkan setiap siklus, yang ditanggung oleh chip driver. Kedua biaya tersebut meningkat seiring frekuensi PWM, sehingga pada laju tinggi panas dari switching dapat menyaingi panas dari pengaliran arus motor.
20 kHz adalah default yang nyaman untuk motor ukuran hobi.
3.15.3. Menggerakkan H-bridge¶
Chip driver H-bridge dua input memetakan IN1 dan IN2 ke empat sakelar kira-kira seperti ini:
IN1 = 0, IN2 = 0-- coast (semua empat sakelar terbuka).IN1 = 1, IN2 = 0-- gerakkan satu arah.IN1 = 0, IN2 = 1-- gerakkan arah lain.IN1 = 1, IN2 = 1-- rem.
Menggerakkan dua input sebagai output PWM memungkinkan kamera mengatur arah dengan memilih pin mana yang membawa duty, dan kecepatan dengan nilai duty itu sendiri:
import time
from machine import PWM, Pin
in1 = PWM(Pin("P7"), freq=20_000, duty_u16=0)
in2 = PWM(Pin("P8"), freq=20_000, duty_u16=0)
def drive_a(speed): # speed: 0..65535
in1.duty_u16(speed)
in2.duty_u16(0)
def drive_b(speed):
in1.duty_u16(0)
in2.duty_u16(speed)
def coast():
in1.duty_u16(0)
in2.duty_u16(0)
def brake():
in1.duty_u16(65535)
in2.duty_u16(65535)
drive_a(32768) # half speed in direction A
time.sleep(2)
drive_b(16384) # quarter speed in direction B
time.sleep(2)
coast()
Ramp dari mati ke penuh dan kembali memberikan start dan stop yang mulus:
for d in range(0, 65535, 256):
in1.duty_u16(d)
time.sleep_ms(10)
for d in range(65535, 0, -256):
in1.duty_u16(d)
time.sleep_ms(10)
3.15.4. Driver arah-dan-kecepatan¶
Keluarga kedua chip H-bridge mengekspos antarmuka yang lebih mudah: satu input digital arah (sering dilabeli DIR atau PH untuk "phase") ditambah satu input kecepatan (sering PWM atau EN untuk "enable"). Pin arah memilih cara jembatan menggerakkan; duty cycle pada pin kecepatan mengatur arus rata-rata.
Ini lebih mudah digerakkan dari perangkat lunak dibandingkan skema dua-input PWM. Kedua sinyal cocok dengan cara masalah biasanya dirumuskan -- "putar ke sini, pada kecepatan ini" -- sehingga kode dapat mengatakan set_direction(forward); set_speed(50) alih-alih bercabang antara in1 dan in2. Hanya satu saluran PWM yang dibutuhkan, yang membebaskan saluran lain pada timer yang sama untuk pekerjaan lain. Dan pin arah dapat tetap parkir di antara perubahan tanpa memicu ulang jembatan, sehingga mengubah kecepatan pada arah tetap hanya menyentuh satu register.
import time
from machine import PWM, Pin
dir_pin = Pin("P8", Pin.OUT)
speed = PWM(Pin("P7"), freq=20_000, duty_u16=0)
def drive(direction, speed_u16):
dir_pin.value(direction) # 0 or 1
speed.duty_u16(speed_u16) # 0..65535
drive(0, 32768) # direction A at half speed
time.sleep(2)
drive(1, 16384) # direction B at quarter speed
time.sleep(2)
speed.duty_u16(0) # stop
Apa yang dilakukan "stop" pada jenis driver ini -- coast atau rem -- bergantung pada chip. Dengan driver dua input, kode kamera memilih (kedua input rendah untuk coast, keduanya tinggi untuk rem); dengan driver arah-dan-kecepatan, chip yang memutuskan, sehingga lembar data layak dilihat sebelum mengandalkan salah satu perilaku.