- مقارنة ADC في Arduino و STM32F103C8
- ADC في STM32
- كيف يتم تحويل الإشارة التناظرية إلى تنسيق رقمي
- دبابيس ADC في STM32F103C8T6
- المكونات مطلوبة
- مخطط الدائرة والشروحات
- برمجة STM32 لقراءة قيم ADC
إحدى الميزات الشائعة المستخدمة في كل تطبيق مضمن تقريبًا هي وحدة ADC (المحول التناظري إلى الرقمي). يمكن لهذه المحولات التناظرية إلى الرقمية قراءة الجهد من أجهزة الاستشعار التناظرية مثل مستشعر درجة الحرارة ومستشعر الإمالة ومستشعر التيار ومستشعر فليكس وغير ذلك الكثير. لذلك في هذا البرنامج التعليمي سوف نتعلم كيفية استخدام ADC في STM32F103C8 لقراءة الفولتية التناظرية باستخدام Energia IDE. سنقوم بتوصيل مقياس جهد صغير بلوحة STM32 Blue Pill ونقدم جهدًا متغيرًا إلى دبوس تناظري ، ونقرأ الجهد ونعرضه على شاشة LCD مقاس 16 × 2.
مقارنة ADC في Arduino و STM32F103C8
في لوحة Arduino ، تحتوي على 6 قنوات (8 قنوات على Mini و Nano ، و 16 على Mega) ، و 10 بت ADC مع نطاق جهد دخل من 0V إلى 5V. هذا يعني أنه سيتم تعيين جهد الإدخال بين 0 و 5 فولت إلى قيم صحيحة بين 0 و 1023. الآن في حالة STM32F103C8 لدينا 10 قنوات ، 12 بت ADC مع نطاق إدخال 0V -3.3V. سيتم تعيين الفولتية المدخلة بين 0 و 3.3 فولت إلى قيم صحيحة بين 0 و 4095.
ADC في STM32
يستخدم ADC المدمج في ميكروكنترولر STM32 مبدأ SAR (سجل التقريب المتتالي) ، والذي يتم من خلاله إجراء التحويل في عدة خطوات. عدد خطوات التحويل يساوي عدد البتات في محول ADC. كل خطوة مدفوعة بساعة ADC. كل ساعة ADC تنتج بت واحد من النتيجة إلى الإخراج. يعتمد التصميم الداخلي ADC على تقنية تبديل المكثف. إذا كنت مستخدمًا جديدًا لـ STM32 ، فقم بإلقاء نظرة على البرنامج التعليمي Getting started with STM32.
دقة 12 بت
هذا ADC عبارة عن 10 قنوات 12 بت ADC. هنا يشير المصطلح 10 قناة إلى وجود 10 دبابيس ADC يمكننا من خلالها قياس الجهد التناظري. يشير المصطلح 12 بت إلى دقة ADC. 12 بت تعني 2 أس عشرة (2 12) وهو 4096. هذا هو عدد خطوات العينة لـ ADC الخاص بنا ، لذا فإن نطاق قيم ADC سيكون من 0 إلى 4095. ستزداد القيمة من 0 إلى 4095 بناءً على قيمة الجهد لكل خطوة ، والتي يمكن حسابها بالصيغة
الجهد / الخطوة = الجهد المرجعي / 4096 = (3.3 / 4096 = 8.056mV) لكل وحدة.
كيف يتم تحويل الإشارة التناظرية إلى تنسيق رقمي
نظرًا لأن أجهزة الكمبيوتر تقوم بتخزين ومعالجة القيم الثنائية / الرقمية فقط (1 و 0). لذلك يجب تحويل الإشارات التناظرية مثل خرج المستشعر بالفولت إلى قيم رقمية للمعالجة ويجب أن يكون التحويل دقيقًا. عندما يتم إعطاء جهد تناظري إدخال لـ STM32 عند مدخلاته التناظرية ، تتم قراءة القيمة التناظرية وتخزينها في متغير عدد صحيح. يتم تحويل تلك القيمة التناظرية المخزنة (0-3.3 فولت) إلى قيم صحيحة (0-4096) باستخدام الصيغة أدناه:
جهد الإدخال = (قيمة ADC / قرار ADC) * الجهد المرجعي
القرار = 4096
المرجع = 3.3 فولت
دبابيس ADC في STM32F103C8T6
يوجد 10 دبابيس تناظرية في STM32 من PA0 إلى PB1.
تحقق أيضًا من كيفية استخدام ADC في ميكروكنترولر أخرى:
- كيفية استخدام ADC في Arduino Uno؟
- ربط ADC0808 مع متحكم 8051
- استخدام وحدة ADC لوحدة التحكم الدقيقة PIC
- دروس Raspberry Pi ADC
- كيفية استخدام ADC في MSP430G2 - قياس الجهد التناظري
المكونات مطلوبة
- STM32F103C8
- شاشة LCD 16 * 2
- مقياس الجهد 100 كيلو
- اللوح
- توصيل الأسلاك
مخطط الدائرة والشروحات
مخطط الرسم البياني إلى واجهة 16 * 2 LCD ومدخلات تناظرية إلى STM32F103C8T6 المجلس هو مبين أدناه.
فيما يلي التوصيلات التي تمت لشاشات الكريستال السائل:
رقم دبوس 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) |
يتم إجراء التوصيلات وفقًا للجدول الوارد أعلاه. هناك نوعان من مقاييس الجهد الموجودة في الدائرة ، الأول يستخدم لمقسم الجهد الذي يمكن استخدامه لتغيير الجهد وتوفير دخل تناظري لـ STM32. يحصل الدبوس الأيسر من مقياس الجهد هذا على جهد إدخال موجب من STM32 (3.3 فولت) ويتم توصيل الدبوس الأيمن بالأرض ، ويتم توصيل دبوس مركزي لمقياس الجهد بدبوس الإدخال التناظري (PA7) الخاص بـ STM32. يستخدم مقياس الجهد الآخر لتغيير تباين شاشة LCD. يتم توفير مصدر الطاقة لـ STM32 عن طريق مصدر طاقة USB من كمبيوتر شخصي أو كمبيوتر محمول.
برمجة STM32 لقراءة قيم ADC
في برنامجنا التعليمي السابق ، تعلمنا عن برمجة لوحة STM32F103C8T6 باستخدام منفذ USB. لذلك لا نحتاج إلى مبرمج FTDI الآن. ما عليك سوى توصيله بجهاز الكمبيوتر عبر منفذ USB من STM32 وابدأ البرمجة باستخدام ARDUINO IDE. إن برمجة STM32 في ARDUINO IDE لقراءة الجهد التناظري أمر بسيط للغاية. إنه نفس لوح اردوينو. ليست هناك حاجة لتغيير دبابيس العبور الخاصة بـ STM32.
في هذا البرنامج سوف تقرأ القيمة التناظرية وتحسب الجهد بهذه القيمة ثم تعرض القيم التناظرية والرقمية على شاشة LCD.
حدد أولاً دبابيس LCD. هذه تحدد أي دبوس من STM32 تتصل دبابيس LCD. يمكنك التعديل حسب متطلباتك.
const int rs = PB11 ، en = PB10 ، d4 = PB0 ، d5 = PB1 ، d6 = PC13 ، d7 = PC14 ؛ // ذكر أسماء أطراف التوصيل التي تم توصيلها بشاشات LCD
بعد ذلك ، نقوم بتضمين ملف الرأس لشاشة LCD. هذا يستدعي المكتبة التي تحتوي على رمز لكيفية اتصال STM32 بشاشات الكريستال السائل. تأكد أيضًا من استدعاء الوظيفة Liquid Crystal بأسماء الدبوس التي حددناها للتو أعلاه.
#تضمن
داخل وظيفة الإعداد () ، سنقوم فقط بإعطاء رسالة تمهيدية ليتم عرضها على شاشة LCD. يمكنك التعرف على توصيل شاشة LCD مع STM32.
lcd.begin (16 ، 2) ؛ // نحن نستخدم شاشة LCD 16 * 2 LCD.clear () ؛ // مسح شاشة lcd.setCursor (0 ، 0) ؛ // في الصف الأول في العمود الأول lcd.prin t ("CIRCUITDIGEST") ؛ // اطبع هذا lcd.setCursor (0 ، 1) ؛ // في الصف الثاني العمود الأول n lcd.print ("STM32F103C8") ؛ // طباعة ثي ق تأخير (2000)؛ // انتظر ثانيتين lcd.clear () ؛ // مسح شاشة lcd.setCursor (0 ، 0) ؛ // في الصف الأول العمود الأول lcd.print ("استخدام ADC IN") ؛ // Print this lcd.setCursor (0،1) // في الصف الثاني في العمود الأول lcd.print ("STM32F103C8") ؛ // اطبع هذا التأخير (2000) ؛ // انتظر ثانيتين lcd.clear () ؛ // مسح الشاشة
أخيرًا ، داخل وظيفة الحلقة اللانهائية () ، نبدأ في قراءة الجهد التمثيلي المقدم إلى دبوس PA7 من مقياس الجهد. كما ناقشنا بالفعل ، فإن الميكروكونترولر هو جهاز رقمي ولا يمكنه قراءة مستوى الفولتية مباشرة. باستخدام تقنية SAR ، يتم تعيين مستوى الجهد من 0 إلى 4096. تسمى هذه القيم بقيم ADC ، للحصول على قيمة ADC هذه ، استخدم ببساطة السطر التالي
int val = analogRead (A7) ؛ // اقرأ قيمة ADC من pin PA 7
هنا يتم استخدام الوظيفة analogRead () لقراءة القيمة التناظرية للدبوس. أخيرًا نحفظ هذه القيمة في متغير يسمى " val ". نوع هذا المتغير عدد صحيح لأننا سنحصل فقط على قيم تتراوح من 0 إلى 4096 ليتم تخزينها في هذا المتغير.
ستكون الخطوة التالية هي حساب قيمة الجهد من قيمة ADC. للقيام بذلك لدينا الصيغ التالية
الجهد = (قيمة ADC / تحليل ADC) * مرجع Voltag e
في حالتنا ، نعلم بالفعل أن دقة ADC لوحدة التحكم الدقيقة الخاصة بنا هي 4096. تم العثور على قيمة ADC أيضًا في السطر السابق وقمنا بتخزين المتغير المسمى val. و الجهد إشارة يساوي الجهد الذي متحكم يعمل. عندما يتم تشغيل لوحة STM32 عبر كابل USB ، يكون جهد التشغيل 3.3 فولت. يمكنك أيضًا قياس جهد التشغيل باستخدام مقياس متعدد عبر Vcc والدبوس الأرضي على اللوحة. لذا فإن الصيغة أعلاه تناسب حالتنا كما هو موضح أدناه
الجهد العائم = (تعويم (فال) / 4096) * 3.3 ؛ // الصيغ لتحويل قيمة ADC إلى voltag e
قد يتم الخلط بينك وبين تعويم الخط (val). يستخدم هذا لتحويل المتغير "val" من نوع البيانات int إلى نوع البيانات "float". هذا التحويل ضروري لأننا فقط إذا حصلنا على نتيجة val / 4096 في الطفو يمكننا ضربها 3.3. إذا تم تلقي القيمة بعدد صحيح ، فستكون دائمًا 0 وستكون النتيجة أيضًا صفرًا. بمجرد حساب قيمة ADC والجهد ، كل ما تبقى هو عرض النتيجة على شاشة LCD والتي يمكن القيام بها باستخدام الأسطر التالية
lcd.setCursor (0 ، 0) ؛ // اضبط المؤشر على العمود 0 ، السطر 0 lcd.print ("ADC Val:") ؛ lcd.print (فال) ؛ // عرض قيمة ADC lcd.setCursor (0 ، 1) ؛ // اضبط المؤشر على العمود 0 ، السطر 1 lcd.print ("الجهد:") ؛ lcd.print (الجهد) ؛ // عرض الجهد
الكود الكامل والفيديو التوضيحي مذكور أدناه.