محول تناظري إلى رقمي لوحدات التحكم الدقيقة AVR. STM32: وصف Adc للمحول التناظري إلى الرقمي

حان الوقت لمعرفة ماهية وحدة ADC في وحدات التحكم الدقيقة STM32. دعونا نتبع المخطط المعتاد، أولاً النظرية، وأخيراً برنامج صغير للعمل مع محول تمثيلي إلى رقمي.

لنبدأ بـ...إليك بعض خصائص المحول التناظري إلى الرقمي في STM32f10x:

  • ADC هو 12 بت
  • من الممكن إنشاء مقاطعة في نهاية التحويل، في نهاية التحويل من القناة المحقونة، ومن الممكن أيضًا إنشاء مقاطعة من Analog Watchdog (سأخبرك بما هو موجود أدناه)
  • تحويل واحد والتحويل المستمر ممكن
  • المعايرة الذاتية
  • إثارة التحول من حدث خارجي
  • العمل مع DMA (DMA، الوصول المباشر إلى الذاكرة)

هنا مخطط كتلة من ورقة البيانات، معجب به)

قبل أن أنسى Analog Watchdog، سأصف عملها.
هناك حاجة للتأكد من أن الجهد يقع ضمن حدود معينة. علاوة على ذلك، يمكنه فحص قناة معينة ومجموعة قنوات. نقوم بإدخال قيم العتبات العلوية والسفلية في سجلات ADC_HTR و ADC_LTR على التوالي. وإذا تجاوز الجهد الذي يتم اختباره هذه الحدود، فسيتم إنشاء مقاطعة. الشيء الأكثر فائدة!

تنقسم قنوات ADC إلى عادية وحقن. علاوة على ذلك، إذا بدأت في قياس القنوات المحقونة، فسيتم تعليق قياس القنوات العادية. وفي بعض المواقف، تعد أيضًا ميزة مفيدة للغاية.

كما هو الحال في المتحكمات الدقيقة AVR، من الممكن محاذاة النتيجة إلى اليمين أو اليسار. هنا النتيجة هي في الواقع 12 بت. لكن الجوهر هو نفسه. إليك ما يبدو عليه كل شيء في السجلات:

نرى كيف تتغير البيانات الموجودة في سجل البيانات. يعمل البرنامج بشكل صحيح، لذا يمكننا الانتقال إلى مزيد من الدراسة لـ STM32. يتبع…

نحتاج أولاً إلى فهم المكونات التي استخدمناها لإنشاء البرنامج الثابت. واستخدمنا مكونًا واحدًا فقط - PWM8. يرمز PWM إلى Pulse Width Modulator، وهو ما يعني "Pulse Width Modulator". جوهر الجهاز هو أنه يسمح لك بتغيير عرض النبضات الناتجة عن وحدة التحكم الدقيقة. وبالتالي تغيير جهد الخرج للأجهزة غير الحساسة للتردد.
على سبيل المثال: تردد تشغيل وحدة التحكم الدقيقة هو 1 هرتز (أي فترة توليد النبضة هي 1 ثانية)، وعرض النبضة هو 0.5 ثانية، وجهد النبض هو 5 فولت.

ثم متوسط ​​جهد الخرج في الثانية هو 2.5 فولت. ويتم الحصول على هذه القيمة ببساطة: عن طريق جمع مناطق النبضات الفرعية وتقسيمها على إجمالي الفترة الزمنية. فقط في حالة، سأكتب ذلك بمزيد من التفاصيل. لنفترض أننا أخذنا فترة زمنية قدرها ثانية واحدة، ومن الشكل يمكننا أن نرى أن النبضة الأولى استمرت 0.5. نضرب 0.5 ثانية * 5 فولت (جهد النبض) ونقسم كل هذا على الفاصل الزمني. 0.5 ثانية * 5 فولت/1 ثانية = 2.5 فولت. إذا كنا بحاجة إلى جهد خرج قدره 3.33 فولت، فسيتعين علينا زيادة مساحة النبض إلى 75٪. غالبًا ما يظهر مصطلح دورة العمل في الأدبيات. لذلك، دورة العمل هي نسبة مدة النبضة إلى مدة الإمكانات الصفرية، على سبيل المثال، في الحالة الأولى كانت 50٪، في الثانية - 75٪.

أعتقد أن النظرية كافية بالفعل ولم تكن هناك مشاكل في تثبيت PWM على الدائرة. لكن إعدادات المكون نفسه تستحق النظر فيها بمزيد من التفصيل. للقيام بذلك، سأقدم لقطة شاشة مع تمييز المعلمات التي تم تغييرها.

الساعة هي تردد تشغيل PWM، أي كتلة رقمية أو تناظرية رقمية يجب أن تعمل بتردد ساعة معين. ولهذا السبب تم اختراع مقسمات التردد ومجال الساعة. SysClk هو تردد النظام الذي تم تعيينه في علامة التبويب "الموارد العالمية". من المثير للاهتمام ملاحظة أنه في القائمة المنسدلة "الساعة" توجد حقول مثل Row_0_Input_0. وهذا يعني أن مولد الساعة الخاص بالوحدة يمكن أن يكون خارج الشريحة وستتم مزامنته عبر الناقل Row_0_Input_0.

تمكين - مستوى الوحدة المنطقية لهذه الكتلة. عادةً ما يتم استخدام معيارين: عالي = 5 فولت ومنخفض = 3 فولت. بالمناسبة ، يمكن أيضًا تحويل وحدة التحكم الدقيقة نفسها إلى أحد الأوضاع العالية أو المنخفضة.

مقارنة - إخراج المغير عرض النبض.

قد يطرح السؤال: لماذا تم تقديم النظرية المذكورة أعلاه إذا لم نستخدمها عمليًا في أي مكان؟ والجواب هو أننا استخدمنا القيم الافتراضية لطول النبضة والفترة الزمنية (حقول الفترة وعرض النبض) 0 0. مع مثل هذه القيم، سيكون لمخرج PWM إشارة صلبة مساوية في القيمة للإشارة المنطقية. يمكنك أيضًا تغيير قيم الفترة الزمنية وعرض النبضة برمجيًا في وضع تشغيل المتحكم الدقيق، باستخدام وظائف PWM8_1_WritePeriod() وPWM8_1_WritePulseWidth().

أدك أو أدك

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

  1. عمق البت هو أصغر وحدة للإشارة التناظرية التي يمكن اكتشافها بواسطة ADC، ويتم قياسها عادةً بالبت.
  2. تردد التحويل - عدد القياسات في الثانية، مقاسًا بـ SPS (عينات في الثانية)
  3. نطاق التشغيل - نطاق القيم التي يعمل فيها هذا المحول.

نظرًا لأن ADC لم يعد جهازًا بسيطًا مثل PWM. سيتعين علينا أن ننظر إلى بعض الجوانب النظرية للمتحكم الدقيق وبعض ميزات ADC نفسها.

الخصائص العامة للمتحكم الدقيق

قائمة ببعض المفاهيم والتسميات التي تحتاج إلى معرفتها عند العمل مع شرائح PSoC (بالمناسبة، وليس كل ما يلي فقط سيكون صحيحًا بالنسبة لوحدات التحكم الدقيقة AVR)

في الأوصاف ومخططات الدوائر في أوراق البيانات، غالبًا ما تظهر تسميات مثل Vcc، وVdd، وVss، وAGND. والفرق بينهما في بعض الأحيان ليس هو الأكثر وضوحا. Vcc هو جهد إمداد المتحكم الدقيق (cc - من جامع إلى جامع) ، وهو نفس Vdd ، وقد حدث تاريخيًا أن نفس القيمة لها تسميتان. Vss هو الحد الأدنى من إمكانات المتحكم الدقيق، وغالبًا ما يحدث أن هذه القيمة تعادل AGND. يشير الحرف "A" في الاختصار AGND إلى ما إذا كانت أرض صناعية أم تربة صناعية. ومن الجدير بالذكر هذا الجهد الموجود على الدائرة، والذي يسمى عادة بـ BandGap. BandGrap هو مرجع الجهد. الجهد المرجعي يعني أنه يظل ثابتًا بغض النظر عن جهد إمداد MK ودرجة الحرارة والمؤشرات الخارجية الأخرى. Vref هو الجهد المرجعي للوحدة الفردية قيد النظر. لفترة طويلة جدًا لم أتمكن من فهم ما هو "السكك الحديدية إلى السكك الحديدية". وقد صادفت هذه العبارة في سياقات مثل: "يمكن أن تعمل هذه الوحدة في وضع السكك الحديدية إلى السكك الحديدية." لذا فإن "السكك الحديدية إلى السكك الحديدية" تعني أن العنصر يمكن أن يعمل على نطاق الجهد بأكمله من Vcc إلى AGND.

مثال 2: قياس الجهد

المهمة: قم بقياس الجهد على مقياس الجهد المتصل بلوحة التصحيح واعرض القيمة على الشاشة.

هذا هو المكان الذي يصبح فيه الأمر أكثر إثارة للاهتمام. كالعادة نطلق المصمم وننشئ مشروعًا. انتقل إلى وحدات المستخدم -> بيانات متنوعة -> شاشة LCD وانقر بزر الماوس الأيسر لسحبها إلى وحدة التحكم الدقيقة. تعد شاشة LCD وحدة مفيدة وبسيطة للغاية، بالإضافة إلى أنها لا تشغل مساحة على الكتلة الرقمية. يمكنك رؤيته في علامة التبويب Workspace Explorer. من الإعدادات، يحتاج فقط إلى تحديد LCDPort = Port_2. انتقل الآن إلى ملف main.c، واسمحوا لي أن أذكرك أنه موجود في Workspace Explorer -> [اسم المشروع] -> ملفات المصدر -> main.c. وأضف الكود التالي إلى الدالة main().

LCD_Start(); LCD_Position(0,0); LCD_PrCString("الجهد المقاس");

نقوم بتجميع الكود وفلاش وحدة التحكم الدقيقة. إذا تم كل شيء بشكل صحيح، فسنحصل على السطر المكتوب أعلاه على الشاشة. لم يتمكنوا من التفكير في طريقة أبسط للتحكم في الشاشة. ويرضي. الآن الأمر متروك لشركة ADC. حدد وحدات المستخدم -> Legacy -> ADCINC12 وقم بإلقائها على وحدة التحكم. قد يطرح السؤال: "لماذا لم نختار فقط ADCINC و ADCINC12 بالإضافة إلى ذلك من المجلد القديم؟ السبب يكمن في تعقيد تهيئة الوحدات. ADCINC هي وحدة أكثر تعقيدًا ومرونة وتتطلب مزيدًا من الحذر "وتكوين شامل. في المجلد القديم، مما يعني الوحدة الموروثة والمخزنة بالفعل وهي أقل مرونة، ولكن أسهل في التنفيذ. بعد ذلك، دون تفكير، انتقل إلى المجلد، مكبرات الصوت وقم بإلقائها على PGA (مضخم الكسب القابل للبرمجة)​ دائرة - مضخم تشغيلي قابل للبرمجة - ليس هناك حاجة إليه للتضخيم بقدر ما هو ضروري لزيادة مقاومة الإدخال بحيث لا يؤثر حجم التيار في الدائرة على دقة القياس.
اضبط إعدادات PWM كما في لقطة الشاشة.

  1. الربح - عامل الربح.
  2. الإدخال - إدخال الجهاز.
  3. المرجع - الجهد المرجعي.

قمنا بضبط إعدادات ADC مثل هذا:

  1. TMR Clock - تردد ساعة المؤقت.
  2. الإدخال - إدخال الجهاز (متصل بـ PGA).
  3. ساعة CNT - تردد العداد.

آخر شيء نحتاجه للتشغيل العادي هو مورد عالمي يسمى Ref Mux. Ref Mux هو نطاق جهد التشغيل للكتل التناظرية. إذا قمنا بضبط القيمة (Vdd/2)+/-(Vdd/2) فسوف نحصل على فرق جهد كامل من 0 إلى 5V. ولكن هناك عيب واحد واضح لهذا. نظرًا لأن جهد الإمداد يؤخذ على أنه الجهد المرجعي. إذا كان الجهد Vdd يطفو، فإن ذلك سيؤثر على دقة النتائج. في هذه الحالة، سيكون BandGap مفيدًا لنا. لكن دعونا لا نقلق بشأن ذلك الآن ونضبط (Vdd/2)+/-(Vdd/2).
للتحقق مرة أخرى، سأرسل لك لقطة شاشة للتبديل الناتج للكتل التناظرية.

انتقل إلى main.c وأضف الكود التالي إلى الدالة main():

PGA_Start(PGA_HIGPOWER); //بدء PGA ADCINC12_Start(ADCINC12_HIGPOWER); //بدء تشغيل ADC ADCINC12_GetSamples(0); // ضبط ADC على التشغيل المستمر M8C_EnableGInt ; // قم بإلغاء التعليق على هذا السطر لتمكين المقاطعات العامة while(1) // حلقة البرنامج الثابت الرئيسية ( if (ADCINC12_fIsDataAvailable() != 0) // تحقق من البيانات في ADC ( result = ADCINC12_iGetData() + 2048; ADCINC12_ClearFlag(); LCD_Position( 1,0); // تحديد موضع الإخراج LCD_PrHexInt(result); // إخراج النتيجة بشكل سداسي عشري ) )

تتم إضافة 2048 إلى بيانات وظيفة iGetData() لتحويل البيانات إلى مكافئ غير موقع (إذا كنت مهتمًا بالنظر إلى "متغيرات c++ الموقعة وغير الموقعة" من Google).

نقوم بتوصيل مقياس الجهد باللوحة على النحو التالي.

نقوم بوميض المتحكم الدقيق وتقييم نتيجة العمل.

كل ما تبقى هو تحويل السداسيات إلى جهد والتحقق من صحة البيانات باستخدام جهاز اختبار. وسوف نحقق هذا الهدف بشكل تجريبي بحت. دعونا نجعل الوضع أسهل على أنفسنا ونأخذ الإمكانية الصفرية كقيمة 0x0000 عند مخرج ADC. ثم نقوم بتشغيل برنامجنا المكتوب بالفعل، وتحويل الجهد إلى الحد الأقصى وننظر إلى القيم الناتجة. على سبيل المثال، حصلت على 0x0FEC. ثم نأخذ جهاز اختبار ونقيس الجهد الحقيقي على مقياس الجهد. حصلت على 4.78 فولت. الآن نقسم 4.78/0x0FEC (بالنسبة لأولئك الذين لديهم مشاكل مع أنظمة حساب التفاضل والتكامل، أنصحك بالضخ) ونحصل على خطوة التكميم، أي وحدة الجهد التي تتوافق معها قيمة خرج ADC واحدة. حصلت على 0.0011727183513248، هذا هو الرقم. الآن نقوم ببساطة بضرب نتيجة ADC بهذه القيمة ونعرضها على الشاشة. للقيام بذلك، قم بإضافة متغيرات إلى حقل الرؤية العامة (هذا هو كل ما هو خارج الدالة main()).

توضح المقالة المحول التناظري إلى الرقمي لوحدات التحكم الدقيقة ARM 32 بت من سلسلة STM32 من شركة STMicroelectronics. يتم النظر في بنية وتكوين سجلاتها ،
وترد أيضا أمثلة عملية للبرامج.

مقدمة
أحد العناصر الأكثر أهمية وشعبية لوحدة التحكم الدقيقة هو المحول الرقمي (ADC)، والذي يشار إليه في الأدب الإنجليزي التقني باسم "تناظري إلى رقمي"
محول (أدك).

فهو يسمح لك بتحويل الإشارات التناظرية إلى قيم رقمية، والتي يمكن بعد ذلك معالجتها بواسطة المعالج. يتلخص جوهر التحويل في مقارنة الإشارة التناظرية بالجهد المرجعي وإنشاء قيمة عددية مقابلة للإشارة التناظرية في نطاق بتات ADC. على سبيل المثال، يقوم محول ADC ذو 12 بت بجهد مرجعي قدره 3.3 فولت بتحويل الإشارات التناظرية من 0 إلى 3.3 فولت إلى نطاق قيمة رقمي من 0 إلى 4095 وحدة في فترة زمنية معينة.

بمساعدة ADC، يستطيع المتحكم الدقيق حل العديد من المهام لأتمتة العمليات. بالإضافة إلى ذلك، إذا كان هناك ADC مدمج في وحدة التحكم الدقيقة، فسيتم تبسيط دائرة الجهاز قيد التطوير بشكل كبير وتقليل تكلفتها بشكل كبير. كقاعدة عامة، بالإضافة إلى ADC نفسه، يحتوي المتحكم الدقيق على مُضاعِف تناظري مدمج، والذي يسمح لك بزيادة عدد المدخلات التناظرية عن طريق تبديل عدة دبابيس من وحدة التحكم الدقيقة بالتناوب ثم تحويل الإشارات من هذه المسامير.

تحتوي وحدات التحكم الدقيقة من سلسلة STM32 أيضًا على ADC تقريبي متتابع 12 بت مع سرعات ساعة تصل إلى 14 ميجا هرتز. تحتوي بعض طرز STM32 على كتلتين أو ثلاث كتل ADC.

رسم تخطيطي لـ ADC للمتحكمات الدقيقة STM32

بنية ADC وتشغيلها
دعونا نلقي نظرة فاحصة على بنية وتشغيل وحدة ADC لـ STM32. يمكن إجراء التحويل التناظري إلى الرقمي للإشارات باستخدام ADC هذا في الوضع الفردي أو الوضع المستمر أو وضع المسح أو الوضع المتقطع. يتم تخزين نتيجة التحويل في سجلات ADC ذات 16 بت مع محاذاة البيانات إلى اليسار أو اليمين.
يحتوي ADC المدمج في وحدات التحكم الدقيقة من سلسلة STM32 على وظائف متقدمة. الخصائص الرئيسية لهذا ADC:

  • عمق البت - 12 بت؛
  • الحد الأدنى لوقت التحويل - 1 ميكروثانية؛
  • عدد القنوات – 16 خارجية و2 داخلية؛
  • عدد قيم وقت التحويل لكل قناة – 8؛
  • القدرة على تحديد تحويل واحد أو مستمر؛
  • المعايرة التلقائية
  • وجود مقارنة النافذة
  • القدرة على إطلاق التحويل من مصادر خارجية؛
  • العمل مع كتلة الوصول المباشر للذاكرة (DAM).

يتم تشغيل ADC من مصدر بجهد يتراوح بين 2.4 فولت إلى 3.6 فولت. ويتم توصيل مصدر الجهد المرجعي (VS) لـ ADC إما داخليًا بجهد إمداد ADC، أو بمنافذ خارجية خاصة، اعتمادًا على الطراز وعدد المحولات. دبابيس من الكريستال. يظهر الشكل التخطيطي لـ ADC لوحدات التحكم الدقيقة من سلسلة STM32. كما يتبين من الشكل، فإن ADC لديه 16 قناة تناظرية خارجية
واثنين داخليين، يتم تبديلهما باستخدام مُضاعِف الإدخال. ترتبط القنوات الخارجية بمنافذ المتحكم الدقيق. قبل استخدام هذه الأطراف كمدخلات تناظرية، يجب عليك تكوينها كمدخلات تناظرية. يتم استخدام قناتين إضافيتين للإشارات الداخلية. أحدهما مخصص لمراقبة الجهد المرجعي الداخلي، والثاني مخصص لجهاز الاستشعار
درجة الحرارة التي تقع على البلورة.
بالنسبة لـ ADC هذا، تم إدخال مصطلحات خاصة مثل القنوات العادية والمحقنة. ويكمن جوهر هذه المفاهيم في طريقة قنوات الاقتراع. يتم استطلاع القنوات العادية وتحويلها بتردد معين، أي الانتظام. يتم استطلاع القنوات المحقونة، أي القنوات المدمجة، بناء على طلب خاص من البرنامج بين الاستطلاعات العادية.
إذا كنت بحاجة إلى استطلاع عدة قنوات بشكل دوري، فيمكنك إنشاء قائمة بهذه القنوات لـ ADC وكتابتها في سجلات خاصة. بعد ذلك، سيقوم ADC بتحويل الإشارات من قنوات هذه القائمة بالتناوب واحدة تلو الأخرى. على سبيل المثال، لقياس الجهد بالتناوب في القنوات 3 و 7 و 5 و 1، تحتاج إلى كتابة هذا التسلسل في سجلات خاصة وبدء عملية تحويل ADC. ونتيجة لذلك، سيتم استطلاع هذه القنوات وتحويلها بشكل تسلسلي،
ويتم كتابة نتيجة هذه التحولات إلى سجلات البيانات. في هذه الحالة، ترتيب القنوات لا يهم. علاوة على ذلك، يمكن استطلاع نفس القناة عدة مرات في كل دورة. يمكن أن يصل عدد القياسات في مجموعة القنوات العادية إلى 16. يُسمح بالقياس المستمر للقنوات المحددة، أي أنه عند الانتهاء من القياس، تبدأ دورة جديدة تلقائيًا.

الحد الأقصى لعدد القياسات في مجموعة القنوات المحقونة هو أربعة. إذا بدأت في قياس القنوات المحقونة، فسيتم تعليق قياس القنوات العادية. ومن ثم سيتم إجراء قياس القنوات المحقونة المحددة وإعادة قياس قنوات المجموعة العادية مرة أخرى.
دعونا نلقي نظرة على مثال لكيفية تطبيق استخدام القنوات العادية والمحقنة. لنفترض أنك بحاجة إلى قياس الجهد باستمرار عند خمسة أطراف في تسلسل معين. للقيام بذلك، تحتاج إلى تضمين هذه القنوات في مجموعة عادية وبدء التحويل. سيبدأ ADC في استطلاعها بشكل تسلسلي وتحويل الإشارات إلى قيم رقمية. إذا لزم الأمر، سيتم إنشاء المقاطعات في نهاية التحويل. بهذه الطريقة، يمكن معالجة الإشارات التناظرية ويمكن تخزين بيانات تحويل ADC تلقائيًا. إذا كانت هناك حاجة في هذا الوقت لقياس درجة حرارة البلورة أو الإشارة التناظرية على قناة أخرى، فمن أجل عدم تعطيل القياس في القناة العادية، يمكنك البدء في قياس القناة المحقونة. في هذه الحالة، سيتم إيقاف معالجة القنوات العادية تلقائيًا لبعض الوقت، وبعد الانتهاء
قياسات المجموعة المحقونة - يتم استعادتها تلقائيًا.
يتم حفظ نتيجة التحويل للقنوات الأربع المحقونة في سجلات البيانات المقابلة. يحتوي ADC على سجل منفصل لكل قناة محقونة، أي ما مجموعه أربعة سجلات بيانات. ومع ذلك، بالنسبة لـ 18 قناة عادية، يكون لدى ADC سجل بيانات واحد فقط. من أجل حفظ نتائج التحويل لكل قناة، بعد الانتهاء من القياس في كل قناة، يمكنك إنشاء مقاطعة وإعادة كتابة البيانات من هذا السجل إلى كتلة ذاكرة المعالج. بالإضافة إلى ذلك، يمكنك استخدام قناة DMA خاصة، والتي ستسمح لك بإرسال نتائج كل تحويل إلى مخزن البيانات المؤقت المنظم مسبقًا في الذاكرة دون مشاركة المعالج. يتيح لك استخدام هذه الطريقة تقليل تكرار إنشاء المقاطعة إلى واحد في نهاية كل دورة تحويل لمجموعة من القنوات العادية. وبالإضافة إلى ذلك، يمكنك استخدام المخزن المؤقت المزدوج. سيسمح هذا بعد ملء ADC للمخزن المؤقت الأول
قم بإنشاء مقاطعة وابدأ في معالجة النتائج بواسطة المعالج. في هذا الوقت، سيبدأ ADC في ملء المخزن المؤقت الثاني باستخدام DMA. ثم يتغير الترتيب وهكذا يوجد في الجزء السفلي من الرسم البياني الموضح في الشكل مصادر يمكنها تشغيل عملية التحويل بشكل منفصل لمجموعة القنوات العادية والمحقنة. يمكن أن تكون هذه إشارات من مؤقتات، أو إشارة خارجية، أو قطعتين خاصتين من سجلات التحكم، من خلال تحديدهما يمكنك برمجة التحويل في مجموعة عادية أو محقونة.
من السمات المميزة لـ ADC هذا وجود مؤقت مراقبة تناظري (AWD ، من English Analog Watch Dog) ، وهو عبارة عن مقارنة للنافذة. يحتوي على سجلين لتحديد حدود المقارنة. تتم برمجة القيم المقابلة في سجل الحد الأدنى وسجل الحد الأعلى للتحكم في مستوى الإشارة المقاسة. تتم كتابة رقم القناة التي يجب توصيل جهاز المقارنة بها في سجل خاص. إذا تجاوز الجهد المقاس لقناة معينة الحدود المحددة، فسيتم تعيين العلم المقابل في ADC وسيتم إنشاء طلب المقاطعة.
يمكن أن تكون مقارنة النافذة هذه مفيدة جدًا للتحكم تلقائيًا في معلمة معينة. وبمساعدتها، يمكنك، على سبيل المثال، مراقبة درجة حرارة وحدة التحكم لتجنب ارتفاع درجة الحرارة. للقيام بذلك، يمكنك بانتظام، على سبيل المثال، كل ثانية، قياس مستوى الإشارة من جهاز استشعار درجة الحرارة. إذا تجاوز حدًا معينًا، فيجب اتخاذ إجراءات معينة. على سبيل المثال، تقليل تردد الساعة، وإنشاء إشارة تحذير، وما شابه ذلك. تتيح لك مقارنة النوافذ تنفيذ إجراء مماثل دون تشتيت انتباه المعالج عن تنفيذ البرنامج الرئيسي، وبالتالي توفير موارد المعالج وذاكرة البرنامج. لبدء مقارنة النافذة، من الضروري تهيئتها عن طريق كتابة مستويات الحدود، وإدراج القناة المراقبة في قائمة القنوات العادية وتمكين المقاطعات منها. إذا تجاوز مستوى الإشارة المراقبة النطاق المحدد، فسوف يعمل جهاز المقارنة وسيتم استدعاء وظيفة معالج المقاطعة لهذا الحدث.
ADC قادر على توليد ثلاث إشارات مقاطعة: نهاية التحويل، ونهاية تحويل المجموعة المحقونة، والإشارة من مقارنة النافذة.

عنسجلات الكتابةأدك
تتضمن كتلة ADC عددًا كبيرًا إلى حد ما من السجلات. ولكن هذا أمر منطقي، نظرا لوظائفه الغنية وعدد القنوات للتحويل. يتم عرض خريطة تسجيل ADC في الجدول 1.
يمكن تجميع كافة السجلات حسب الوظيفة. ونتيجة لهذا التنظيم تم تشكيل المجموعات التالية:

●● سجل الحالة ADC_SR - يحتوي على بتات تشير إلى حالة ADC؛
●● سجلات التحكم ADC_CR1 و ADC_CR2 – تحديد وضع التشغيل لـ ADC؛
●● تسجيل ADC_SMPR1 و ADC_SMPR2 - ضبط وقت تحويل ADC؛
●● يسجل ADC_JOFR1…ADC_JOFR4 – تحديد إزاحة البيانات في مجموعة القنوات المحقونة؛
●● سجلات ADC_HTR وADC_LTR - قم بتعيين الحدود العليا والدنيا لمقارنة النوافذ؛
●● يسجل ADC_SQR1…ADC_SQR3 – ضبط تسلسل قنوات المجموعة العادية؛
●● سجل ADC_JSQR - يضبط تسلسل قنوات المجموعة المحقونة؛
●● سجلات البيانات ADC_JDR1…ADC_JDR4 – تحتوي على نتيجة التحويل لسجلات مجموعة القنوات المحقونة؛
●● سجل البيانات DR – يحتوي على نتيجة التحويل لمجموعة عادية من القنوات.

دعونا نفكر في الغرض من البتات في كل مجموعة من مجموعات سجلات ADC المقدمة بمزيد من التفصيل. يحتوي سجل ADC_SR على البتات التي تم تعيينها بواسطة الأجهزة. تتم إعادة تعيينها برمجياً أو عند إعادة التعيين. تتم إعادة تعيين بت EOC تلقائيًا بعد قراءة سجل ADC_DR. الغرض من البتات هو كما يلي:
●● يتم ضبط البت 4 STRT عند بدء تحويل القناة العادية؛
●● يتم ضبط البت 3 JSTRT عند بداية تحويل القناة المحقونة؛
●● يشير البت 2 JEOC إلى نهاية تحويل القناة المحقونة؛
●● يشير البت 1 EOC إلى نهاية تحويل القناة العادية أو المحقونة؛
●● يتم ضبط بت AWD 0 عند تشغيل مقارنة النافذة.

يحتوي سجل ADC_CR1 على بتات التحكم التالية:
●● يتحكم البت 23 AWDEN في مقارنة نافذة القناة العادية؛
●● البت 22 JAWDEN يتحكم في مقارنة نافذة القناة المحقونة؛
●● البتات 15...13 DISCNUM تحدد عدد القنوات العادية، التي سيتم إجراء تحويلها في الوضع المتقطع عند وصول حدث تشغيل خارجي؛
●● البت 12 JDISCEN يقوم بتعطيل وتمكين الوضع المتقطع للقنوات المحقونة؛
●● يقوم البت 11 DISCEN بتعطيل وتمكين الوضع المتقطع للقنوات العادية؛
●● بت 10 JAUTO يقوم بتعطيل وتمكين وضع التحويل التلقائي للقنوات المحقونة؛
●● البت 9 AWDSGL يمكّن مقارنة النافذة من العمل لجميع القنوات أو للقناة المحددة بواسطة بتات AWDCH؛
●● يحظر bit 8 SCAN ويمكّن وضع المسح للقنوات المحددة بواسطة سجلات ADC_SQRx أو ADC_JSQRx؛
●● البت 7 JEOCIE يقوم بتعطيل وتمكين المقاطعات عند الانتهاء من تحويل قنوات الحقن؛
●● يقوم البت 6 AWDIE بتعطيل وتمكين المقاطعات من مقارنة نافذة ADC؛
●● يقوم البت 5 EOCIE بتعطيل وتمكين المقاطعات في نهاية التحويل في مجموعة عادية أو محقونة؛
●● البتات 4…0 AWDCH تحدد رقم القناة التي يتصل بها جهاز مقارنة النافذة.
يحتوي سجل ADC_CR2 على بتات للأغراض التالية:
●● البت 23 TSVREFE يربط قناة الجهد المرجعي ومستشعر درجة الحرارة الموجود على الشريحة؛
●● البت 22 SWSTART يبدأ تحويل القنوات العادية؛
●● البت 21 JSWSTART يبدأ تحويل القنوات المحقونة؛
●● يعمل البت 20 EXTTRIG على تعطيل وتمكين استخدام التشغيل الخارجي للقنوات العادية؛
●● بت 19…17 EXTSEL تحدد المصدر الذي سيطلق التحويل في القناة العادية (000 = TIM1_CH1، 001 = TIM1_CH2، 010 = TIM1_CH3، 011 = TIM2_CH2، 100 = TIM3_TRGO، 101 =T IM4_CH4، 110 = EXTI_11، 111) = SW ستارت)؛
●● البت 15 JEXTRIG يعمل على تعطيل وتمكين استخدام التشغيل الخارجي للقنوات المحقونة؛
●● بت 14…12 JEXTSEL تحدد المصدر الذي سيطلق التحويل في القناة المحقونة (000 = TIM1_TRGO، 001 = TIM1_CH4، 010 = TIM2_TRGO، 011 = TIM2_CH1، 100 = TIM3_CH4، 101 = TIM4_TRGO، 110 = EXTI_15، 11 1) = JSWSTART) ;
●● البت 11 ALIGN يضبط محاذاة نتيجة التحويل في سجل البيانات إلى الحواف اليمنى (0) أو اليسرى (1)؛
●● يحظر البت 8 DMA استخدام كتلة DMA ويتيحها؛
●● البت 3 RSTCAL يعيد ضبط المعايرة؛
●● يبدأ البت 2 CAL معايرة ADC عن طريق كتابة 1، والذي تتم إعادة ضبطه بواسطة الأجهزة في نهاية العملية؛
●● البت 1 CONT يبدأ التحويل المستمر؛
●● يقوم البت 0 ADON بتعطيل وحدة ADC وتمكينها.

يقوم تسجيل ADC_SMPR1 وADC_SMPR2 بتعيين وقت التحويل في كل قناة. يتم تخصيص ثلاث بتات لكل قناة، مما يسمح لك بتعيين 8 أوقات تحويل
في الدورات (000 = 1.5 دورة، 001 = 7.5 دورة، 010 = 13.5 دورة، 011 = 28.5 دورة، 100 = 41.5 دورة، 101 = 55.5 دورة، 110 = 71.5 دورة، 111 = 239.5 دورة).
يتم استخدام سجلات ADC_JOFR1...ADC_JOFR4 لتعيين إزاحة كل قناة من المجموعة المحقونة (JOFR1، JOFR2، JOFR3، JOFR4). يمكن كتابة هذه السجلات بقيمة 12 بت، والتي يتم طرحها تلقائيًا من نتيجة تحويل ADC. إذا أصبحت القيمة الناتجة سالبة، فسيتم إلحاق سجل النتائج الخاص بالمجموعة المحقونة بتة إشارة سالبة.

يحتوي كل من مسجلي ADC_LTR وADC_HTR على 12 بت، حيث يتم كتابة قيم الحدود العليا والسفلى لمقارن النوافذ.
سجلات ADC_SQR1... يتم استخدام ADC_SQR3 لتعيين أرقام القنوات التي سيتم استقصاؤها في مجموعة عادية، والعدد الإجمالي للقنوات. تحدد بتات SQx لهذه السجلات رقم القناة، حيث x هو رقم الموضع للتحويل من 1 إلى 16. يتم تحديد عدد القنوات في المجموعة بواسطة البتات L لسجل ADC_SQR1.

على سبيل المثال، تحتاج إلى استطلاع 7 قنوات بانتظام بالترتيب 1، 3، 1، 5، 9، 9، 1. للقيام بذلك، تحتاج إلى الكتابة
في ADC_SQR3 قم بتسجيل القيم التالية: SQ1 = 1، SQ2 = 3، SQ3 = 1، SQ4 = 5، SQ5 = 9، SQ6 = 9. في سجل ADC_SQR2، تحتاج إلى كتابة رقم القناة السابعة الأخيرة التي تم استطلاعها: SQ7 = 1. بعد ذلك، يجب عليك تعيين عدد القنوات التي يتم استطلاعها لمجموعة عادية لسجل ADC_SQR1: L = 7. من المعلومات المقدمة، من الواضح أنه يمكن استطلاع القنوات بأي تسلسل. بالإضافة إلى ذلك، يمكن استطلاع أي قناة عدة مرات.
يحدد سجل ADC_JSQR، مثل سجلات ADC_SQRx، تسلسل القنوات التي تم استطلاعها وعددها لمجموعة القنوات المحقونة. كما يتبين من بنية السجل، فإن الحد الأقصى لعدد التحولات في المجموعة المحقونة هو أربعة. يتم تحديد عدد القنوات بأرقام JL.

يسجل ADC_JDR1...ADC_JDR4 يخزن البيانات الخاصة بقنوات المجموعة المحقونة. الحد الأقصى لعدد القنوات في المجموعة المحقونة هو أربعة، لذلك هناك أربعة سجلات للبيانات. يتم وضع نتيجة التحويلات في كل قناة مختارة في هذه السجلات. وبما أن السجلات 16 بت، وADC 12 بت، فمن الممكن محاذاة نتيجة القياس إلى يسار أو يمين هذه السجلات.

يحتوي سجل ADC_DR على نتيجة تحويل ADC في مجموعة عادية. على عكس المجموعة المحقونة، التي تحتوي على أربعة سجلات بيانات، يوجد سجل واحد فقط للمجموعة بأكملها. هيكلها مشابه لسجلات JDRx، باستثناء البتات الأكثر أهمية 16...31. يتم استخدام هذه البتات عندما يعمل ADC في الوضع المزدوج، جنبًا إلى جنب مع ADC ثانٍ يسمى ADC2.

أوضاع تشغيل ADC
يسمح ADC باستخدام العديد من أوضاع التشغيل. دعونا نلقي نظرة عليها واحدًا تلو الآخر، بدءًا من وضع التحويل الفردي. في هذا الوضع، يقوم ADC بإجراء تحويل واحد فقط. يتم تشغيله بعد ضبط بت ADON في سجل ADC_CR2 للقنوات العادية، أو من إشارة خارجية للقنوات العادية والمحقنة. في هذه الحالة، يجب أن تكون بتة CONT الخاصة بسجل ADC_CR2 مساوية للصفر. بعد الانتهاء من التحويل في القناة العادية المحددة، يتم تخزين نتيجة التحويل في سجل ADC_DR ويتم تعيين علامة EOC. إذا تم تعيين بت EOCIE، فسيتم إنشاء مقاطعة. بالنسبة للقناة المحقونة، يتم تخزين نتيجة التحويل في سجل ADC_DRJ1 ويتم تعيين علامة JEOC. إذا تم تعيين بت JEOCIE، فسيتم إنشاء مقاطعة. بعد ذلك، تتوقف عملية ADC.
في وضع التحويل المستمر، يبدأ ADC التحويل التالي بعد اكتمال التحويل الحالي. يتم تشغيل هذا الوضع من مصدر خارجي أو عن طريق تعيين بت ADON لسجل ADC_CR2. في هذه الحالة، يجب أن تكون بتة CONT الخاصة بسجل ADC_CR2 مساوية لواحد. بعد كل تحويل، يتم تنفيذ نتيجة التحويل وحفظها بنفس الطريقة كما في وضع التحويل الفردي.
في وضع المسح، يقوم ADC بإجراء تحويل متسلسل لمجموعة من القنوات. يتم تحديد هذا الوضع عن طريق تعيين بت SCAN لسجل ADC_CR1. إذا تم تعيين هذا البت، يقوم ADC بمسح جميع القنوات المحددة في سجلات ADC_SQRx للقنوات العادية أو سجل ADC_JSQR للقنوات المحقونة. إذا تم تعيين بت CONT، فإن التحويل لا يتوقف عند القناة الأخيرة، بل يبدأ مرة أخرى من القناة الأولى. إذا تم تعيين بت DMA، فسيتم استخدام وحدة تحكم DMA لنقل النتيجة إلى الذاكرة في نهاية كل تحويل بعد تعيين بت EOC. إذا تم استخدام أكثر من قناة واحدة في مجموعة عادية، فمن المستحسن استخدام DMA لحفظ النتيجة. يؤدي هذا إلى تجنب فقدان البيانات المخزنة بالفعل في سجل ADC_DR. في نهاية التحويل، تصدر المجموعة العادية طلب DMA لتخزين النتيجة من سجل ADC_DR إلى الموقع المحدد من قبل المستخدم. تتنوع أيضًا أوضاع تشغيل ADC مع القنوات المحقونة. لاستخدام مشغل قناة الحقن، يجب مسح بت JAUTO ويجب تعيين بت SCAN في سجل ADC_CR1. يتم تشغيل تحويل الإشارة لمجموعة من القنوات العادية إما عن طريق إشارة خارجية أو عن طريق ضبط بت ADON في سجل ADC_CR2. إذا حدث تحفيز خارجي لقنوات الحقن أثناء تحويل الإشارات من مجموعة من القنوات العادية، فسيتم تعليق التحويل الحالي وبدء تحويل تسلسل قنوات الحقن في وضع المسح الفردي.

ومن ثم يتم استئناف تحويل مجموعة القنوات العادية بدءاً بالقناة التي تم انقطاعها. إذا حدث حدث تشغيل قناة عادية أثناء تحويل الحقن، فإنه لا يقاطع التحويل، ولكن يتم تشغيل التسلسل العادي مباشرة بعد انتهاء معالجة تسلسل الحقن. عند استخدام حدث خارجي يثير قنوات الحقن، يجب التأكد من أن الفاصل الزمني بين أحداث الزناد أطول من وقت تحويل قناة الحقن. على سبيل المثال، إذا كانت مدة تسلسل التحويل هي 28 دورة ساعة ADC، فيجب أن يكون الحد الأدنى للفاصل الزمني بين أحداث التشغيل 29 دورة.

إذا تم تعيين بت JAUTO، بعد اكتمال تحويل مجموعة القنوات العادية، يبدأ تحويل مجموعة قنوات الحقن تلقائيًا. يمكن استخدام هذا لتعيين تسلسل من 17 إلى 20 قناة محددة في سجلات ADC_JSQR وADC_SQRx. في هذا الوضع، يجب تعطيل آلية تشغيل الحدث الخارجي. إذا تم تعيين بت CONT، بالإضافة إلى بت JAUTO، فبعد تحويل مجموعة قنوات الحقن مباشرة، يبدأ تحويل مجموعة القنوات العادية مرة أخرى. من المستحيل استخدام كلا الوضعين في نفس الوقت، البدء التلقائي والبدء بحدث خارجي.

معايرةأدك
يحتوي ADC على آلية معايرة تلقائية مدمجة. تعمل المعايرة على تقليل خطأ الرقمنة بشكل كبير، والذي يحدث بسبب عدم التجانس في أخذ عينات الإشارة الداخلية ومكثفات التخزين. أثناء المعايرة، يتم حساب قيمة ADC الرقمية لكل مكثف على شكل رمز تصحيح. أثناء جميع التحويلات اللاحقة، يتم استخدام هذا الرمز للتعويض عن أخطاء تحويل الإشارة.
قبل أن تبدأ المعايرة، يجب أن يكون ADC في حالة تعطيل، أي أن بت ADON يجب أن يكون صفرًا لدورتين على الأقل على مدار الساعة ADC.
تبدأ المعايرة بتعيين بت CAL في سجل ADC_CR2. بمجرد اكتمال المعايرة، تتم إعادة تعيين بت CAL بواسطة الأجهزة، وبعد ذلك يمكن إجراء التحويل العادي. يوصى بمعايرة ADC مرة واحدة عند توصيل الطاقة. يتم تخزين رموز المعايرة في ADC_DR عند اكتمال مرحلة المعايرة.

وقت تحويل ADC
يدعم ADC القدرة على برمجة وقت التحويل بشكل منفصل في كل قناة. من الممكن تحديد 8 قيم منفصلة من نطاق 1.5…239.5 دورة. لكل قناة، يتم ضبط الوقت بشكل فردي باستخدام بتات SMPx الخاصة بالسجلات ADC_SMPR1 وADC_SMPR2.
يتم حساب إجمالي وقت التحويل Tconv بواسطة الصيغة: Tconv = Tsmt + 12.5 دورة، حيث Tsmt هو وقت أخذ العينات المحدد بواسطة البرنامج. على سبيل المثال، تم ضبط تردد ADCCLK على 14 ميجا هرتز،
ووقت أخذ العينات هو 1.5 دورة. ثم Tconv = 1.5 + 12.5 = 14 دورة = 1 ميكروثانية.

مستشعر درجة الحرارة ADC
يتيح لك مستشعر درجة الحرارة المدمج في بلورة المتحكم الدقيق قياس درجة حرارة البلورة نفسها. يتم توصيل المستشعر بالمدخل السادس عشر لـ ADC. الوقت الموصى به لأخذ العينات
عند الاقتراع يكون المستشعر 17.1 ميكروثانية.
عند عدم الاستخدام، يمكن إيقاف تشغيل المستشعر. يختلف الجهد عند خرج المستشعر خطيًا مع درجة الحرارة. في البلورات المختلفة، ينتقل هذا الخط إلى 45 درجة، وهو أمر مستحق
مع تكنولوجيا التصنيع. يعد المستشعر الداخلي أكثر ملاءمة ليس لقياس القيمة المطلقة لدرجة الحرارة، بل لمراقبة تغيرها. لقراءة درجة الحرارة التي تحتاجها
حدد القناة 16، واضبط وقت أخذ العينات على 17.1 ميكرو ثانية على الأقل واضبط بت TSVREFE في سجل ADC_CR2 لتشغيل المستشعر. بعد ذلك، يمكنك تشغيل تحويل ADC عن طريق تعيين بت ADON أو عن طريق حدث خارجي وقراءة نتيجة التحويل.
يتم حساب قيمة درجة الحرارة باستخدام الصيغة: T[C] = (V25 – Vsense) / Avg_Slope + 25، حيث V25 هي قيمة القياس عند 25 درجة، ولها قيمة نموذجية تبلغ 1.41 فولت، وVsense هي القيمة المقاسة الحالية، و Avg_Slope هو المعامل المأخوذ من الجداول لكل بلورة بقيمة نموذجية تبلغ 4.3 مللي فولت/مئوية.

مقارنة النافذة
يمكن استخدام مقارنة النافذة لمراقبة قناة عادية أو محقونة محددة، أو جميع القنوات العادية أو المحقونة. بالإضافة إلى مراقبة الجهد، يمكن استخدام وظيفة مقارنة النافذة ككاشف عبور صفري.

يتم تعيين علامة الدفع الرباعي (AWD) إذا كانت القيمة الرقمية لإشارة القناة المقاسة بواسطة ADC أكبر أو أقل من المستوى المحدد. يتم تعيين هذا المستوى بواسطة سجلات ADC_HTR وADC_LTR. يمكن تمكين المقاطعة بواسطة بت AWDIE الخاص بسجل ADC_CR1. يتم ضبط قنوات ADC التي يتم التحكم فيها بواسطة مقارنة النافذة وفقًا للجدول 2.
تحدد بت AWDSGL عدد القنوات المراقبة. إذا كان 0، فسيتم مراقبة جميع القنوات، وإذا كان 1، فسيتم مراقبة قناة واحدة. ويتم تحديد رقم القناة باستخدام بتات AWDCH.
تسمح بتة AWDEN بمراقبة قنوات المجموعة العادية، وتسمح بتة JAWDEN بمراقبة قنوات المجموعة المحقونة.

الجدول 2. قنوات ADC التي يتم التحكم فيها عن طريق مقارنة النافذة

برامج المثال

دعونا نلقي نظرة على أمثلة لبرامج العمل مع ADC. لنبدأ بالخيار الأبسط: قياس مستوى الإشارة على قناة واحدة باستخدام برنامج التشغيل. للقيام بذلك، نستخدم منفذ المنفذ PORTA.6 الخاص بوحدة التحكم الدقيقة. يظهر مثال للبرنامج في القائمة 1.

القائمة 1 //================= // وظيفة تهيئة ADC //============ =========== void Init_ADC(void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // تمكين تسجيل وقت منفذ PORTA // تكوين PORTA.6 كمدخل تناظري GPIOA->CRL &= ~GPIO_CRL_MODE6; // مسح بتات MODE GPIOA->CRL &= ~GPIO_CRL_CNF6; // مسح بتات CNF RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // تمكين تسجيل الوقت ADC RCC->CFGR &= ~RCC_CFGR_ADCPRE; // تعيين قيمة مقسم الساعة ADC1-> CR1 = 0؛ // إعادة ضبط تسجيل التحكم ADC1->SQR1 = 0؛ // إعادة ضبط التسجيل SQR1 ADC1->CR2 |= ADC_CR2_CAL؛ // بدء المعايرة while (!(ADC1->CR2 & ADC_CR2_CAL))() ؛ // انتظر نهاية المعايرة ADC1->CR2 = ADC_CR2_EXTSEL؛ // حدد بت SWSTART كمصدر تشغيل ADC1->CR2 |= ADC_CR2_EXTTRIG؛ // السماح بالتشغيل الخارجي للقناة العادية ADC1->CR2 |= ADC_CR2_ADON ; // تمكين ADC) //=========================== =============== = // وظيفة بدء تحويل ADC وقراءة القناة المحددة // الإدخال - رقم القناة للتحويل // الإخراج - نتيجة التحويل //===== ========================================================================================= ============= uint16_t RD_ADC(uint8_t nk) ( ADC1->SQR3 = nk; // قم بتعيين رقم القناة ADC1->CR2 |= ADC_CR2_SWSTART; // ابدأ التحويل while(!(ADC1->SR & ADC_SR_EOC))()); // انتظر حتى ينتهي التحويل return ADC1->DR; // اقرأ نتيجة التحويل) //=========== // الوحدة الرئيسية للبرنامج //========= ========= ====== void main(void) ( unsigned int ai; // تهيئة المتغيرات // أوامر أخرى... while(1) // حلقة لا نهاية لها ( Init_ADC(); // تنفيذ التهيئة وبدء ADC ai = RD_ADC(6); // قراءة بيانات ADC للقناة 6 // أوامر أخرى...))

يوضح هذا المثال برنامجًا يلزم فيه تشغيل ADC بشكل منتظم والانتظار حتى يكتمل التحويل.
الآن دعونا نلقي نظرة على مثال برنامج آخر موضح في القائمة 2، والذي يستخدم وضع التحويل المستمر لـ ADC.

القائمة 2 //================= // وظيفة تهيئة ADC //============ =========== void Init_ADC(void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // تمكين تسجيل وقت منفذ PORTA // تكوين PORTA.6 كمدخل تناظري GPIOA->CRL &= ~GPIO_CRL_MODE6; // مسح بتات MODE GPIOA->CRL &= ~GPIO_CRL_CNF6; // مسح بتات CNF RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // تمكين تسجيل الوقت ADC RCC->CFGR &= ~RCC_CFGR_ADCPRE; // تعيين قيمة مقسم الساعة ADC1-> CR1 = 0؛ // إعادة ضبط تسجيل التحكم ADC1->SQR1 = 0؛ // إعادة ضبط التسجيل SQR1 ADC1->CR2 |= ADC_CR2_CAL؛ // بدء المعايرة while (!(ADC1->CR2 & ADC_CR2_CAL))() ؛ // انتظر نهاية المعايرة ADC1->CR2 = ADC_CR2_EXTSEL؛ // حدد مصدر التشغيل SWSTART ADC1->CR2 |= ADC_CR2_EXTTRIG؛ // السماح بالتشغيل الخارجي لقناة عادية ADC1->CR2 |= ADC_CR2_CONT؛ // تمكين وضع التحويل المستمر ADC1->CR2 |= ADC_CR2_ADON; // تمكين ADC ADC1->CR2 |= ADC_CR2_SWSTART; // // بدء التحويل) //========== // الوحدة الرئيسية للبرنامج //=================== void main(void) ( unsigned int ai; // تهيئة المتغيرات Init_ADC(); // تهيئة ADC وبدء تشغيله // أوامر أخرى... while(1) // حلقة لا نهاية لها ( ai=ADC1->DR; // اقرأ نتيجة التحويل // أوامر أخرى... ) )

يبدأ هذا البرنامج وضع التحويل المستمر لقناة معينة، ويقوم ADC باستمرار باستقصاء القناة المحددة، ووضع النتيجة في سجل البيانات. لهذا
لا يحتاج البرنامج الرئيسي إلى تشغيل ADC بانتظام. باستخدام هذه الطريقة، في سجل ADC_DR، سيتم تحديث المعلومات حول مستوى الإشارة عند دخل القناة باستمرار. سيتم إجراء التحديثات على فترات زمنية يمكن تغييرها.
في الأمثلة التي تمت مناقشتها، يمكنك تشغيل التحويل المستمر لقناة واحدة. إذا كنت بحاجة إلى القيام بذلك لعدة قنوات، فلا يمكنك الاستغناء عن استخدام المقاطعات أو كتلة DMA، حيث يتم توفير سجل بيانات واحد فقط للمجموعة العادية. ومع ذلك، إذا كان عدد القنوات لا يتجاوز أربعة، فيمكن استخدام تحويل القنوات المحقونة بطريقة مماثلة.
الحد الأقصى لعدد القنوات لمجموعة حقنها هو أربعة. كل قناة لها سجل خاص بها لتخزين نتيجة التحويل.
لنفترض أنك بحاجة إلى استطلاع أربع قنوات بأرقام: 3 و4 و5 و6. للقيام بذلك، يمكنك البدء في قياس مستمر لمجموعة من أربع قنوات محقونة. في هذه الحالة، سيقوم ADC تلقائيًا بمسح القنوات الأربع المحددة، ووضع النتيجة في سجلات البيانات ADC_JDR1، وADC_JDR2، وADC_JDR3، وADC_JDR4. في هذه الحالة، سيكون من الممكن قراءة البيانات من القناة المطلوبة في أي وقت. ويرد مثال على هذا البرنامج في القائمة 3.

القائمة 3 //================= // وظيفة تهيئة ADC //============ =========== void Init_ADC(void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // تمكين تسجيل وقت منفذ PORTA // تكوين PORTA.3 كمدخل تناظري GPIOA->CRL &= ~GPIO_CRL_MODE3; // مسح بتات MODE GPIOA->CRL &= ~GPIO_CRL_CNF3; // مسح بتات CNF // تكوين PORTA.4 كمدخل تناظري GPIOA->CRL &= ~GPIO_CRL_MODE4; // مسح بتات MODE GPIOA->CRL &= ~ GPIO_CRL_CNF4; // مسح بتات CNF // تكوين PORTA.5 كمدخل تناظري GPIOA->CRL &= ~GPIO_CRL_MODE5; // مسح بتات MODE GPIOA->CRL &= ~GPIO_CRL_CNF5; // مسح بتات CNF // تكوين PORTA. 6 كمدخل تناظري GPIOA->CRL &= ~GPIO_CRL_MODE6; // مسح بتات MODE GPIOA->CRL &= ~GPIO_CRL_CNF6; // مسح بتات CNF RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; // تمكين تسجيل الوقت ADC RCC->CFGR & = ~RCC_CFGR_ADCPRE ; // اضبط قيمة مقسم تردد الساعة ADC1->CR1 = 0; // امسح سجل التحكم ADC1->CR2 |= ADC_CR2_CAL; // ابدأ المعايرة while (!(ADC1->CR2 & ADC_CR2_CAL)()); // انتظر نهاية المعايرة ADC1->CR2 = ADC_CR2_JEXTSEL; // حدد بت مصدر التشغيل JSWSTART ADC1->CR2 |= ADC_CR2_JEXTTRIG; // السماح بالتشغيل الخارجي للمجموعة المحقونة ADC1->CR2 |= ADC_CR2_CONT; // تمكين وضع التحويل المستمر ADC1->CR1 |= ADC_CR1_SCAN; // تمكين وضع المسح متعدد القنوات ADC1->CR1 |= ADC_CR1_JAUTO; // التشغيل التلقائي للمجموعة المحقونة ADC1->JSQR = (uint32_t)(4-1)<<20; // Задать количество каналов в инжектированной группе=4 ADC1->JSQR |= (uint32_t)3<<(5*0); // Номер первого канала для преобразования=3 ADC1->JSQR |= (uint32_t)4<<(5*1); // Номер второго канала для преобразования=4 ADC1->JSQR |= (uint32_t)5<<(5*2); // Номер третьего канала для преобразования=5 ADC1->JSQR |= (uint32_t)6<<(5*3); // Номер четвертого канала для преобразования=6 ADC1->CR2 |= ADC_CR2_ADON; // تمكين ADC ADC1->CR2 |= ADC_CR2_JSWSTART; // بدء التحويل ) //=========== الوحدة الرئيسية للبرنامج //=========== ============ == void main(void) ( unsigned int ai; // تهيئة المتغيرات Init_ADC(); // تهيئة ADC وبدء تشغيله // أوامر أخرى ... while(1) // حلقة لا نهائية ( // اقرأ نتيجة تحويل ai=ADC1->JDR1; // القناة 3 ai=ADC1->JDR2; // القناة 4 ai=ADC1->JDR3; // القناة 5 ai=ADC1->JDR4; // القناة 6 // أوامر أخرى. .. ))

بعد تنفيذ وظيفة تهيئة ADC المذكورة أعلاه في سجلات البيانات الخاصة بالمجموعة المحقونة، سيتم تحديث نتائج التحويل المحددة في برنامج القناة بانتظام. ولذلك، يمكن قراءة هذه النتائج في أي وقت حسب الحاجة.
يمكنك معرفة المزيد حول وحدة ADC الخاصة بوحدة التحكم الدقيقة STM32 على موقع الويب.


وصف تشغيل المحول التناظري إلى الرقمي.
يقاطع ADC

يحتوي ATMega16 على ADC 10 بت، والذي يمكن توصيل مدخلاته بأحد الأطراف الثمانية للمنفذ A. يحتاج Mega16 ADC، مثل أي ADC آخر، إلى جهد مرجعي لأغراض المقارنة مع الإدخال (إذا كانت القيمة المقاسة يساوي المرجع، ثم نحصل على الحد الأقصى للرمز في شكل ثنائي). يتم تطبيق الجهد المرجعي على طرف ADRef أو يمكن استخدام مذبذب داخلي بجهد ثابت قدره 2.65 فولت، ويمكن تمثيل النتيجة على النحو التالي:

يتم تمكين ADC عن طريق تعيين بت ADEN في سجل ADCSRA. بعد التحويل، تنتهي نتيجة 10 بت في سجلات ADCL وADCH ذات 8 بت. افتراضيًا، يكون البت الأقل أهمية من النتيجة على اليمين (أي في البت 0 من سجل ADCL، وهو ما يسمى بالاتجاه الصحيح). ولكن يمكن تغيير ترتيب البتات إلى الاتجاه الأيسر عن طريق ضبط بت ADLAR في سجل ADMUX. يعد هذا مفيدًا إذا كنت تريد الحصول على نتيجة 8 بت. في هذه الحالة، يجب قراءة سجل ADCH فقط. بخلاف ذلك، يجب عليك أولاً قراءة سجل ADCL أولاً وسجل ADCH ثانياً للتأكد من أن قراءة هذين السجلين تشير إلى نتيجة نفس التحويل.

يمكن أن يحدث تحويل واحد عن طريق كتابة بت ADSC إلى سجل ADCSRA. ويظل هذا البت مضبوطًا طوال مدة التحويل. عند اكتمال التحويل، يتم تعيين البت تلقائيًا على 0. ويمكنك أيضًا بدء التحويلات بناءً على أحداث من مصادر مختلفة. يمكن أيضًا أن تعمل وحدة ADC في وضع الطيران الحر. في هذه الحالة، يقوم ADC باستمرار بتحويل وتحديث سجلات ADCH وADCL بقيم جديدة.

تتطلب وحدة ADC سرعة الساعة لإجراء التحويل. كلما زاد هذا التردد، كلما حدث التحويل بشكل أسرع (يستغرق عادةً 13 دورة على مدار الساعة، ويستغرق التحويل الأول 25 دورة على مدار الساعة). ولكن كلما زاد التردد (وكانت سرعة التحويل أعلى)، كانت النتيجة أقل دقة. للحصول على النتيجة الأكثر دقة، يجب ضبط وحدة ADC على تردد يتراوح من 50 إلى 200 كيلو هرتز. إذا كنت بحاجة إلى نتيجة بدقة أقل من 10 بت، فيمكنك استخدام تردد أكبر من 200 كيلو هرتز. تحتوي وحدة ADC على مقسم تردد للحصول على تردد الساعة المطلوب للتحويل من تردد المعالج.

يسجل أدموكسيضبط دبوس الإدخال للمنفذ A لتوصيل ADC واتجاه النتيجة واختيار التردد المرجعي. إذا تم ضبط بت ADLAR، فستكون النتيجة موجهة نحو اليسار. يتم ضبط التردد المرجعي من المذبذب الداخلي بواسطة البتات REFS1 وREFS0 المعينة على 1. إذا كانت كلا البتتين واضحتين، فسيتم أخذ التردد المرجعي من طرف AREF. في حالة REFS1=0 وREFS0=1، يتم أخذ التردد المرجعي من AVCC بمكثف خارجي متصل بـ AREF. يتم تنفيذ اختيار دبوس الإدخال على النحو التالي:

التحكم ADC وتسجيل الحالة أدكسرا:

البت ADEN=1 يمكّن وحدة ADC.
كتابة واحدة إلى ADSC تبدأ دورة التحويل. في وضع "الطيران الحر"، تؤدي كتابة الوحدة إلى تشغيل التحويل الأول، ويتم تشغيل التحويلات اللاحقة تلقائيًا.
ADIF - علامة مقاطعة ADC. يتم تعيين هذا البت على 1 عندما يكتمل ADC التحويل وتحتوي سجلات ADCL وADCH على البيانات الحالية. يتم تعيين هذه العلامة حتى لو تم تعطيل المقاطعات. يعد هذا ضروريًا لحالة استقصاء البرامج الخاصة بـ ADC. إذا تم استخدام المقاطعات، تتم إعادة تعيين العلامة تلقائيًا. إذا تم استخدام برنامج الاستقصاء، فيمكن إعادة تعيين العلامة عن طريق كتابة السجل 1 إلى هذا البت.
ADIE - إذا تم تعيين هذا البت على واحد وتم تمكين المقاطعات عمومًا، ففي نهاية التحويل سيتم إجراء انتقال على طول متجه المقاطعة من ADC.
تقوم البتات ADPS2..0 بتعيين معاملات مقياس التردد المسبق: