- المواد المطلوبة
- ADC على STM8S103F3P6
- مخطط الدائرة لقراءة قيم ADC على STM8S والعرض على شاشة LCD
- مكتبة ADC للطراز STM8S103F3P6
- برنامج STM8S لقراءة الجهد التناظري والعرض على شاشة LCD
- قراءة الجهد التناظري من اثنين من الجهد باستخدام STM8S
إذا كنت قارئًا منتظمًا يتابع دروسنا التعليمية عن وحدة التحكم الدقيقة STM8S ، فستعرف أنه في آخر برنامج تعليمي لدينا ، تعلمنا كيفية توصيل شاشة LCD مقاس 16 × 2 باستخدام STM8s. الآن ، لمتابعة هذا البرنامج التعليمي ، سوف نتعلم كيفية استخدام ميزة ADC على متحكم STM8S103F3P6 الخاص بنا. يعد ADC طرفيًا مفيدًا جدًا في وحدة التحكم الدقيقة التي يستخدمها غالبًا المبرمجون المضمنون لقياس الوحدات التي تتغير باستمرار مثل الجهد المتغير والتيار ودرجة الحرارة والرطوبة وما إلى ذلك.
كما نعلم ، "نحن نعيش في عالم تناظري به أجهزة رقمية" ، مما يعني أن كل شيء من حولنا مثل سرعة الرياح وشدة الضوء ودرجة الحرارة وكل شيء نتعامل معه مثل السرعة والسرعة والضغط وما إلى ذلك هو تناظري في الطبيعة. لكن المتحكمات الدقيقة والمعالجات الدقيقة لدينا هي أجهزة رقمية ولن تكون قادرة على قياس هذه المعلمات بدون جهاز طرفي مهم يسمى المحولات التناظرية إلى الرقمية (ADC). لذلك في هذه المقالة ، دعنا نتعلم كيفية استخدام ADC على متحكم STM8S مع مترجم COMIC C.
المواد المطلوبة
في هذه المقالة ، سنقرأ قيمتين تناظريتين للجهد من مقياسين جهد ونعرض قيمة ADC على شاشة LCD مقاس 16 × 2. للقيام بذلك ، سنحتاج إلى المكونات التالية.
- مجلس التنمية STM8S103F3P6
- مبرمج ST-Link V2
- 16x2 LCD
- مقاييس الجهد
- توصيل الأسلاك
- 1 كيلو المقاوم
ADC على STM8S103F3P6
هناك أنواع عديدة من ADC ولكل متحكم مواصفاته الخاصة. في STM8S103F3P6 ، لدينا ADC بخمس قنوات ودقة 10 بت ؛ بدقة 10 بت ، سنكون قادرين على قياس القيمة الرقمية من 0 إلى 1024 وتشير 5 قنوات ADC إلى أن لدينا 5 دبابيس على متحكم دقيق يمكنها دعم ADC ، تم تمييز هذه الدبابيس الخمسة في الصورة أدناه.
كما ترون ، كل هذه المسامير الخمسة (AIN2 و AIN3 و AIN4 و AIN5 و AIN6) متعددة الإرسال مع الأجهزة الطرفية الأخرى ، مما يعني أنه بصرف النظر عن مجرد العمل كدبوس ADC ، يمكن أيضًا استخدام هذه المسامير لإجراء اتصالات أخرى مثل على سبيل المثال ، لا يمكن استخدام الدبوس 2 و 3 (AIN5 و AIN 6) فقط في ADC ولكن يمكن استخدامه أيضًا في وظائف الاتصال التسلسلي ووظائف GPIO. لاحظ أنه لن يكون من الممكن استخدام نفس الدبوس لجميع الأغراض الثلاثة ، لذلك إذا كنا نستخدم هذين الدبابيس لـ ADC ، فلن نتمكن من إجراء اتصال تسلسلي. يمكن العثور على خصائص ADC الهامة الأخرى لـ STM8S103P36 في الجدول أدناه المأخوذ من ورقة البيانات.
في الجدول أعلاه ، يمثل Vdd جهد التشغيل ويمثل Vss الأرض. لذلك في حالتنا في لوحة التطوير لدينا ، لدينا متحكم يعمل على 3.3 فولت ، يمكنك التحقق من مخطط دائرة لوحة التطوير من بدء البرنامج التعليمي STM8S. مع 3.3 فولت كجهد تشغيل ، يمكن ضبط تردد ساعة ADC لدينا بين 1 إلى 4 ميجاهرتز ونطاق جهد التحويل لدينا بين 0 فولت إلى 3.3 فولت. هذا يعني أن ADC 10 بت الخاص بنا سيقرأ 0 عندما يتم توفير 0V (Vss) وسيقرأ 1024 كحد أقصى عند توفير 3.3V (Vdd). يمكننا بسهولة تغيير 0-5 فولت عن طريق تغيير جهد التشغيل لوحدة MCU إذا لزم الأمر.
مخطط الدائرة لقراءة قيم ADC على STM8S والعرض على شاشة LCD
الرسم التخطيطي الكامل للدائرة المستخدم في هذا المشروع مذكور أدناه ، وهو مشابه جدًا لبرنامج STM8S LCD التعليمي الذي ناقشناه سابقًا.
كما ترى ، فإن المكونات الإضافية الوحيدة بصرف النظر عن شاشة LCD هي مقياسان للجهد POT_1 و POT_2 . هذه الأواني متصلة بمنافذ PC4 و PD6 ، وهما دبابيس ANI2 و ANI6 كما تمت مناقشته في صورة pinout سابقًا.
يتم توصيل مقاييس الجهد بطريقة أنه عندما نغيرها ، سنحصل على 0-5 فولت على دبابيسنا التناظرية. سنقوم ببرمجة وحدة التحكم الخاصة بنا لقراءة هذا الجهد التناظري بالقيمة الرقمية (0 إلى 1024) وعرضه على شاشة LCD. ثم سنقوم أيضًا بحساب قيمة الجهد المكافئ وعرضها على شاشة LCD ، تذكر أن وحدة التحكم الخاصة بنا تعمل بجهد 3.3 فولت ، لذلك حتى إذا قدمنا 5 فولت إلى دبوس ADC ، فسيكون قادرًا على القراءة فقط من 0 فولت إلى 3.3 فولت.
بمجرد الانتهاء من الاتصالات ، يبدو الجهاز الخاص بي كما هو موضح أدناه. يمكنك رؤية مقياسي فرق الجهد على اليمين ومبرمج ST-link على اليسار.
مكتبة ADC للطراز STM8S103F3P6
لبرمجة وظائف ADC على STM8S ، سنستخدم مترجم Cosmic C جنبًا إلى جنب مع مكتبات SPL. ولكن لتسهيل العمليات ، قمت بإنشاء ملف رأس آخر يمكن العثور عليه على GitHub بالرابط أدناه.
مكتبة ADC للطراز STM8S103F3P6
إذا كنت تعرف ما تفعله ، يمكنك إنشاء ملف رأس باستخدام الكود أعلاه وإضافته إلى دليل "include files" في صفحة مشروعك. عدا ذلك ، اتبع الخطوات الأولى مع البرنامج التعليمي STM8S لمعرفة كيفية إعداد بيئة البرمجة والمترجم. بمجرد أن يصبح الإعداد جاهزًا ، يجب أن يحتوي IDE الخاص بك على ملفات الرأس التالية ، على الأقل تلك المحاطة بدائرة باللون الأحمر.
يتكون ملف الرأس أعلاه من وظيفة تسمى ADC_Read () . يمكن استدعاء هذه الوظيفة في برنامجك الرئيسي للحصول على قيمة ADC في أي دبوس. على سبيل المثال ، سيعيد ADC_Read (AN2) قيمة ADC على الطرف AN2 كنتيجة لذلك. تظهر الوظيفة أدناه.
int ADC_Read int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int result = 0؛ ADC1_DeInit () ، ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS، ADC_Channel_Number، ADC1_PRESSEL_FCPU_D18، ADC1_EXTTRIG_TIM، DISABLE، ADC1_ALIGN_RIGHT، ADC1_SCHMITTTRIG_ALL، DISABLE) ؛ ADC1_Cmd (تمكين) ، ADC1_StartConversion () ، بينما (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE) ؛ النتيجة = ADC1_GetConversionValue () ، ADC1_ClearFlag (ADC1_FLAG_EOC) ، ADC1_DeInit () ،
كما ترى ، يمكننا تمرير ثمانية معلمات إلى هذه الوظيفة وهذا يحدد كيفية تكوين ADC. في رمز مكتبتنا أعلاه ، قمنا بتعيين وضع التحويل على مستمر ثم حصلنا على رقم القناة الذي تم تمريره إلى معلمة. ومن ثم يتعين علينا ضبط تردد وحدة المعالجة المركزية لوحدة التحكم الخاصة بنا ، بشكل افتراضي (إذا لم تقم بتوصيل بلورة خارجية) ، سيعمل STM8S الخاص بك مع مذبذب داخلي 16 ميجا هرتز. لذلك فقد ذكرنا " ADC1_PRESSEL_FCPU_D18 " كقيمة ما قبل المتسلق. داخل هذه الوظيفة ، نستخدم طرقًا أخرى محددة بواسطة ملف الرأس SPL stm8s_adc1.h . نبدأ بإلغاء تهيئة دبابيس ADC ثم ADC1_Init () لتهيئة الطرفية ADC. يتم عرض تعريف هذه الوظيفة من دليل مستخدم SPL أدناه.
بعد ذلك ، قمنا بتعيين المشغل الخارجي باستخدام مؤقت وقمنا بتعطيل المشغل الخارجي لأننا لن نستخدمه هنا. ثم لدينا مجموعة المحاذاة إلى اليمين ويتم استخدام المعلمتين الأخيرتين لتعيين مشغل Schmitt ، لكننا سنقوم بتعطيله لهذا البرنامج التعليمي. لذلك ، باختصار ، سنعمل ADC في وضع التحويل المستمر على دبوس ADC المطلوب مع المشغل الخارجي وتعطيل مشغل شميت. يمكنك التحقق من ورقة البيانات إذا كنت بحاجة إلى مزيد من المعلومات حول كيفية استخدام المشغل الخارجي أو خيار المشغل Schmitt ، فلن نناقش ذلك في هذا البرنامج التعليمي.
برنامج STM8S لقراءة الجهد التناظري والعرض على شاشة LCD
يمكن العثور على الكود الكامل المستخدم في ملف main.c في أسفل هذه الصفحة. بعد إضافة ملفات الرأس وملفات المصدر المطلوبة ، يجب أن تكون قادرًا على تجميع الملف الرئيسي مباشرةً. شرح الكود في الملف الرئيسي كما يلي. لن أشرح برنامج STM8S LCD لأننا ناقشنا ذلك بالفعل في البرنامج التعليمي السابق.
سيكون الغرض من الكود هو قراءة قيم ADC من دبابيس وتحويلها إلى قيمة جهد. سنقوم أيضًا بعرض قيمة ADC وقيمة الجهد على شاشة LCD. لذلك ، لقد استخدمت وظيفة تسمى LCD_Print Var تأخذ متغيرًا بتنسيق عدد صحيح وتحولها إلى حرف لعرضها على شاشة LCD. لقد استخدمنا المعامل البسيط (٪) والقسمة (/) للحصول على كل رقم من المتغير ووضع متغيرات مثل d1 و d2 و d3 و d4 كما هو موضح أدناه. ثم يمكننا استخدام وظيفة LCD_Print_Char لعرض هذه الأحرف على شاشة LCD.
void LCD_Print_Var (int var) {char d4، d3، d2، d1؛ d4 = var٪ 10 + '0' ؛ d3 = (var / 10)٪ 10 + '0' ؛ d2 = (var / 100)٪ 10 + '0' ؛ d1 = (var / 1000) + '0' ؛ Lcd_Print_Char (d1) ؛ Lcd_Print_Char (d2) ؛ Lcd_Print_Char (d3) ؛ Lcd_Print_Char (d4) ؛ }
بعد ذلك تحت الوظيفة الرئيسية ، لدينا أربعة متغيرات معلنة. يتم استخدام اثنين منهم لحفظ قيمة ADC (من 0 إلى 1024) ويتم استخدام الاثنين الآخرين للحصول على قيمة الجهد الفعلي.
int ADC_value_1 = 0 غير موقع ؛ غير موقعة int ADC_value_2 = 0 ؛ int ADC_voltage_1 = 0 ؛ int ADC_voltage_2 = 0 ؛
بعد ذلك ، يتعين علينا إعداد دبابيس GPIO وتكوين الساعة لقراءة الجهد التناظري. هنا سنقرأ الجهد التناظري من المسامير AIN2 و AIN6 وهما دبابيس PC4 و PD6 على التوالي. علينا تحديد هذه الدبوس في حالة عائمة كما هو موضح أدناه. سنقوم أيضًا بتمكين الساعة الطرفية لـ ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC ، تمكين) ، // Enable Peripheral Clock لـ ADC GPIO_Init (GPIOC، GPIO_PIN_4، GPIO_MODE_IN_FL_IT) ؛ GPIO_Init (GPIOC ، GPIO_PIN_4 ، GPIO_MODE_IN_FL_IT) ؛
الآن بعد أن أصبحت المسامير جاهزة ، يتعين علينا الدخول في الحلقة اللانهائية لقراءة الجهد التناظري. نظرًا لأن لدينا ملف الرأس الخاص بنا ، يمكننا بسهولة قراءة الجهد التمثيلي من المسامير AIN2 و AIN 6 باستخدام الأسطر أدناه.
ADC_value_1 = ADC_Read (AIN2) ، ADC_value_2 = ADC_Read (AIN6) ،
الخطوة التالية هي تحويل قراءة ADC (من 0 إلى 1023) إلى جهد تناظري. بهذه الطريقة ، يمكننا عرض قيمة الجهد الدقيقة المعطاة لمسمار AIN2 و AIN6. يمكن إعطاء الصيغ لحساب الجهد التناظري من خلال-
الجهد التناظري = قراءة ADC * (3300/1023)
في حالتنا على وحدات التحكم STM8S103F3 ، لدينا ADC بدقة 10 بت ، لذلك استخدمنا 1023 (2 ^ 10) . في تطويرنا أيضًا ، يتم تشغيل وحدة التحكم بـ 3.3 فولت وهو 3300 ، لذلك قمنا بتقسيم 3300 على 1023 في الصيغ أعلاه. سيعطينا حوالي 3300/1023 3.226 ، لذلك في برنامجنا ، لدينا الخطوط التالية لقياس جهد ADC الفعلي باستخدام جهد ADC.
ADC_voltage_1 = ADC_value_1 * (3.226) ، // (3300/1023 = ~ 3.226) قم بتحويل قيمة ADC من 1 إلى 0 إلى 3300mV ADC_voltage_2 = ADC_value_2 * (3.226) ؛ // تحويل قيمة ADC من 1 إلى 0 إلى 3300mV
يتم استخدام الجزء المتبقي من الكود فقط لعرض هذه القيم الأربع على شاشة LCD. لدينا أيضًا تأخير قدره 500 مللي ثانية حتى يتم تحديث شاشة LCD لكل 500 مللي ثانية. يمكنك تقليل هذا بشكل أكبر إذا كنت بحاجة إلى تحديثات أسرع.
قراءة الجهد التناظري من اثنين من الجهد باستخدام STM8S
قم بتجميع الكود وتحميله إلى لوحة التطوير الخاصة بك. إذا واجهت أي خطأ في الترجمة ، فتأكد من إضافة جميع ملفات الرأس وملفات المصدر كما تمت مناقشته سابقًا. بمجرد تحميل الرمز ، يجب أن ترى رسالة ترحيب صغيرة تقول "ADC on STM8S" وبعد ذلك سترى الشاشة أدناه.
تشير القيمة D1 و D2 إلى قيمة ADC من الدبوس Ain2 و AIN6 على التوالي. على الجانب الأيمن ، لدينا أيضًا قيم الجهد المكافئة المعروضة. يجب أن تكون هذه القيمة مساوية للجهد الذي يظهر على الدبوس AIN2 و AIN6 على التوالي. يمكننا التحقق من ذلك باستخدام مقياس متعدد ، يمكننا أيضًا تغيير مقاييس الجهد للتحقق مما إذا كانت قيمة الجهد تتغير أيضًا وفقًا لذلك.
يمكن أيضًا العثور على العمل الكامل في الفيديو أدناه. آمل أن تكون قد استمتعت بالبرنامج التعليمي وتعلمت شيئًا مفيدًا ، إذا كان لديك أي أسئلة ، فاتركها في قسم التعليقات أدناه. يمكنك أيضًا استخدام منتدياتنا لبدء مناقشة أو نشر أسئلة فنية أخرى.