- ما هو PWM (النبض مع التعديل)؟
- PWM في STM32
- المكونات مطلوبة
- تفاصيل دبوس STM32
- مخطط الدائرة والتوصيلات
- برمجة STM32
في المقالة السابقة رأينا حول تحويل ADC باستخدام STM32. في هذا البرنامج التعليمي ، سنتعرف على PWM (تعديل عرض النبض) في STM32 وكيف يمكننا التحكم في سطوع LED أو سرعة مروحة التيار المستمر باستخدام تقنية PWM.
نعلم أن هناك نوعين من الإشارات: التناظرية والرقمية. الإشارات التناظرية لها جهد مثل (3V ، 1V… إلخ) والإشارات الرقمية لها (1 'و 0). مخرجات المستشعرات عبارة عن إشارات تمثيلية ويتم تحويل هذه الإشارات التناظرية إلى رقمية باستخدام ADC ، لأن المتحكمات الدقيقة لا تفهم إلا الرقمية. بعد معالجة قيم ADC هذه ، يجب تحويل الإخراج مرة أخرى إلى شكل تمثيلي لتشغيل الأجهزة التناظرية. لذلك نستخدم طرقًا معينة مثل PWM والمحولات الرقمية إلى التناظرية (DAC) وما إلى ذلك.
ما هو PWM (النبض مع التعديل)؟
PWM هي طريقة للتحكم في الأجهزة التناظرية باستخدام القيمة الرقمية مثل التحكم في سرعة المحرك ، وسطوع المصباح الخ. نحن نعلم أن المحرك والصمام يعمل على الإشارة التناظرية. لكن PWM لا يوفر خرجًا تناظريًا خالصًا ، فإن PWM يشبه الإشارة التناظرية التي يتم إجراؤها بواسطة نبضات قصيرة ، والتي يتم توفيرها بواسطة دورة العمل.
دورة عمل PWM
تسمى النسبة المئوية للوقت الذي تظل فيه إشارة PWM عالية (في الوقت المحدد) كدورة عمل. إذا كانت الإشارة في وضع التشغيل دائمًا ، فهي في دورة عمل بنسبة 100٪ ، وإذا كانت متوقفة عن التشغيل دائمًا ، تكون 0٪ من دورة العمل.
دورة العمل = وقت التشغيل / (وقت التشغيل + وقت الإيقاف)
PWM في STM32
يحتوي STM32F103C8 على 15 دبوسًا PWM و 10 دبابيس ADC. هناك 7 مؤقتات ويتم توفير كل مخرج PWM بواسطة قناة متصلة بـ 4 مؤقتات. لديها دقة 16 بت PWM (2 16) ، أي عدادات ومتغيرات يمكن أن تصل إلى 65535. مع معدل ساعة 72 ميجا هرتز ، يمكن أن يكون لإخراج PWM فترة قصوى تبلغ حوالي مللي ثانية.
- لذا فإن القيمة 65535 تعطي سطوعًا كاملًا لمصباح LED وسرعة كاملة لمروحة DC (دورة تشغيل 100٪)
- وبالمثل ، تعطي القيمة 32767 سطوعًا نصفًا لمصباح LED وسرعة نصف مروحة DC (دورة تشغيل بنسبة 50٪)
- وتعطي قيمة 13107 (20٪) سطوع و (20٪) سرعة (20٪ دورة تشغيل)
في هذا البرنامج التعليمي ، نستخدم مقياس الجهد و STM32 لتغيير سطوع LED وسرعة مروحة DC باستخدام تقنية PWM. يتم استخدام شاشة LCD مقاس 16 × 2 لعرض قيمة ADC (0-4095) والمتغير المعدل (قيمة PWM) الناتج (0-65535).
فيما يلي بعض أمثلة PWM مع متحكم آخر:
- توليد PWM باستخدام PIC Microcontroller مع MPLAB و XC8
- التحكم في محرك سيرفو مع Raspberry Pi
- اردوينو LED باهتة باستخدام PWM
- تعديل عرض النبضة (PWM) باستخدام MSP430G2
تحقق من جميع المشاريع المتعلقة بـ PWM هنا.
المكونات مطلوبة
- STM32F103C8
- مروحة DC
- ULN2003 محرك سائق IC
- LED (أحمر)
- LCD (16 × 2)
- مقياس فرق الجهد
- اللوح
- بطارية 9 فولت
- أسلاك توصيل
مروحة DC: مروحة DC المستخدمة هنا هي مروحة BLDC من جهاز كمبيوتر قديم ، وهي تتطلب مصدرًا خارجيًا لذلك نحن نستخدم بطارية 9V DC.
ULN2003 Motor Driver IC: يستخدم لقيادة المحرك في اتجاه واحد حيث أن المحرك أحادي الاتجاه وأيضًا الطاقة الخارجية مطلوبة للمروحة. تعرف على المزيد حول حلبة سائق المحرك ULN2003 هنا. يوجد أدناه مخطط الموافقة المسبقة عن علم لـ ULN2003:
الدبابيس (IN1 إلى IN7) هي دبابيس إدخال و (OUT 1 to OUT 7) هي دبابيس إخراج مقابلة. يتم إعطاء COM جهد مصدر موجب مطلوب لأجهزة الإخراج.
LED: يستخدم اللون الأحمر الذي ينبعث منه الضوء الأحمر. يمكن استخدام أي ألوان.
مقاييس الجهد: يتم استخدام مقياسين للجهد أحدهما لمقسم الجهد للإدخال التناظري إلى ADC والآخر للتحكم في سطوع الصمام.
تفاصيل دبوس STM32
كما يمكننا أن نرى دبابيس PWM موضحة في شكل موجة (~) ، هناك 15 دبابيس من هذا القبيل ، ودبابيس ADC ممثلة باللون الأخضر ، وهناك 10 دبابيس ADC تستخدم للمدخلات التناظرية.
مخطط الدائرة والتوصيلات
يتم شرح توصيلات STM32 بمكونات مختلفة على النحو التالي:
STM32 مع إدخال تناظري (ADC)
يتم استخدام مقياس الجهد الموجود في الجانب الأيسر من الدائرة كمنظم للجهد ينظم الجهد من دبوس 3.3 فولت. الناتج من مقياس الجهد ، أي دبوس مركزي لمقياس الجهد متصل بدبوس ADC (PA4) في STM32.
STM32 مع LED
يتم توصيل دبوس الإخراج STM32 PWM (PA9) بالدبوس الموجب للـ LED من خلال المقاوم المتسلسل والمكثف.
الصمام مع المقاوم والمكثف
يتم توصيل المقاوم المتسلسل والمكثف بالتوازي مع LED لتوليد موجة تناظرية صحيحة من خرج PWM حيث أن الإخراج التناظري ليس خالصًا من عند إنشائه مباشرة من دبوس PWM.
STM32 مع ULN2003 و ULN2003 مع مروحة
يتم توصيل دبوس الإخراج STM32 PWM (PA8) بدبوس الإدخال (IN1) الخاص بـ ULN2003 IC ودبوس الإخراج المقابل (OUT1) الخاص بـ ULN2003 متصل بالسلك السلبي لشبكة DC FAN.
يتم توصيل دبوس موجب لمروحة التيار المستمر بدبوس COM الخاص بـ ULN2003 IC والبطارية الخارجية (9V DC) متصلة أيضًا بنفس دبوس COM الخاص بـ ULN2003 IC. يتم توصيل دبوس GND الخاص بـ ULN2003 بدبوس GND الخاص بـ STM32 والبطارية السالبة متصلة بدبوس GND نفسه.
STM32 بشاشة LCD (16 × 2)
رقم دبوس LCD |
اسم دبوس LCD |
اسم دبوس STM32 |
1 |
الأرض (Gnd) |
مطحون (G) |
2 |
VCC |
5 فولت |
3 |
VEE |
دبوس من مركز مقياس الجهد |
4 |
اختيار التسجيل (RS) |
PB11 |
5 |
قراءة / كتابة (RW) |
مطحون (G) |
6 |
تمكين (بالإنكليزية) |
PB10 |
7 |
بت البيانات 0 (DB0) |
لا يوجد اتصال (NC) |
8 |
بت البيانات 1 (DB1) |
لا يوجد اتصال (NC) |
9 |
بت البيانات 2 (DB2) |
لا يوجد اتصال (NC) |
10 |
بت البيانات 3 (DB3) |
لا يوجد اتصال (NC) |
11 |
بت البيانات 4 (DB4) |
PB0 |
12 |
بت البيانات 5 (DB5) |
PB1 |
13 |
بت البيانات 6 (DB6) |
PC13 |
14 |
بت البيانات 7 (DB7) |
PC14 |
15 |
LED إيجابي |
5 فولت |
16 |
سلبي LED |
مطحون (G) |
يتم استخدام مقياس الجهد الموجود على الجانب الأيمن للتحكم في تباين شاشة LCD. يوضح الجدول أعلاه الاتصال بين LCD و STM32.
برمجة STM32
مثل البرنامج التعليمي السابق ، قمنا ببرمجة STM32F103C8 مع Arduino IDE من خلال منفذ USB دون استخدام مبرمج FTDI. للتعرف على برمجة STM32 باستخدام Arduino IDE ، اتبع الرابط. يمكننا متابعة البرمجة كما هو الحال في Arduino. يتم إعطاء رمز كامل في النهاية.
في هذا الترميز ، سنأخذ قيمة تناظرية إدخال من دبوس ADC (PA4) المتصل بالدبوس المركزي لمقياس الجهد الأيسر ثم نحول القيمة التناظرية (0-3.3 فولت) إلى تنسيق رقمي أو صحيح (0-4095). يتم توفير هذه القيمة الرقمية أيضًا كمخرج PWM للتحكم في سطوع LED وسرعة مروحة التيار المستمر. يتم استخدام شاشة LCD مقاس 16 × 2 لعرض ADC والقيمة المعينة (قيمة خرج PWM).
نحتاج أولاً إلى تضمين ملف رأس LCD ، والإعلان عن دبابيس LCD وتهيئتها باستخدام الكود أدناه. تعرف على المزيد حول توصيل شاشة LCD مع STM32 هنا.
#تضمن
بعد ذلك ، قم بتعريف وتعريف أسماء الدبوس باستخدام دبوس STM32
دخل تناظري int = PA4 ؛ // المدخلات من مقياس الجهد const int led = PA9 ؛ // LED إخراج ثابت مروحة = PA8 ؛ // إخراج المروحة
الآن داخل الإعداد () ، نحتاج إلى عرض بعض الرسائل ومسحها بعد بضع ثوانٍ وتحديد دبوس INPUT ودبابيس إخراج PWM
lcd.begin (16.2) ؛ // Getting LCD جاهز lcd.clear () ؛ // Clears LCD.setCursor (0،0) ؛ // يعين المؤشر في row0 و column0 lcd.print ("CIRCUIT DIGEST") ؛ // Displays Circuit Digest lcd.setCursor (0،1) ؛ // يعين المؤشر في العمود 0 والصف 1 lcd.print ("PWM USING STM32") ؛ // يعرض PWM باستخدام تأخير STM32 (2000) ؛ // تأخير الوقت lcd.clear () ؛ // يمسح وضع pinMode لشاشات الكريستال السائل (التناظرية ، الإدخال) ؛ // ضبط الإدخال التناظري لوضع الدبوس كـ INPUT pinMode (led ، PWM) ؛ // ضبط وضع الدبوس كإخراج PWM (مروحة ، PWM) ؛ // ضبط مروحة وضع الدبوس كإخراج PWM
تم تعيين دبوس الإدخال التناظري (PA4) على أنه INPUT بواسطة pinMode (دخل تناظري ، INPUT) ، ويتم تعيين دبوس LED على أنه إخراج PWM بواسطة pinMode (led ، PWM) ويتم تعيين دبوس المروحة كإخراج PWM بواسطة pinMode (مروحة ، PWM) . هنا يتم توصيل دبابيس خرج PWM بـ LED (PA9) ومروحة (PA8).
بعد ذلك في وظيفة الحلقة الفارغة () ، نقرأ الإشارة التناظرية من دبوس ADC (PA4) ونخزنها في متغير عدد صحيح يحول الجهد التناظري إلى قيم عدد صحيح رقمي (0-4095) باستخدام الكود أدناه int valueadc = analogRead (analoginput)) ؛
الشيء المهم الذي يجب ملاحظته هنا هو دبابيس PWM التي هي قنوات STM32 بدقة 16 بت (0-65535) لذلك نحتاج إلى تعيين ذلك باستخدام القيم التناظرية باستخدام وظيفة الخريطة كما هو موضح أدناه
النتيجة int = map (valueadc، 0، 4095، 0، 65535).
إذا لم يتم استخدام الخرائط ، فلن نحصل على السرعة الكاملة للمروحة أو السطوع الكامل لمصباح LED من خلال تغيير مقياس الجهد.
ثم نكتب إخراج PWM إلى LED باستخدام pwmWrite (led ، نتيجة) وإخراج PWM للمروحة باستخدام وظائف pwmWrite (مروحة ، نتيجة ).
أخيرًا نعرض قيمة الإدخال التناظري (قيمة ADC) وقيم المخرجات (قيم PWM) على شاشة LCD باستخدام الأوامر التالية
lcd.setCursor (0،0) ؛ // يعين المؤشر في row0 و column0 lcd.print ("قيمة ADC =") ؛ // يطبع الكلمات "" lcd.print (valueadc) ؛ // يعرض القيمة lcd.setCursor (0،1) ؛ // يعين المؤشر في العمود 0 والصف 1 lcd.print ("الإخراج =") ؛ // يطبع الكلمات في شاشة lcd.print (نتيجة) ؛ // يعرض نتيجة القيمة
كود كامل مع فيديو توضيحي موضح أدناه.