مرحبا اصدقاء!في المقالات السابقة ،
تحدثت عن مشروعي وجزء البرنامج الخاص به . في هذه المقالة سأخبرك بكيفية عمل مولد إشارة بسيط لأربع قنوات - قناتين تمثيليتين وقناتين PWM.

القنوات التناظرية
يشتمل متحكم
STM32F415RG على محول DAC 12-بت (رقمي إلى تناظري) في قناتين مستقلتين ، مما يسمح بتوليد إشارات مختلفة. يمكنك تحميل البيانات مباشرة في سجلات المحول ، ولكن هذا ليس مناسبًا جدًا لتوليد الإشارات. الحل الأفضل هو استخدام مصفوفة لتوليد موجة واحدة من الإشارة ، ثم تشغيل DAC باستخدام مشغل من المؤقت و DMA. من خلال تغيير تردد المؤقت ، يمكنك تغيير تردد الإشارة التي تم إنشاؤها.
تتضمن الأشكال الموجية "
الكلاسيكية ": الجيوب الأنفية ، والتعرج ، والمثلث ، والسنّاد.

وظيفة توليد هذه الموجات في المنطقة العازلة هي كما يلي في الوظيفة ، تحتاج إلى تمرير مؤشر إلى بداية الصفيف ، حجم الصفيف ، القيمة القصوى وشكل الموجة المطلوب. بعد المكالمة ، سيتم تعبئة الصفيف بعينات لموجة واحدة من الشكل المطلوب ويمكنك بدء المؤقت لتحميل القيمة الجديدة بشكل دوري في DAC.
لدى DAC في وحدة التحكم الدقيقة هذه قيود: وقت الاستقرار النموذجي (
الوقت من تحميل قيمة جديدة إلى DAC وعندما تظهر على الإخراج ) هو 3 مللي ثانية. ولكن ليس كل شيء بسيطًا جدًا - هذه المرة هي الحد الأقصى ، أي التغيير من الحد الأدنى إلى الحد الأقصى والعكس صحيح. عند محاولة سحب المتعرج ، تكون هذه الجبهات المليئة بالرسومات واضحة جدًا:

إذا كانت الموجة الجيبية ناتجة ، فإن انسداد الجبهات لم يعد ملحوظًا بسبب شكل الموجة. ومع ذلك ، إذا تم زيادة التردد ، تتحول الإشارة الجيبية إلى إشارة مثلثة ، ومع زيادة أخرى ، ينخفض اتساع الإشارة.
التوليد عند 1 كيلوهرتز ( سعة 90٪ ):
التوليد بسرعة 10 كيلوهرتز ( سعة 90٪ ):
التوليد عند 100 كيلو هرتز ( سعة 90٪ ):
الخطوات مرئية بالفعل - لأنه يتم تحميل البيانات الجديدة في DAC بتردد 4 ميجاهرتز.
بالإضافة إلى ذلك ، فإن الحافة الخلفية لإشارة سن المنشار تشوش ، ومن أسفل الإشارة لا تصل إلى القيمة التي يجب أن تكون عليها. وذلك لأن الإشارة ليس لديها الوقت للوصول إلى المستوى المنخفض المحدد ، ويقوم البرنامج بتحميل قيم جديدة
التوليد عند 200 كيلوهرتز ( سعة 90٪ ):
هنا يمكنك أن ترى بالفعل كيف تحولت جميع الموجات إلى مثلث.
القنوات الرقمية
مع القنوات الرقمية ، كل شيء أبسط بكثير - في أي متحكم تقريبًا هناك مؤقتات تسمح لك بإخراج إشارة PWM إلى مخرجات وحدة التحكم الدقيقة. من الأفضل استخدام مؤقت 32 بت - في هذه الحالة ، لا تحتاج إلى حساب المؤقت المسبق للمؤقت ، فقط قم بتحميل الفترة في سجل واحد وتحميل دورة العمل المطلوبة في سجل آخر.
واجهة المستخدم
تقرر تنظيم واجهة المستخدم في أربعة مستطيلات ، لكل منها صورة لإشارة الخرج والتردد والسعة / دورة العمل. للقناة المحددة حاليًا ، يتم عرض بيانات النص باللون الأبيض ، والباقي باللون الرمادي.

تقرر التحكم في برامج التشفير: الجهة اليسرى مسؤولة عن التردد والقناة المحددة الحالية (
تتغير عند الضغط على الزر ) ،
والجهة اليمنى مسؤولة عن دورة السعة / العمل وشكل الموجة (
تتغير عند الضغط على الزر ).
بالإضافة إلى ذلك ، يتم تنفيذ دعم شاشة اللمس - عندما تنقر على قناة غير نشطة ، فإنها تصبح نشطة ، عندما تنقر على قناة نشطة ، يتغير شكل الموجة.
بالطبع ، يتم استخدام DevCore للقيام بكل هذا. يبدو رمز تهيئة واجهة المستخدم وتحديث البيانات على الشاشة كما يلي:
هيكل يحتوي على جميع كائنات واجهة المستخدم رمز تحديث الشاشة for(uint32_t i = 0U; i < CHANNEL_CNT; i++) { ch_dsc[i].img.SetImage(waveforms[ch_dsc[i].waveform]); snprintf(ch_dsc[i].freq_str_data, NumberOf(ch_dsc[i].freq_str_data), "Freq: %7lu Hz", ch_dsc[i].frequency); if(IsAnalogChannel(i)) snprintf(ch_dsc[i].duty_str_data, NumberOf(ch_dsc[i].duty_str_data), "Ampl: %7d %%", ch_dsc[i].duty); else snprintf(ch_dsc[i].duty_str_data, NumberOf(ch_dsc[i].duty_str_data), "Duty: %7d %%", ch_dsc[i].duty);
يتم تنفيذ تطبيق مثير للاهتمام للنقرة على الزر (
وهو مستطيل يتم رسم العناصر المتبقية عليه ). إذا نظرت إلى الرمز ، فيجب أن تلاحظ مثل هذا الشيء:
ch_dsc [i] .box.SetCallback (& Callback، this، nullptr، i)؛ دعا في حلقة. هذه هي وظيفة وظيفة رد الاتصال التي سيتم استدعاؤها عند الضغط على الزر. يتم نقل ما يلي إلى الوظيفة: عنوان الوظيفة الثابتة للدالة الثابتة للفئة ، هذا المؤشر ،
ومعلمتين للمستخدم سيتم تمريرهما إلى وظيفة رد الاتصال - مؤشر (
لا يستخدم في هذه الحالة - يتم تمرير nullptr ) ورقم (
يتم إرسال رقم القناة ).
من مقاعد الجامعة ، أتذكر الافتراض: "
الوظائف الثابتة لا يمكنها الوصول إلى أعضاء الفصل غير الثابت ". لذلك هذا
ليس صحيحا . نظرًا لأن الوظيفة الثابتة هي عضو في فئة ، فإنها يمكنها
الوصول إلى جميع أعضاء الفصل إذا كان لديها ارتباط / مؤشر لهذه الفئة. الآن نلقي نظرة على وظيفة رد الاتصال:
في السطر الأول من هذه الوظيفة ، يحدث "
السحر " ، وبعد ذلك يمكنك الوصول إلى أي أعضاء في الفصل ، بما في ذلك الأفراد.
بالمناسبة ، يتم استدعاء هذه الوظيفة في مهمة أخرى (
عرض الشاشة ) ، لذلك تحتاج داخل هذه الوظيفة إلى الاهتمام بالمزامنة. في مشروع "
الأمسيات " البسيط هذا ، لم أفعل ذلك ، لأنه في هذه الحالة بالذات ليس ضروريًا.
تم تحميل رمز مصدر المولد إلى GitHub:
https://github.com/nickshl/WaveformGeneratorيتم تخصيص
DevCore الآن إلى مستودع منفصل ويتم إدراجه كوحدة فرعية.
حسنًا ، لماذا أحتاج إلى مولد إشارة ، فسيكون في المقالة التالية (
أو إحدى المقالات
التالية ).