3.15. التحكم في محرك التيار المستمر¶
محرك التيار المستمر ذو الفرش هو ملف من الأسلاك ملفوف حول عمود داخل مجال مغناطيسي. عند تمرير تيار عبر الملف يمارس المجال قوة عليه؛ وتتحول هذه القوة إلى عزم على العمود. تقوم الفرش داخل المحرك بتبديل اتجاه التيار في الملف أثناء دوران العمود، بحيث يدفع العزم العمود دائماً في الاتجاه نفسه. ضع جهد تيار مستمر عبر طرفي المحرك فيدور العمود؛ واعكس القطبية فيدور في الاتجاه الآخر.
تتطلب المحركات عادةً مئات الميلي أمبير إلى عدة أمبيرات، عند جهود تغذية أعلى من قضيب منطق 3.3 V في الكاميرا. يمكن أن يزوّد دبوس GPIO تياراً في حدود 25 mA ولا يمكنه عكس القطبية -- فهو لا يستطيع سوى تشغيل قضيبيه الاثنين. على مرحلة القيادة بين الكاميرا والمحرك أن تحمل تيار المحرك، وأن توجّه تغذية محرك منفصلة ذات جهد أعلى، وأن تتيح للكاميرا عكس القطبية عند الطلب. وجسر H رباعي الترانزستورات هو الحل المعياري.
3.15.1. جسر H¶
جسر H هو أربعة مفاتيح مرتّبة على هيئة حرف H حول المحرك:
جسر H: أربعة مفاتيح (S1 -- S4) تصل المحرك M بين Vmotor والأرضي.¶
يحدّد إغلاق أزواج مختلفة من المفاتيح ما يراه المحرك عند طرفيه:
S1 + S4 مغلقان، S2 + S3 مفتوحان. يتدفق التيار من Vmotor عبر
S1إلىA، ثم عبر المحرك إلىB، ثم عبرS4إلى الأرضي. يدور المحرك في اتجاه واحد.S2 + S3 مغلقان، S1 + S4 مفتوحان. يتدفق التيار في الاتجاه الآخر عبر المحرك. فيدور المحرك في الاتجاه الآخر.
الأربعة مفتوحة. يطفو كلا طرفي المحرك؛ ويتحرك المحرك بالقصور الذاتي.
S3 + S4 مغلقان (أو S1 + S2 مغلقان). يُربط كلا طرفي المحرك بالقضيب نفسه؛ فتقود الطاقة الحركية الخاصة بالمحرك تياراً يقوم الزوج المغلق بقصره فيتبدد على شكل حرارة. فيكبح المحرك.
التوليفة الممنوعة هي إغلاق كلا المفتاحين في العمود نفسه -- S1 + S3 أو S2 + S4 -- مما يكوّن دارة قصر من Vmotor مباشرة إلى الأرضي. وهذا ما يُسمى الاختراق المباشر، ويجب ألا يسمح به برنامج الكاميرا.
في الواقع تكون المفاتيح الأربعة من نوع MOSFET (التي عُرّف بها في صفحة إزاحة المستوى) داخل دارة سواقة متكاملة. تكشف الشريحة عن دبوسي أو ثلاثة دبابيس دخل بمستوى منطقي تُسقَط داخلياً على المفاتيح الأربعة، وتتضمن منطق تشابك يمنع الاختراق المباشر، فلا يضطر برنامج الكاميرا إلى إدارته مباشرةً.
3.15.2. PWM ومحاثة المحرك¶
يحتاج ضبط سرعة المحرك إلى أكثر من مجرد تشغيل كامل وإطفاء كامل. والحيلة هي نفسها المستخدمة مع مصابيح LED في تعتيم LED باستخدام PWM: نبّض القيادة بتردد عالٍ ودع الحمل يحسب متوسط النتيجة. بالنسبة لمصباح LED كانت العين هي ما يحسب المتوسط؛ أما بالنسبة للمحرك فهو الملف نفسه.
يمتلك ملف المحرك محاثة كبيرة. لا يمكن للتيار المار عبر مُحِث أن يتغير لحظياً؛ بل يتغير بمعدل يتناسب مع الجهد عبره. إن تنبيض الجسر بالتشغيل والإطفاء عند 20 kHz يرفع تيار الملف خلال كل طور تشغيل، وخلال طور الإطفاء يجب أن يستمر التيار في التدفق -- إذ يعكس الملف الجهد عبر نفسه للحفاظ عليه.
من دون مكان يذهب إليه، كان ذلك التيار سيرفع الجهد عبر المفتاح المفتوح للتو ارتفاعاً حاداً وقد يُتلف الترانزستور. تمنح ثنائيات الدوران الحر الموضوعة عبر كل مفتاح -- وغالباً ما تكون مجرد ثنائيات جسم MOSFET نفسها داخل شريحة السواقة -- التيارَ المسارَ الذي يحتاجه. فيتدفق عبر ثنائي ويعود مجدداً عبر أحد المفاتيح التي ما زالت مغلقة، مكملاً حلقة دوران حر يتلاشى فيها التيار تدريجياً عبر المقاومات الصغيرة للجسر والمحرك نفسه. كما يثبّت الثنائي الجهد عبر المفتاح المفتوح ضمن هبوط ثنائي واحد عن أي قضيب تعود إليه الحلقة، وذلك ضمن منطقة التشغيل الآمنة لـ MOSFET بأريحية.
إن متوسط التيار عبر كل دورة PWM هو ما يولّد العزم، وهذا المتوسط يتتبع دورة التشغيل خطياً -- فمضاعفة دورة التشغيل تضاعف العزم تقريباً، وعند حمل ثابت تضاعف السرعة تقريباً. وعلى عكس تعتيم LED، حيث تستدعي استجابة العين غير الخطية منحنىً، فإن مسحاً خطياً لـ duty_u16 يقابل بالفعل مسحاً خطياً لجهد المحرك.
لا يتعين على تردد PWM سوى تجاوز عتبتين:
فوق ~20 kHz تقريباً يكون الحامل خارج نطاق السمع البشري. وتحت ذلك، ترتفع وتنخفض القوة المغناطيسية على الملف مع كل نبضة PWM، وتهتز الملفات والصفائح فيزيائياً عند تردد الحامل -- فيصبح المحرك عملياً مكبر صوت صغيراً يصدر نغمة بدرجة PWM الصوتية.
فوق ~50 kHz تقريباً بكثير، يبدأ نوع MOSFET وسواقات بواباتها بفقدان الكفاءة بسبب خسائر التبديل. فخلال كل انتقال تشغيل-إطفاء يحمل MOSFET للحظة جهداً كبيراً وتياراً كبيراً معاً، فيبدد دفقة صغيرة من القدرة على شكل حرارة؛ كما يجب شحن سعة بوابة MOSFET وتفريغها في كل دورة، وهو ما تتكلفه شريحة السواقة. وتتناسب كلتا الكلفتين مع تردد PWM، لذا قد تنافس حرارة التبديل عند المعدلات العالية الحرارةَ الناتجة عن نقل تيار المحرك.
يُعد 20 kHz القيمة الافتراضية المريحة للمحركات بحجم الهواية.
3.15.3. قيادة جسر H¶
تُسقِط شريحة سواقة جسر H ذات دخلين الدخلين IN1 وIN2 على المفاتيح الأربعة على نحو يشبه هذا تقريباً:
IN1 = 0, IN2 = 0-- تحرك بالقصور الذاتي (المفاتيح الأربعة مفتوحة).IN1 = 1, IN2 = 0-- القيادة في اتجاه واحد.IN1 = 0, IN2 = 1-- القيادة في الاتجاه الآخر.IN1 = 1, IN2 = 1-- الكبح.
إن قيادة الدخلين بوصفهما خرجي PWM تتيح للكاميرا ضبط الاتجاه باختيار أيٍّ من الدبوسين يحمل دورة التشغيل، وضبط السرعة بقيمة دورة التشغيل نفسها:
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()
يمنح التدرج من الإطفاء إلى الكامل ثم العودة بداية وتوقفاً سلسين:
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. سواقات الاتجاه والسرعة¶
تكشف عائلة ثانية من شرائح جسر H عن واجهة أكثر ملاءمة: دخل اتجاه رقمي واحد (يُسمى غالباً DIR أو PH اختصاراً لـ "الطور") إضافةً إلى دخل سرعة واحد (غالباً PWM أو EN اختصاراً لـ "التمكين"). يختار دبوس الاتجاه الاتجاه الذي يقود فيه الجسر؛ وتضبط دورة التشغيل على دبوس السرعة متوسط التيار.
هذا أسهل في القيادة من البرنامج مقارنةً بمخطط دخلي PWM. فالإشارتان تتطابقان مع الصيغة المعتادة للمسألة -- "در في هذا الاتجاه، بهذه السرعة" -- بحيث يمكن للبرنامج أن يقول set_direction(forward); set_speed(50) بدلاً من التفرع بين in1 وin2. ولا تلزم سوى قناة PWM واحدة، مما يحرّر القناة الأخرى على المؤقت نفسه لمهمة غير ذات صلة. ويمكن لدبوس الاتجاه أن يبقى ثابتاً بين التغييرات من دون إعادة تشغيل الجسر، فيؤثر تغيير السرعة عند اتجاه ثابت في سجل واحد فقط.
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
ما يفعله "الإيقاف" فعلياً في هذا النوع من السواقات -- التحرك بالقصور الذاتي أو الكبح -- يعتمد على الشريحة. فمع سواقة ذات دخلين يختار برنامج الكاميرا (كلا الدخلين منخفض للتحرك بالقصور الذاتي، وكلاهما مرتفع للكبح)؛ ومع سواقة الاتجاه والسرعة تقرر الشريحة، لذا يجدر إلقاء نظرة على ورقة البيانات قبل الاعتماد على أيٍّ من السلوكين.