- PWM (تعديل عرض النبض)
- دبابيس PWM في ARM7-LPC2148
- تسجيلات PWM في ARM7-LPC2148
- المكونات مطلوبة
- مخطط الدائرة والتوصيلات
- برمجة ARM7-LPC2148 لـ PWM
- الخطوات المتبعة في برمجة LPC2148 لـ PWM & ADC
كما نعلم ، تأخذ المتحكمات الدقيقة المدخلات التناظرية من المستشعرات التناظرية وتستخدم ADC (المحول التناظري إلى الرقمي) لمعالجة تلك الإشارات. ولكن ماذا لو أراد المتحكم الدقيق إنتاج إشارة تناظرية للتحكم في الأجهزة التي تعمل بالتناظرية مثل محرك سيرفو أو محرك تيار مستمر وما إلى ذلك؟ لا تنتج وحدات التحكم الدقيقة جهد خرج مثل 1 فولت ، 5 فولت بدلاً من ذلك تستخدم تقنية تسمى PWM لتشغيل الأجهزة التناظرية. مثال على PWM هو مروحة تبريد الكمبيوتر المحمول (محرك DC) الذي يحتاج إلى التحكم في السرعة وفقًا لدرجة الحرارة ، ويتم تنفيذ الشيء نفسه باستخدام تقنية Pulse Width Modulation (PWM) في اللوحات الأم.
في هذا البرنامج التعليمي سوف نتحكم في سطوع LED باستخدام PWM في متحكم ARM7-LPC2148.
PWM (تعديل عرض النبض)
تعد PWM طريقة جيدة للتحكم في الأجهزة التناظرية باستخدام القيمة الرقمية مثل التحكم في سرعة المحرك ، وسطوع المصباح وما إلى ذلك. على الرغم من أن PWM لا يوفر إخراجًا تناظريًا خالصًا ، إلا أنه يولد نبضات تناظرية مناسبة للتحكم في الأجهزة التناظرية. يقوم PWM في الواقع بتعديل عرض موجة نبضية مستطيلة من أجل الحصول على تباين في متوسط قيمة الموجة الناتجة.
دورة عمل PWM
تسمى النسبة المئوية للوقت الذي تظل فيه إشارة PWM عالية (في الوقت المحدد) كدورة عمل. إذا كانت الإشارة في وضع التشغيل دائمًا ، فهي في دورة عمل بنسبة 100٪ ، وإذا كانت متوقفة عن التشغيل دائمًا ، تكون 0٪ من دورة العمل.
دورة العمل = وقت التشغيل / (وقت التشغيل + وقت الإيقاف)
دبابيس PWM في ARM7-LPC2148
تشير الصورة أدناه إلى دبابيس خرج PWM في ARM7-LPC2148 ، ويوجد إجمالي ستة دبابيس لـ PWM.
قناة PWM |
دبابيس المنفذ LPC2148 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
ص 0.1 |
PWM4 |
P0.8 |
PWM5 |
ص 0.21 |
PWM6 |
ص 0.9 |
تسجيلات PWM في ARM7-LPC2148
قبل الدخول في مشروعنا ، نحتاج إلى التعرف على سجلات PWM في LPC2148.
فيما يلي قائمة بالسجلات المستخدمة في LPC2148 لـ PWM
1. PWMPR: PWM Prescale Register
الاستخدام: إنه سجل 32 بت. يحتوي على عدد المرات (ناقص 1) التي يجب أن تدور فيها PCLK قبل زيادة عداد المؤقت PWM (يحتوي في الواقع على أقصى قيمة لعداد ما قبل المقياس).
2. PWMPC: PWM Prescaler Counter
الاستخدام: إنه سجل 32 بت . يحتوي على قيمة العداد المتزايدة. عندما تساوي هذه القيمة قيمة PR زائد 1 ، يتم زيادة PWM Timer Counter (TC).
3. PWMTCR: PWM Timer Control Register
الاستخدام: يحتوي على بتات التحكم Enable Counter و Counter Reset و PWM Enable. إنه سجل 8 بت.
7: 4 |
3 |
2 |
1 |
0 |
محجوز |
تمكين PWM |
محجوز |
إعادة تعيين العداد |
تمكين العداد |
- تمكين PWM: (بت -3)
0- PWM معطل
1- تمكين PWM
- تمكين العداد: (بت 0)
0- تعطيل العدادات
1- تمكين العداد
- إعادة ضبط العداد: (بت -1)
0- لا تفعل شيئًا.
1- يعيد ضبط PWMTC & PWMPC على الحافة الإيجابية لـ PCLK.
4. PWMTC: عداد مؤقت PWM
الاستخدام: إنه سجل 32 بت. يحتوي على القيمة الحالية لتزايد PWM Timer. عندما يصل عداد Prescaler (PC) إلى قيمة Prescaler Register (PR) زائد 1 ، يتم زيادة هذا العداد.
5. PWMIR: سجل مقاطعة PWM
الاستخدام: إنه سجل 16 بت. يحتوي على إشارات المقاطعة لقنوات مطابقة PWM 0-6 يتم تعيين علامة المقاطعة عند حدوث مقاطعة لتلك القناة (MRx Interrupt) حيث يكون X هو رقم القناة (من 0 إلى 6).
6. PWMMR0-PWMMR6: سجل مطابقة PWM
الاستخدام: إنه سجل 32 بت . في الواقع ، تسمح مجموعة قنوات المطابقة بإعداد 6 مخرجات PWM يتم التحكم فيها بحافة واحدة أو 3 مخرجات PWM يتم التحكم فيها بحافة مزدوجة. يمكنك تعديل قنوات المطابقة السبع لتكوين نواتج PWM هذه لتلائم متطلباتك في PWMPCR.
7. PWMMCR: PWM Match Control Register
الاستخدام: إنه سجل 32 بت. يحتوي على بتات المقاطعة وإعادة التعيين والإيقاف التي تتحكم في قناة المطابقة المحددة. يحدث تطابق بين سجلات مطابقة PWM وعدادات عداد توقيت PWM.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
محجوز |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
هنا x من 0 إلى 6
- PWMMRxI (بت 0)
تمكين أو تعطيل المقاطعات PWM
0- تعطيل مقاطعة PWM Match.
1- تفعيل مقاطعة PWM Match.
- PWMMRxR: (بت -1)
RESET PWMTC - قيمة عداد المؤقت عندما تتطابق مع PWMRx
0- لا تفعل شيئا.
1- يعيد ضبط PWMTC.
- PWMMRxS: (بت 2)
STOP PWMTC & PWMPC عندما تصل PWMTC إلى قيمة تسجيل المطابقة
0- تعطيل خاصية إيقاف PWM.
1- قم بتمكين خاصية PWM Stop.
8. PWMPCR: سجل التحكم PWM
الاستخدام: إنه سجل 16 بت. يحتوي على البتات التي تمكّن مخرجات PWM من 0 إلى 6 وتحديد تحكم أحادي الحافة أو مزدوج الحافة لكل مخرج.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
غير مستعمل |
PWMENA6-PWMENA1 |
غير مستعمل |
PWMSEL6-PWMSEL2 |
غير مستعمل |
- PWMSELx (x: 2 إلى 6)
- وضع Single Edge لـ PWMx
- 1- وضع الحواف المزدوجة لـ PWMx.
- PWMENAx (x: 1 إلى 6)
- تعطيل PWMx.
- 1- تمكين PWMx.
9. PWMLER: PWM Latch تمكين التسجيل
الاستخدام: إنه سجل 8 بت. يحتوي على بتات Match x Latch لكل قناة مطابقة.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
غير مستعمل |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 to 6):
0- تعطيل تحميل قيم المطابقة الجديدة
1- قم بتحميل قيم المطابقة الجديدة من (PWMMRx) PWMMatch Register عند إعادة تعيين المؤقت.
لنبدأ الآن في إنشاء إعداد الأجهزة لإثبات تعديل عرض النبض في متحكم ARM.
المكونات مطلوبة
المعدات
- متحكم ARM7-LPC2148
- 3.3 فولت الجهد المنظم IC
- 10 كيلو الجهد
- LED (أي لون)
- وحدة عرض LCD (16 × 2)
- اللوح
- توصيل الأسلاك
البرمجيات
- Keil uVision5
- أداة فلاش ماجيك
مخطط الدائرة والتوصيلات
التوصيلات بين 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 ، أ |
اتصال بين LED و ARM7-LPC2148
يتم توصيل ANODE الخاص بـ LED بإخراج PWM (P0.0) من LPC2148 ، بينما يتم توصيل دبوس CATHODE الخاص بـ LED بدبوس GND الخاص بـ LPC2148.
اتصال بين 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
برمجة ARM7-LPC2148 لـ PWM
لبرمجة 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.
في هذا البرنامج التعليمي ، سوف نستخدم تقنية ADC و PWM للتحكم في سطوع LED. هنا يتم إعطاء LPC2148 المدخلات التناظرية (0 إلى 3.3 فولت) عبر إدخال ADC دبوس P0.28 ، ثم يتم تحويل هذا الإدخال التناظري إلى قيمة رقمية (0 إلى 1023). ثم يتم تحويل هذه القيمة مرة أخرى إلى قيمة رقمية (0-255) حيث أن إخراج PWM لـ LPC2148 له دقة 8 بت فقط (2 8). LED متصل بـ PWM pin P0.0 ويمكن التحكم في سطوع LED باستخدام مقياس الجهد. لمعرفة المزيد عن ADC في ARM7-LPC2148 ، اتبع الرابط.
الخطوات المتبعة في برمجة LPC2148 لـ PWM & ADC
الخطوة 1: - أول شيء هو تكوين 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 ؛ }
الخطوة 2: - الشيء التالي هو تحديد دبابيس PWM ووظيفة PWM لـ LPC2148 باستخدام سجل PINSEL. نستخدم PINSEL0 حيث نستخدم P0.0 لإخراج PWM لـ LPC2148.
PINSEL0 = 0x00000002 ؛ // إعداد دبوس P0.0 لإخراج PWM
الخطوة 3: - بعد ذلك نحتاج إلى إعادة ضبط أجهزة ضبط الوقت باستخدام PWMTCR (سجل التحكم في المؤقت).
PWMTCR = (1 << 1) ؛ // إعداد التحكم في المؤقت PWM سجل كعداد إعادة تعيين
وبعد ذلك ، قم بتعيين قيمة المقياس المسبق التي تحدد دقة PWM. أنا أضعه على الصفر
PWMPR = 0X00 ؛ // إعداد قيمة المقياس المسبق لـ PWM
الخطوة 4: - بعد ذلك ، نحتاج إلى ضبط PWMMCR (سجل التحكم في تطابق PWM) لأنه يحدد عملية مثل إعادة التعيين والمقاطعات لـ PWMMR0.
PWMMCR = (1 << 0) - (1 << 1) ؛ // إعداد سجل التحكم في مطابقة PWM
الخطوة 5: - يتم ضبط المدة القصوى لقناة PWM باستخدام PWMMR.
PWMMR0 = PWMvalue ، // إعطاء قيمة PWM القيمة القصوى
في حالتنا القيمة القصوى هي 255 (لأقصى سطوع)
الخطوة 6: - بعد ذلك ، نحتاج إلى ضبط Latch Enable على سجلات المطابقة المقابلة باستخدام PWMLER
PWMLER = (1 << 0) ؛ // Enalbe PWM مزلاج
(نحن نستخدم PWMMR0) لذا قم بتمكين البت المقابل من خلال ضبط 1 في PWMLER
الخطوة 7: - لتمكين خرج PWM للدبوس ، نحتاج إلى استخدام PWMTCR لتمكين عدادات PWM Timer وأوضاع PWM.
PWMTCR = (1 << 0) - (1 << 3) ؛ // تمكين عداد PWM و PWM
الخطوة 8: - الآن نحن بحاجة إلى الحصول على قيم مقياس الجهد لتحديد دورة عمل PWM من ADC pin P0.28. لذلك نستخدم وحدة ADC في LPC2148 لتحويل المدخلات التناظرية لمقاييس الجهد (0 إلى 3.3 فولت) إلى قيم ADC (من 0 إلى 1023).
نحن هنا نقوم بتحويل القيم من 0-1023 إلى 0-255 بتقسيمها على 4 لأن PWM لـ LPC2148 لديها دقة 8 بت (2 8).
خطوة 9: - ل اختيار 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.0 دبوس من LPC2148 الذي يتصل به مؤشر LED.
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
الخطوة 10: - بعد ذلك نعرض هذه القيم في وحدة العرض 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"، adcvalue) ؛ LCD_DISPLAY (شاشة العرض) ؛ // عرض قيمة ADC (من 0 إلى 1023) LCD_SEND (0xC0) ؛ sprintf (ledoutput ، "PWM OP =٪. 2f" ، السطوع) ؛ LCD_DISPLAY (ledoutput) ؛ // عرض قيم dutycycle من (0 إلى 255)
ويرد أدناه رمز كامل ووصف الفيديو للبرنامج التعليمي.