- ما هي إشارة PWM؟
- PWM باستخدام PIC16F877A:
- برمجة PIC لتوليد إشارات PWM:
- المخططات والاختبار:
- العمل على الأجهزة:
هذا هو البرنامج التعليمي العاشر لدينا لتعلم ميكروكنترولر الموافقة المسبقة عن علم باستخدام MPLAB و XC8. حتى الآن ، قمنا بتغطية العديد من البرامج التعليمية الأساسية مثل وميض LED مع الموافقة المسبقة عن علم ، والمؤقتات في الموافقة المسبقة عن علم ، وواجهات LCD ، وتفاعل 7 أجزاء ، و ADC باستخدام PIC وما إلى ذلك. إذا كنت مبتدئًا تمامًا ، فيرجى زيارة القائمة الكاملة لدروس الموافقة المسبقة عن علم هنا و ابدا بالتعلم.
في هذا البرنامج التعليمي ، سوف نتعلم كيفية إنشاء إشارات PWM باستخدام PIC PIC16F877A. يحتوي PIC MCU الخاص بنا على وحدة خاصة تسمى Compare Capture module (CCP) والتي يمكن استخدامها لتوليد إشارات PWM. هنا ، سوف نولد PWM من 5 كيلو هرتز مع دورة عمل متغيرة من 0٪ إلى 100٪. لتغيير دورة العمل ، نستخدم مقياس الجهد ، ومن ثم يوصى بتعلم برنامج ADC التعليمي قبل البدء بـ PWM. تستخدم وحدة PWM أيضًا مؤقتات لضبط ترددها ومن ثم تعلم كيفية استخدام أجهزة ضبط الوقت مسبقًا هنا. علاوة على ذلك ، في هذا البرنامج التعليمي ، سنستخدم دائرة RC ومصباح LED لتحويل قيم PWM إلى جهد تناظري واستخدامها لتعتيم ضوء LED.
ما هي إشارة PWM؟
يعد تعديل عرض النبض (PWM) إشارة رقمية تستخدم بشكل شائع في دوائر التحكم. تم ضبط هذه الإشارة عالية (5 فولت) ومنخفضة (0 فولت) في وقت وسرعة محددين مسبقًا. يسمى الوقت الذي تظل فيه الإشارة عالية "في الوقت المحدد" والوقت الذي تظل خلاله الإشارة منخفضة يسمى "وقت التوقف". هناك نوعان من المعلمات الهامة لـ PWM كما هو موضح أدناه:
دورة عمل PWM:
تسمى النسبة المئوية للوقت الذي تظل فيه إشارة PWM عالية (في الوقت المحدد) كدورة عمل. إذا كانت الإشارة في وضع التشغيل دائمًا ، فهي في دورة عمل بنسبة 100٪ ، وإذا كانت متوقفة عن التشغيل دائمًا ، تكون 0٪ من دورة العمل.
دورة العمل = وقت التشغيل / (وقت التشغيل + وقت الإيقاف)
تردد PWM:
يحدد تردد إشارة PWM مدى سرعة إكمال PWM لفترة واحدة. فترة واحدة كاملة وإيقاف تشغيل إشارة PWM كما هو موضح في الشكل أعلاه. في البرنامج التعليمي الخاص بنا ، سنقوم بتعيين تردد 5 كيلو هرتز.
PWM باستخدام PIC16F877A:
يمكن إنشاء إشارات PWM في متحكم PIC الخاص بنا باستخدام وحدة CCP (مقارنة الالتقاط PWM). دقة إشارة PWM الخاصة بنا هي 10 بت ، أي للقيمة 0 ستكون هناك دورة عمل بنسبة 0٪ وقيمة 1024 (2 ^ 10) ستكون هناك دورة عمل بنسبة 100٪. هناك نوعان من وحدات CCP في PIC MCU (CCP1 و CCP2) ، وهذا يعني أنه يمكننا إنشاء إشارتين PWM على دبابيس مختلفة (دبوس 17 و 16) في وقت واحد ، في البرنامج التعليمي الخاص بنا ، نستخدم CCP1 لإنشاء إشارات PWM على الدبوس 17.
تُستخدم السجلات التالية لتوليد إشارات PWM باستخدام PIC MCU:
- CCP1CON (سجل التحكم CCP1)
- T2CON (Timer 2 Control Register)
- PR2 (Timer 2 Modules Period Register)
- CCPR1L (سجل CCP 1 منخفض)
برمجة PIC لتوليد إشارات PWM:
في برنامجنا ، سنقرأ جهدًا تناظريًا من 0-5 فولت من مقياس الجهد ونرسمه إلى 0-1024 باستخدام وحدة ADC الخاصة بنا. ثم نولد إشارة PWM بتردد 5000 هرتز ونغير دورة عملها بناءً على الجهد التناظري للإدخال. هذا هو 0-1024 سيتم تحويله إلى 0٪ -100٪ دورة العمل. يفترض هذا البرنامج التعليمي أنك قد تعلمت بالفعل استخدام ADC في PIC إذا لم يكن كذلك ، فاقرأه من هنا ، لأننا سنتخطى التفاصيل المتعلقة به في هذا البرنامج التعليمي.
لذلك ، بمجرد تعيين بتات التكوين وكتابة البرنامج لقراءة قيمة تناظرية ، يمكننا المضي قدمًا في PWM.
يجب اتخاذ الخطوات التالية عند تكوين وحدة CCP لتشغيل PWM:
- اضبط فترة PWM عن طريق الكتابة إلى سجل PR2.
- اضبط دورة عمل PWM عن طريق الكتابة إلى سجل CCPR1L و CCP1CON <5: 4> بت.
- اجعل دبوس CCP1 ناتجًا عن طريق مسح بت TRISC <2>.
- اضبط قيمة مقياس TMR2 المسبق وقم بتمكين Timer2 عن طريق الكتابة إلى T2CON.
- تكوين وحدة CCP1 لتشغيل PWM.
هناك وظيفتان مهمتان في هذا البرنامج لتوليد إشارات PWM. إحداها هي وظيفة PWM_Initialize () التي ستقوم بتهيئة السجلات المطلوبة لإعداد وحدة PWM ثم تعيين التردد الذي يجب أن تعمل به PWM ، والوظيفة الأخرى هي وظيفة PWM_Duty () التي ستحدد دورة عمل إشارة PWM في السجلات المطلوبة.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1 ؛ // إعداد صيغ PR2 باستخدام ورقة البيانات // يجعل PWM يعمل في 5 كيلو هرتز CCP1M3 = 1 ؛ CCP1M2 = 1 ؛ // تكوين وحدة CCP1 T2CKPS0 = 1 ؛ T2CKPS1 = 0 ؛ TMR2ON = 1 ، // تكوين وحدة Timer TRISC2 = 0 ؛ // make port pin on C as output}
الوظيفة المذكورة أعلاه هي وظيفة تهيئة PWM ، في هذه الوظيفة تم تعيين وحدة CCP1 لاستخدام PWM بجعل البت CCP1M3 و CCP1M2 مرتفعين.
يتم ضبط المقياس المسبق لوحدة المؤقت عن طريق جعل البت T2CKPS0 مرتفعًا و T2CKPS1 منخفضًا ، حيث تم ضبط بت TMR2ON لبدء المؤقت.
الآن ، يتعين علينا ضبط تردد إشارة PWM. يجب كتابة قيمة التردد في سجل PR2. يمكن ضبط التردد المطلوب باستخدام الصيغ أدناه
فترة PWM = * 4 * TOSC * (قيمة TMR2 Prescale)
سيعطي إعادة ترتيب هذه الصيغ للحصول على PR2
PR2 = (الفترة / (4 * Tosc * TMR2 Prescale)) - 1
نحن نعلم أن الفترة = (1 / PWM_freq) و Tosc = (1 / _XTAL_FREQ). وبالتالي…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1 ؛
بمجرد ضبط التردد ، لا يلزم استدعاء هذه الوظيفة مرة أخرى ما لم وحتى نحتاج إلى تغيير التردد مرة أخرى. في البرنامج التعليمي الخاص بنا ، قمت بتعيين PWM_freq = 5000 ؛ حتى نتمكن من الحصول على تردد تشغيل 5 كيلو هرتز لإشارة PWM الخاصة بنا.
الآن دعونا نضبط دورة عمل PWM باستخدام الوظيفة أدناه
PWM_Duty (واجب int غير موقعة) {if (duty <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)) ؛ // عند التخفيض // واجب = (((تعويم) واجب / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE) ؛ CCP1X = واجب & 1 ؛ // قم بتخزين البتة الأولى CCP1Y = duty & 2 ؛ // تخزين البت 0 CCPR1L = duty >> 2 ؛ // تخزين 8 بت المتبقية}}
إشارة PWM الخاصة بنا لها دقة 10 بت ومن ثم لا يمكن تخزين هذه القيمة في سجل واحد لأن الموافقة المسبقة عن علم لدينا لديها خطوط بيانات 8 بت فقط. لذلك استخدمنا بتين أخريين من CCP1CON <5: 4> (CCP1X و CCP1Y) لتخزين آخر اثنين من LSB ثم تخزين الـ 8 بت المتبقية في سجل CCPR1L.
يمكن حساب وقت دورة العمل PWM باستخدام الصيغ أدناه:
دورة عمل PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Prescale Value)
إعادة ترتيب هذه الصيغ للحصول على قيمة CCPR1L و CCP1CON سيعطي:
CCPRIL: CCP1Con <5: 4> = دورة عمل PWM / (Tosc * TMR2 Prescale Value)
ستكون قيمة ADC الخاصة بنا من 0 إلى 1024 ، نحتاج إلى أن تكون في 0٪ -100٪ ، وبالتالي ، PWM Duty Cycle = duty / 1023. علاوة على ذلك ، لتحويل دورة العمل هذه إلى فترة زمنية ، يتعين علينا ضربها بالفترة (1 / PWM_freq)
نعلم أيضًا أن Tosc = (1 / PWM_freq) ، وبالتالي..
واجب = ((تعويم) واجب / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE) ؛
سيعطينا حل المعادلة أعلاه:
واجب = ((تعويم) واجب / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE)) ؛
يمكنك التحقق من البرنامج الكامل في قسم الكود أدناه مع الفيديو التفصيلي.
المخططات والاختبار:
كالعادة ، دعونا نتحقق من المخرجات باستخدام محاكاة Proteus. يظهر مخطط الدائرة أدناه.
قم بتوصيل مقياس الجهد بالدبوس السابع للتغذية بجهد من 0-5. وحدة CCP1 مزودة برقم 17 (RC2) ، هنا سيتم إنشاء PWM والتي يمكن التحقق منها باستخدام راسم الذبذبات الرقمي. علاوة على ذلك ، لتحويل هذا إلى جهد متغير ، استخدمنا مرشح RC ومصباح LED للتحقق من الإخراج بدون نطاق.
ما هو فلتر RC؟
على مرشح RC أو مرشح تمرير منخفض هو دائرة بسيطة مع اثنين من العناصر السلبية وهي المقاوم ومكثف. يتم استخدام هذين المكونين لتصفية تردد إشارة PWM الخاصة بنا وجعلها جهدًا متغيرًا للتيار المستمر.
إذا فحصنا الدائرة ، عند تطبيق جهد متغير على دخل R ، سيبدأ المكثف C في الشحن. بناءً على قيمة المكثف ، سيستغرق المكثف بعض الوقت ليتم شحنه بالكامل ، وبمجرد شحنه ، فإنه يمنع تيار التيار المستمر (تذكر كتلة المكثفات DC ولكنها تسمح بالتيار المتردد) ومن ثم سيظهر جهد الدخل المستمر عبر الإخراج. سيتم تأريض PWM عالي التردد (إشارة التيار المتردد) من خلال المكثف. وهكذا يتم الحصول على تيار مستمر نقي عبر المكثف. تم العثور على قيمة 1000Ohm و 1uf لتكون مناسبة لهذا المشروع. يتضمن حساب قيم R و C تحليل الدائرة باستخدام وظيفة النقل ، والتي تعد خارج نطاق هذا البرنامج التعليمي.
يمكن التحقق من إخراج البرنامج باستخدام راسم الذبذبات الرقمي كما هو موضح أدناه ، وتغيير مقياس الجهد ويجب أن تتغير دورة عمل PWM. يمكننا أيضًا ملاحظة جهد الخرج لدائرة RC باستخدام الفولتميتر. إذا كان كل شيء يعمل كما هو متوقع ، فيمكننا متابعة أجهزتنا. مزيد من التحقق من الفيديو في النهاية للعملية الكاملة.
العمل على الأجهزة:
إعداد الأجهزة للمشروع بسيط للغاية ، سنقوم فقط بإعادة استخدام لوحة PIC Perf الموضح أدناه.
سنحتاج أيضًا إلى مقياس جهد للتغذية بالجهد التناظري ، لقد قمت بتوصيل بعض الأسلاك الطرفية الأنثوية بوعائي (كما هو موضح أدناه) حتى نتمكن من توصيلها مباشرة بلوحة PIC Perf.
أخيرًا للتحقق من الإخراج ، نحتاج إلى دائرة RC ومصباح LED لمعرفة كيفية عمل إشارة PWM ، لقد استخدمت ببساطة لوحة أداء صغيرة ولحمت دائرة RC و LED (للتحكم في السطوع) عليها كما هو موضح أدناه
يمكننا استخدام أسلاك توصيل أنثى إلى أنثى بسيطة وربطها وفقًا للخطط الموضحة أعلاه. بمجرد الانتهاء من الاتصال ، قم بتحميل البرنامج إلى PIC باستخدام pickit3 الخاص بنا ، ويجب أن تكون قادرًا على الحصول على جهد متغير بناءً على مدخلات مقياس الجهد الخاص بك. يتم استخدام الإخراج المتغير للتحكم في سطوع LED هنا.
لقد استخدمت جهاز القياس المتعدد الخاص بي لقياس النواتج المتغيرة ، ويمكننا أيضًا ملاحظة تغيير سطوع مؤشر LED لمستويات الجهد المختلفة.
لقد قمنا ببرمجة قراءة الجهد التناظري من POT وتحويله إلى إشارات PWM والتي تم تحويلها بدورها إلى جهد متغير باستخدام مرشح RC ويتم التحقق من النتيجة باستخدام أجهزتنا. إذا كان لديك بعض الشك أو تعثرت في مكان ما ، فيرجى استخدام قسم التعليقات أدناه ، وسنكون سعداء لمساعدتك. و تعمل استكمال العمل في الفيديو.
تحقق أيضًا من دروس PWM الأخرى الخاصة بنا على وحدات التحكم الدقيقة الأخرى:
- دروس Raspberry Pi PWM
- PWM مع Arduino Due
- اردوينو LED باهتة باستخدام PWM
- ضوء LED للطاقة باستخدام متحكم ATmega32