- أجهزة السيارات
- التحكم في محرك سيرفو باستخدام LPC2148 PWM و ADC
- دبابيس PWM & ADC في ARM7-LPC2148
- المكونات مطلوبة
- مخطط الدائرة والتوصيلات
- برمجة ARM7-LPC2148 للتحكم في محرك سيرفو
في برنامجنا التعليمي السابق ، قمنا بتوصيل محرك متدرج مع ARM7-LPC2148. في هذا البرنامج التعليمي ، سوف نتحكم في محرك سيرفو باستخدام ARM7-LPC2148. يتمتع محرك سيرفو بميزة استهلاك طاقة منخفضة على محرك متدرج. يوقف محرك سيرفو استهلاكه للطاقة عند الوصول إلى الموضع المطلوب ولكن محرك السائر مستمر لاستهلاك الطاقة لقفل العمود في الموضع المطلوب. تُستخدم المحركات المؤازرة في الغالب في مشاريع الروبوتات نظرًا لدقتها وسهولة التعامل معها.
في هذا البرنامج التعليمي سوف نتعرف على محرك سيرفو وكيفية واجهة سيرفو مع ARM7-LPC2148. يتم أيضًا ربط مقياس الجهد لتغيير موضع عمود المحرك المؤازر ، وشاشة LCD لعرض قيمة الزاوية.
أجهزة السيارات
محرك سيرفو عبارة عن مزيج من محرك DC ونظام التحكم في الوضع والتروس. يتم التحكم في دوران المحرك المؤازر عن طريق تطبيق إشارة PWM عليه ، ويقرر عرض إشارة PWM زاوية الدوران واتجاه المحرك. هنا سنستخدم محرك سيرفو SG90 في هذا البرنامج التعليمي ، إنه أحد أشهر وأرخص المحركات. SG90 هو مؤازر 180 درجة. لذلك باستخدام هذه المؤازرة ، يمكننا وضع المحور من 0-180 درجة:
- جهد التشغيل: + 5 فولت
- نوع العتاد: بلاستيك
- زاوية الدوران: من 0 إلى 180 درجة
- الوزن: 9 جم
- العزم: 2.5 كجم / سم
قبل أن نبدأ في البرمجة لمحرك سيرفو ، يجب أن نعرف نوع الإشارة التي سيتم إرسالها للتحكم في محرك سيرفو. يجب أن نبرمج MCU لإرسال إشارات PWM إلى سلك إشارة محرك سيرفو. توجد دائرة تحكم داخل محرك سيرفو تقرأ دورة عمل إشارة PWM وتضع عمود محركات المؤازرة في المكان المناسب كما هو موضح في الصورة أدناه
لكل 20 مللي ثانية محرك سيرفو يفحص النبض. لذلك ، اضبط عرض نبضة الإشارة لتدوير عمود المحرك.
- عرض نبضة يبلغ 1 مللي ثانية (1 مللي ثانية) لتدوير المؤازرة إلى درجة 0
- عرض نبضة يبلغ 1.5 مللي ثانية للدوران إلى 90 درجة (موضع محايد)
- عرض نبضة يبلغ 2 مللي ثانية لتدوير المؤازرة إلى 180 درجة.
قبل توصيل أجهزة Servo بـ ARM7-LPC2148 ، يمكنك اختبار المؤازرة الخاصة بك بمساعدة دائرة اختبار محرك سيرفو. تحقق أيضًا من كيفية ربط محرك سيرفو بوحدات التحكم الدقيقة الأخرى:
- التحكم في محرك سيرفو باستخدام اردوينو
- محرك سيرفو يتفاعل مع متحكم 8051
- التحكم في محرك سيرفو باستخدام MATLAB
- التحكم في محرك سيرفو مع Raspberry Pi
- ربط محرك سيرفو مع MSP430G2
- ربط محرك سيرفو مع STM32F103C8
التحكم في محرك سيرفو باستخدام LPC2148 PWM و ADC
يمكن التحكم في محرك سيرفو بواسطة LPC2148 باستخدام PWM. من خلال توفير إشارة PWM إلى طرف SERVO'S PWM بفترة 20 مللي ثانية وتردد 50 هرتز ، يمكننا وضع عمود المحرك المؤازر حول 180 درجة (-90 إلى +90).
يتم استخدام مقياس الجهد لتغيير دورة عمل إشارة PWM وتدوير عمود المحرك المؤازر ، ويتم تنفيذ هذه الطريقة باستخدام وحدة ADC في LPC2148. لذلك نحن بحاجة إلى تطبيق مفاهيم PWM و ADC في هذا البرنامج التعليمي. لذا يرجى الرجوع إلى دروسنا السابقة لتعلم PWM و ADC في ARM7-LPC2148.
- كيفية استخدام PWM في ARM7-LPC2148
- كيفية استخدام ADC في ARM-LPLC2148
دبابيس PWM & ADC في ARM7-LPC2148
توضح الصورة أدناه دبابيس PWM و ADC في LPC2148. تشير المربعات الصفراء إلى (6) دبابيس PWM والصندوق الأسود يشير إلى (14) سنون ADC.
المكونات مطلوبة
المعدات
- ARM7-LPC2148
- وحدة عرض LCD (16 × 2)
- محرك سيرفو (SG-90)
- 3.3 فولت منظم الجهد
- مقياس الجهد 10 كيلو (عدد 2)
- اللوح
- توصيل الأسلاك
البرمجيات
- Keil uVision5
- أداة فلاش ماجيك
مخطط الدائرة والتوصيلات
يوضح الجدول أدناه الاتصال بين محرك سيرفو و ARM7-LPC2148:
دبابيس سيرفو |
ARM7-LPC2148 |
أحمر (+5 فولت) |
+ 5 فولت |
براون (أرضي) |
GND |
البرتقال (PWM) |
ص 0.1 |
الدبوس P0.1 هو خرج PWM لـ LPC2148.
يوضح الجدول أدناه توصيلات الدائرة بين LCD و ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16 × 2) |
ص 0.4 |
RS (اختيار التسجيل) |
P0.6 |
E (تمكين) |
ص 0.12 |
D4 (دبوس البيانات 4) |
ص 0.13 |
D5 (دبوس البيانات 5) |
ص 0.14 |
D6 (دبوس البيانات 6) |
ص 0.15 |
D7 (دبوس البيانات 7) |
GND |
VSS ، R / W ، K |
+ 5 فولت |
VDD ، أ |
يوضح الجدول أدناه الاتصالات بين ARM7 LPC2148 ومقياس الجهد مع منظم جهد 3.3 فولت.
3.3 فولت الجهد المنظم IC |
وظيفة الدبوس |
ARM-7 LPC2148 دبوس |
1. اليسار دبوس |
- Ve من GND |
دبوس GND |
2-مركز الدبوس |
منظم + خرج 3.3 فولت |
لإدخال مقياس الجهد وإخراج مقياس الجهد إلى P0.28 من LPC2148 |
3. الدبوس الأيمن |
+ Ve من 5V إدخال |
+ 5 فولت |
النقاط المراد ملاحظتها
1. يتم استخدام منظم الجهد 3.3 فولت هنا لتوفير قيمة دخل تناظرية لمسمار ADC (P0.28) من LPC2148. نظرًا لأننا نستخدم طاقة 5 فولت ، فإننا بحاجة إلى تنظيم الجهد باستخدام منظم جهد يبلغ 3.3 فولت.
2. يُستخدم مقياس الجهد لتغيير الجهد بين (0 فولت إلى 3.3 فولت) لتوفير دخل تناظري (ADC) إلى LPC2148 pin P0.28
3. يوفر الدبوس P0.1 لـ LPC2148 خرج PWM لمحرك سيرفو للتحكم في موضع المحرك.
4. وفقًا لقيمة الإدخال التناظري (ADC) ، يتغير موضع محرك المؤازرة من (0 إلى 180 درجة) من خلال دبوس إخراج PWM عند P0.1 من LPC2148.
برمجة ARM7-LPC2148 للتحكم في محرك سيرفو
لبرمجة ARM7-LPC2148 نحتاج إلى أداة keil uVision & Flash Magic. نحن نستخدم كابل USB لبرمجة ARM7 Stick عبر منفذ micro USB. نكتب رمزًا باستخدام Keil وننشئ ملفًا سداسيًا ثم يتم وميض ملف HEX إلى ARM7 باستخدام Flash Magic. لمعرفة المزيد حول تثبيت keil uVision و Flash Magic وكيفية استخدامهما ، اتبع الرابط Getting Started with ARM7 LPC2148 Microcontroller وبرمجته باستخدام Keil uVision.
الخطوات المتبعة في تكوين LPC2148 لـ PWM & ADC للتحكم في محرك سيرفو
الخطوة 1: - قم بتضمين ملفات الرأسية الضرورية لتشفير LPC2148
#تضمن
الخطوة 2: - الشيء التالي هو تكوين PLL لتوليد الساعة لأنه يضبط ساعة النظام والساعة الطرفية لـ LPC2148 حسب حاجة المبرمجين. الحد الأقصى لتردد الساعة لـ LPC2148 هو 60 ميجا هرتز. يتم استخدام الأسطر التالية لتكوين إنشاء ساعة PLL.
باطلة initilizePLL (الفراغ) // وظيفة لاستخدام PLL لتوليد مدار الساعة { PLL0CON = 0x01؛ PLL0CFG = 0x24 ؛ PLL0FEED = 0xAA ، PLL0FEED = 0x55 ؛ بينما (! (PLL0STAT & 0x00000400)) ؛ PLL0CON = 0x03 ؛ PLL0FEED = 0xAA ، PLL0FEED = 0x55 ؛ VPBDIV = 0x01 ؛ }
الخطوة 3: - الشيء التالي الذي يجب فعله هو تحديد دبابيس PWM ووظيفة PWM في LPC2148 باستخدام سجل PINSEL. نستخدم PINSEL0 لأننا نستخدم P0.1 لإخراج PWM لـ LPC2148.
PINSEL0 - = 0x00000008 ؛ // إعداد دبوس P0.1 من LPC2148 كـ PWM3
الخطوة 4: - بعد ذلك ، نحتاج إلى إعادة ضبط المؤقتات باستخدام PWMTCR (سجل التحكم في المؤقت).
PWMTCR = 0x02 ؛ // إعادة تعيين وتعطيل عداد PWM
ثم قم بعد ذلك بتعيين قيمة التدرج المسبق التي تقرر تعيين دقة PWM.
PWMPR = 0x1D ؛ // قيمة سجل Prescale
الخطوة 5: - بعد ذلك ، قم بتعيين PWMMCR (سجل التحكم في تطابق PWM) حيث يقوم بتعيين العملية مثل إعادة التعيين والمقاطعات لـ PWMMR0 و PWMMR3.
PWMMCR = 0x00000203 ؛ // إعادة التعيين والمقاطعة في مباراة MR0 ، والمقاطعة في مباراة MR3
الخطوة 6: - يتم ضبط الحد الأقصى لفترة قناة PWM باستخدام PWMMR0 ويتم ضبط طن دورة عمل PWM مبدئيًا على 0.65 مللي ثانية
PWMMR0 = 20000 ، // الفترة الزمنية لموجة PWM ، 20 مللي ثانية PWMMR3 = 650 ؛ // طن من موجة PWM 0.65 مللي ثانية
الخطوة 7: - بعد ذلك ، نحتاج إلى ضبط Latch Enable على سجلات المطابقة المقابلة باستخدام PWMLER
PWMLER = 0x09 ، // تمكين مزلاج لـ PWM3 و PWM0
(نحن نستخدم PWMMR0 & PWMMR3) لذا قم بتمكين البت المقابل من خلال ضبط 1 في PWMLER
الخطوة 8: - لتمكين إخراج PWM للدبوس ، نحتاج إلى استخدام PWMTCR لتمكين عدادات PWM Timer وأوضاع PWM.
PWMPCR = 0x0800 ؛ // تمكين PWM3 و PWM 0 ، التحكم بالحافة الواحدة PWM PWMTCR = 0x09 // تمكين PWM والعداد
الخطوة 9: - نحتاج الآن إلى الحصول على قيم مقياس الجهد لتعيين دورة عمل PWM من ADC pin P0.28. لذلك ، نستخدم وحدة ADC في LPC2148 لتحويل المدخلات التناظرية لمقاييس الجهد (من 0 إلى 3.3 فولت) إلى قيم ADC (من 0 إلى 1023).
خطوة 10: - ل اختيار ADC دبوس P0.28 في LPC2148، نستخدم
PINSEL1 = 0x01000000 ؛ // إعداد P0.28 كـ ADC INPUT AD0CR = (((14) << 8) - (1 << 21)) ؛ // ضبط الساعة و PDN لتحويل A / D
تلتقط الأسطر التالية المدخلات التناظرية (من 0 إلى 3.3 فولت) وتحولها إلى قيمة رقمية (من 0 إلى 1023). ثم يتم تقسيم هذه القيم الرقمية على 4 لتحويلها إلى (0 إلى 255) ويتم تغذيتها أخيرًا على أنها خرج PWM في P0.1 pin من LPC2148. نحن هنا نقوم بتحويل القيم من 0-1023 إلى 0-255 بتقسيمها على 4 حيث أن PWM لـ LPC2148 لديها دقة 8 بت (28).
AD0CR - = (1 << 1) ؛ // حدد قناة AD0.1 في وقت تأخير تسجيل ADC (10) ؛ AD0CR - = (1 << 24) ؛ // بدء تحويل A / D أثناء ((AD0DR1 & (1 << 31)) == 0) ؛ // تحقق من بت DONE في سجل بيانات ADC adcvalue = (AD0DR1 >> 6) & 0x3ff؛ // احصل على النتيجة من سجل بيانات ADC dutycycle = adcvalue / 4 ؛ // الصيغة للحصول على قيم dutycycle من (0 إلى 255) PWMMR1 = dutycycle ؛ // تعيين قيمة dutycycle إلى PWM مطابقة السجل PWMLER - = (1 << 1) ؛ // تمكين إخراج PWM بقيمة dutycycle
الخطوة 11: - بعد ذلك ، نعرض هذه القيم في وحدة العرض LCD (16X2). لذلك نضيف الأسطر التالية لتهيئة وحدة شاشة LCD
LCD_INITILIZE (باطل) باطل // وظيفة لتجهيز شاشة LCD { IO0DIR = 0x0000FFF0 ؛ // يعين الدبوس P0.12 ، P0.13 ، P0.14 ، P0.15 ، P0.4 ، P0.6 كوقت تأخير الإخراج (20) ؛ LCD_SEND (0x02) ، // تهيئة شاشة LCD في وضع التشغيل ذي 4 بتات LCD_SEND (0x28) ؛ // 2 خطوط (16X2) LCD_SEND (0x0C) ؛ // العرض على المؤشر خارج LCD_SEND (0x06) ؛ // مؤشر الزيادة التلقائية LCD_SEND (0x01) ؛ // عرض واضح LCD_SEND (0x80) ؛ // الموضع الأول في السطر الأول }
نظرًا لأننا قمنا بتوصيل شاشة LCD في وضع 4 بت مع LPC2148 ، فإننا نحتاج إلى إرسال القيم ليتم عرضها على أنها nibble بواسطة nibble (Upper Nibble & Lower Nibble). لذلك يتم استخدام الأسطر التالية.
LCD_DISPLAY (char * msg) باطل // وظيفة لطباعة الأحرف المرسلة واحدة تلو الأخرى { uint8_t i = 0 ؛ while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)) ؛ // يرسل IO0SET العلوي nibble = 0x00000050 ؛ // RS HIGH & ENABLE HIGH لطباعة البيانات IO0CLR = 0x00000020 ؛ // RW LOW Write mode delaytime (2)؛ IO0CLR = 0x00000040 ؛ // EN = 0 ، RS و RW دون تغيير (أي RS = 1 ، RW = 0) وقت التأخير (5) ؛ IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)) ؛ // يرسل IO0SET السفلي nibble = 0x00000050 ؛ // RS & EN HIGH IO0CLR = 0x00000020 ؛ تأخير (2) ؛ IO0CLR = 0x00000040 ؛ وقت التأخير (5) ؛ أنا ++ ؛ } }
لعرض قيم ADC & PWM ، نستخدم الأسطر التالية في دالة int main () .
LCD_SEND (0x80) ؛ sprintf (displayadc، "adcvalue =٪ f"، dutycycle) ؛ LCD_DISPLAY (شاشة العرض) ؛ // عرض قيمة ADC (من 0 إلى 1023) زاوية = (adcvalue / 5.7) ؛ // صيغة لتحويل قيمة ADC إلى زاوية (o إلى 180 درجة) LCD_SEND (0xC0) ؛ sprintf (anglevalue، "ANGLE =٪. 2f deg"، زاوية) ؛ LCD_DISPLAY (anglevalue) ؛
ويرد أدناه رمز كامل ووصف الفيديو للبرنامج التعليمي