في مقالتي
الأولى ، تحدثت عن عائلة وحدات التحكم هذه ، وقد كتب لي أكثر من اثني عشر شخصًا في PM مع أسئلة حول هذا الموضوع ، على الرغم من أن هذا لم يكن موضوع المقال. لم يرغب الناس بشكل قاطع في الذهاب إلى Google ، يتحدثون عن نقص المعلومات. لقد فوجئت قليلاً وقررت التحقق - في الواقع ، باللغة الروسية ، لا يوجد أي شيء عمليًا على عائلة C2000 (على خلفية AVR و STM) ، والأهم من ذلك أنه لا توجد أدلة بدء واضحة. يمكن العثور على المعلومات باللغة الإنجليزية ، ولكن مرة أخرى لا تكفي. بالنسبة لي ، هذا أمر مثير للدهشة إلى حد ما ، نظرًا لأن هذه العائلة ليست في عمر بضع سنوات. لذلك ، تقرر بأفضل ما في وسعهم للتأثير على الوضع.
من يحتاج إلى وحدات التحكم هذه من حيث المبدأ ... هل تريد تجميع عاكس لحام؟ مزودات الطاقة غير المنقطعة؟ جهاز فرد الشعر بالكهرباء؟ تردد؟ العاكس للطاقة البديلة؟ آلة التصنيع باستخدام الحاسب الآلي؟ إذا كانت هناك نقطة واحدة على الأقل تتعلق بك ، فإن المقالة مخصصة لك!
سيهتم القراء الآخرون أيضًا بالتعرف على وحدة التحكم "القديمة" ، ولماذا هي ضرورية وكيفية التعامل معها. هذه العائلة بسيطة للغاية (أبسط بكثير من STM و LPC و Cortex الأخرى) ، الأحجار سهلة الشراء (هناك أيضًا Ali) ، فهي تسمح لك بتنفيذ حلول صناعية موثوقة للغاية ، على أساسها يمكنك بناء أي نظام تحكم صناعي تقريبًا.
هل قررت بالفعل أن وحدة التحكم هذه هي حلمك ومستعدة للانطلاق في المعركة؟ ثم نشتري مقابل 17 دولارًا التصحيح التالي لـ F28027-LaunchPad:
هل اشتريت؟ الآن يمكنك الدخول في المعركة. إذا طرح السؤال من أين تشتري "أفضل" و "أرخص" ، فعندئذٍ نذهب إلى المتجر الرسمي. نذهب
هنا ونرى سعر 17 دولارًا. لهذا المبلغ سوف تتلقى رسوم تصحيح أصلية وتسليم إلى الباب. لقد طلبت مرة واحدة في الصين للتسليم ، وتبين أن 16 دولارًا مع خصم وقسيمة ، بالإضافة إلى رحلة "مكافأة" إلى مكتب البريد. لذلك ، أوصي أنه هو المسؤول. دعنا نذهب!
نظرة عامة على سلسلة C2000
يمكنك قراءة أكثر التفاصيل حول كل شيء على
الموقع الرسمي ، بالطبع ، باللغة الإنجليزية. سوف أتحدث عنه لفترة وجيزة وأعبر عن أفكاري حول التطبيق. يرجى ملاحظة أن هذا مجرد تخميني ولا يدعون الحقيقة.
أولا ، بضع كلمات عن C2000 بشكل عام. السمات المميزة للعائلة ، والتي ترتبط بالغرض الرئيسي للتحكم في المحرك ، هي وجود HRPWM (PWM عالي الدقة) و CLA (معالج مشترك). هذا الأخير غائب حقًا في أصغر Piccolo TMS320F2802x ، ولكن ليس هناك حاجة إليه ، الشيء الرئيسي هو HRPWM في المكان. ما هو ... HRPWM نفسه هو PWM عادي ، إنه دقيق للغاية فقط ، كما أن وقت التسجيل والإعداد لدورة العمل الجديدة أسرع بشكل ملحوظ. هذا يجعل من الممكن ، على سبيل المثال ، الحصول على جيب ذو شكل مثالي في عاكس DC / AC أو التحكم في محركات السائر في آلة CNC بدقة عالية جدًا.
CLA هي في جوهرها نواة كاملة ، ولكنها لا تملك الوصول إلى الأجهزة الطرفية ، فقط إلى النواة والذاكرة الرئيسيتين. إنه يعمل على تفريغ النواة الرئيسية من الحوسبة. يعمل هذا المعالج المشترك على استيعاب البيانات العائمة بسهولة وبشكل طبيعي ، وهو أمر مهم عند تنفيذ العديد من الخوارزميات والفلاتر والمزيد.

سأتحدث عن عائلتين رئيسيتين قد تواجههما على الأرجح:
- بيكولو. أصغر وحدات التحكم ، ولكن أيضا أرخص. جهاز TMS320F28027 من هذه العائلة. إذا قررت تطوير إلكترونيات الطاقة للأغراض التجارية ، فستكون هذه هي أحجارك الرئيسية - فهي رخيصة جدًا ، وتدفع (LQFP ، QFN ، TSSOP) وتسمح لك بتنفيذ كل شيء تقريبًا. على سبيل المثال ، يكفي أدائها لمركب PFC ثنائي الطور ، وعاكس للألواح الشمسية ، ومحول تردد يصل إلى 10 كيلو واط مع التحكم في المتجهات ، إلخ. كما ترون ، هذا جزء من المنتجات التي يتم شراؤها من قبل الناس والشركات العادية ، مما يعني أنها مطلوبة بشكل كبير. القيود الرئيسية هي تردد 60 ميجا هرتز ، عدد محدود من قنوات PWM.
- دلفينو. من الناحية الإيديولوجية ، هذه كلها نفس بيكولو ، منتفخة فقط بالميلدونيوم. ما يعبر عنه هذا - التردد يصل إلى 200 ميجاهرتز ، في الأحجار القديمة يوجد بالفعل نواتان كاملتان + معالجان مشتركان ، وحالات كبيرة ، وبالتالي ، العديد من الأرجل ، والعديد من قنوات PWM ، والعديد من ADC ، وبشكل عام ، الكثير. أي أنه في الأحجار القديمة لدينا 4 نوى بتردد 200 ميجاهرتز ، وأداء 800 MIPS ، وهو أمر مثير للإعجاب. يمكن استخدام هذه القوة بطرق مختلفة ، لكن التطبيق الرئيسي هو أنظمة معقدة خوارزميًا ، على سبيل المثال ، مقوم Vienne أو أي شيء آخر. أيضًا على وحدة تحكم واحدة ، يمكنك تنفيذ نظام التحكم بالكامل لآلة CNC ، على سبيل المثال ، الطحن أو قطع اللهب للمعدن.
وضع اللمسات الأخيرة على لوحة التصحيح
عندما تتلقى صندوقًا يحتوي على لوحة تصحيح ، ستجد الكوارتز والمكثفات المفقودة إليه. ليست ضرورية ، ولكن من المستحسن تناول المنشطات. لم يعد لدي كوارتز في HC-49 ، لذلك كان علي الاقتراض من صديق. يختار AVR و STM ، لذلك وجد 8 ميجا هرتز فقط. ملحوم. أضفت 22 مكثف pF من الذاكرة القديمة ، كما فعلت في ميجا في المدرسة.
هذا الحل ليس الأفضل وهو مرتبط بتكوين PLL. الحد الأقصى لمضاعف PLL هو X12 (يمكن أن يكون أكثر ، ولكن لا يوصى به ، ويعمل بشكل ملتوي). أقصى تردد 60 ميجا هرتز. القيمة القصوى للمقسم عند خرج PLL هي 3. تردد الكوارتز هو 8 ميجاهرتز. لا يمكنني ضرب 8 في عدد صحيح والحصول على 60. نحن نبحث عن أقرب قيمة إجمالية ، في هذه الحالة 240. أي ضرب 8 في 30 ، ثم قسمة 4 على الحصول على 60 ميغاهيرتز ، ولكن المشكلة هي أن مضاعف x30 PLL غير مقبول ، مقسم / 4 غير متوفر أيضًا. هناك طريقتان للخروج:
- سيئ: اضرب تردد 8 ميجاهرتز في 7 وقسمه على 1 واحصل على 56 ميجاهرتز. يمكنك الضرب في 8 والحصول على 64 ميجاهرتز ، وسوف يعمل بثبات ، ولكن في كلتا الحالتين لا يكون الحد الأقصى 60 ميجاهرتز. ليس هناك ما يكفي من الكمالية ، للأسف. لدي فقط مثل هذا الخيار ، ملحوم 8 ميجاهرتز وأدلى بتردد 56 ميجاهرتز.
- جيد: اذهب وشراء الكوارتز عند 10 أو 20 ميجاهرتز (أفضل من 10) واضربه في 6 ، حسنًا ، اقسمه على 1 ، نحصل على 60 ميجاهرتز عزيز. أنا أعيش خارج المدينة وبصراحة كان كسولًا جدًا للذهاب إلى متجر محلي ، حيث لا توجد حقيقة أن هناك 10 ميجا هرتز كوارتز. بالطبع ، سيتم استخدام كل من الدائرة RC الداخلية والكوارتز 8 MHz للتدريب ، ولكن في مشاريعك المستقبلية ، ضع الكوارتز 10 MHz ، وليس المسوخ الضخم في حزمة HC-49.
العمارة والميزات الطرفية
كل ما سيحدث بعد ذلك ينطبق على وحدة تحكم TMS320F28027. للبدء ، دعنا فقط نلقي نظرة على الهيكل المأخوذ من
ورقة البيانات :

أول شيء يجب الانتباه إليه هو أن ذاكرة الوصول العشوائي مقسمة إلى 3 قطاعات: M0 و M1 و SARAM. أحجام قطاعات الذاكرة هذه في حالتنا هي 1k و 1 k و 4 k. وتجدر الإشارة إلى أن الكلمة في هذه الحالة ليست 8 بتات ، ولكن 16 بتة ، أي في شكل مألوف أكثر من 2 كيلو بايت + 2 كيلو بايت + 8 كيلو بايت. تكمن خصوصية هذه الوحدة في أن القطاعين M0 و M1 أسرع من 8 كيلوبايت المتبقية من ذاكرة الوصول العشوائي. رسميا ، يمكنك أن تأخذ هذا كذاكرة تخزين مؤقت. عادةً ما يقوم القطاعان M0 و M1 بتخزين البيانات الأكثر استخدامًا ، بالإضافة إلى البيانات الأكثر أهمية لأداء الذاكرة. بشكل افتراضي ، يمكننا استخدام الرابط لتحديد ما يتم تخزينه وأين يتم تخزينه ، لكنني لن أثير هذا الموضوع في هذه المقالة ، وهنا هناك حاجة إلى مقال منفصل على الأقل.
الميزة الثانية المهمة هي أن جميع الأجهزة الطرفية يتم تسجيلها على مدار الساعة من ناقل النظام ، أي من 60 ميجاهرتز (في حالتي ، 56 ميجاهرتز). كمثال ، سأعطي وحدات التحكم الدقيقة STM32 ، حيث يكون التردد الأساسي ، على سبيل المثال ، 180 ميجاهرتز لـ F4 ، ولكن يتم تسجيل الأجهزة الطرفية من خلال سلسلة من الفواصل. أسمي هذا النهج "مزيف ميجا هرتز" لنفسي ، على الرغم من أن هذا مبالغ فيه للغاية. لذلك ، لا يختلف 60 ميجا هرتز لـ TMS320F28 و 180 ميجا هرتز لـ stm32 ، وإذا تذكرت وجود CLA ، فإن 60 + 60 ميجا هرتز قابلة للمقارنة على الأقل. من الواضح أن هذه المقارنة ليست صحيحة ، لكنها توضح بوضوح أنه ليس فقط ميغاهيرتز سئمت.
أيضا نقطة مثيرة للاهتمام - الانتباه إلى الهيكل العام: HRPWM ، ADC ، والمقارنات مع DAC الداخلية ، وحدة معالجة التشفير (eCAP) ... محول تردد جاهز مع التحكم في ناقلات في شكله النقي! هذا هو جوهر هذه الأسرة - بساطتها. من ناحية ، فإن المحيط ضعيف للغاية مقارنة باللحاء ، ولكن من ناحية أخرى ، يكفي تنفيذ استجابة التردد ، dc / dc ، dc / ac ، ومحرك السائر. ونتيجة لذلك ، يعد العمل مع وحدات التحكم TMS320F28 أمرًا بسيطًا للغاية ومفهومًا ولا يتم تحميله بإجراءات غير ضرورية. ولكن إذا كنت بحاجة فجأة إلى 3 UARTs ، ولهم زوج من i2c و 3 SPIs أخرى ، فإن وحدات التحكم هذه ليست بالتأكيد لك - لديهم مهام مختلفة.
بيئة التنمية
هل نظرت إلى شعار البداية؟ تذكرها. إذا قررت البدء في استخدام المقالات في تطوير أبطال المقالة ، فإن هذا البرنامج هو كل شيء لك ، وكما ترى ، فإن
البرنامج يسمى controlSUITE .
هذا التطبيق عبارة عن مجموعة ومكتبة لكل ما تحتاجه لتطوير برامج لعائلة وحدات التحكم C2000. تثبيت هذا التطبيق هو أول ما يجب القيام به ورؤية تكوينه ، فهو يحتوي على:
- وصف جميع وحدات التحكم الموجودة ولوحات التصحيح بناءً عليها. مصادر الدوائر ، لوحات الدوائر المطبوعة ، BOMs بشكل رئيسي في Altium Designer
- أمثلة على الدوائر وتصميم لوحات الدوائر المطبوعة
- المكتبات الأساسية لتطوير البرامج الثابتة
- مكتبات الرياضيات و DSP ، بما في ذلك للاستخدام مع CLA
- مثال على مشاريع البرامج لكل نوع من الأجهزة الطرفية
- عدد كبير من apnouts لتنفيذ معظم الخوارزميات للتحكم في المحركات ومحولات dc / dc ووحدات تحكم MPPT وأنظمة أخرى
- مجموعة من البرامج التي تسمح لك بإنشاء نظام إدارة المحرك بدون برمجة على الإطلاق ، ببساطة باستخدام بيئة رسومية
- IDE نفسها ، التي سيتم تطويرها
كل ما وصفته أعلاه موجز ومتواضع للغاية. سوف يستغرق الأمر بضعة أسابيع لرؤية والتمرير على الأقل قطريًا. بالطبع ، لن تحتاج إلى معظم هذه الكمية من البيانات في البداية ، ولكن عليك أن تتذكر إلى أين تذهب إذا كان هناك شيء غير مفهوم لك وغريب.
الآن ما سنعمل معه اليوم هو IDE ، الذي يعتمد جزءه البياني على أساس الكسوف المعروف. المترجم ليس من دول مجلس التعاون الخليجي ، لكنه من تكساس ، وهو في رأيي الشخصي هو بالتأكيد أفضل من الأول. على الرغم من وجود شكوك في أن هذا مخدر تمامًا كل نفس دول مجلس التعاون الخليجي. تسمى بيئة التطوير
Code Composer Studio ، الإصدار الحالي 7.4.
إنشاء المشروع
في البداية ، كنت أرغب في تنفيذ مهمة مماثلة للمقالة الأولى ، وهي رسم شرط. من حيث المبدأ ، في إطار مقال واحد ، كان من الممكن القيام بذلك تاركًا وراء الإطار حجمًا كبيرًا جدًا من الأشياء الصغيرة ، ولكن كما تعلمون ، فإن الجوهر هو بالضبط في الأشياء الصغيرة. هناك العديد من المقالات على TMS على الإنترنت ، لكنها كلها سطحية للغاية وتصل إلى نوع "نسخ هذا وكل شيء يعمل" ، أي أن العملية نفسها والأيديولوجية لا يتم النظر فيها على الإطلاق. لذلك ، في إطار هذه المقالة ، سنقوم بإنشاء مشروع ، وتنظيفه من المكونات غير الضرورية ، وتكوين البرامج الثابتة في ذاكرة فلاش وحدة التحكم وتعلم كيفية العمل مع GPIO ، وهي مثيرة للاهتمام هنا.
قم بتنزيل CCS7 من موقع الشركة المصنعة ، وقم بتثبيت المشروع وابدأ في إنشائه بالطريقة المعتادة:
File → New → CCS Project ...نرى هذه النافذة ونحتاج فيها إلى تحديد وحدة التحكم التي تهمنا ، في حالتي هي TMS320F28027 ، تشير إلى اسم المشروع وتصف المسار الذي سيتم تخزينه فيه. تحتاج أولاً إلى إنشاء مجلد حيث سيتم تخزين المشروع. قد لا يتطابق اسم المشروع واسم المجلد. انقر فوق الزر "
إنهاء" ويتم إنشاء مشروعنا.
الآن أنت بحاجة لملء مشروعنا بالمحتوى وربطه. قبل ذلك ، لتحسين بنية المشروع ، أنشئ هذه المجموعة من المجلدات:
- inc - مجلد يحتوي على كافة ملفات الرأس
- system_inc - سيقوم هذا القسم بتخزين ملفات رؤوس المكتبات القياسية ، والملفات التي سننشئها بأنفسنا ، على سبيل المثال ، main.c موجودة في المجلد inc. هذا لن يكسر شيئًا دون تفكير أو يزيل ما هو غير ضروري
- src - مجلد بكل المصادر
- system_src - مجلد يحتوي على ملفات مصدر للمكتبات القياسية
يرجى ملاحظة أن هذه البنية ليست نوعًا من العقيدة ، ولكنها ليست سوى فكرتي في الطلب. على الرغم من أنني سأوصي بها للأشخاص ذوي الخبرة القليلة ، إلا أنك ستغيرها بمرور الوقت لتناسب رؤيتك للعالم ، ولكن في الوقت الحالي سيقلل هذا من عدد عضادات.
الآن قم بإنشاء ملف main.h في المجلد inc وقم بتوصيله بملف main.c. من خلال ذلك سيتم ربط المكتبات الأساسية. وقبل البدء في نقل المكتبات والملفات الأخرى ، دعنا نكتب المسار إلى المجلدات حيث سيتم تخزين ملفات رؤوسنا المستقبلية في إعدادات المشروع. للقيام بذلك ، انقر بزر الماوس الأيمن على المشروع (اختبار) في شجرة المشروع وانقر على
خصائص في الأسفل أو اضغط على
Alt + Enter . في النافذة التي تفتح ، انتقل إلى
Build → C2000 Compiler → Include Options وهنا نحتاج إلى مسارين حاليين - قم بتسجيل المسار إلى مجلدي inc و system_inc. انقر فوق
إضافة ، ثم
مساحة العمل ثم إلى المجلد inc المطلوب ، ثم قم بالشيء نفسه والتشبث بالمجلد الثاني. وبالتالي ، فقد وصفنا المسارات النسبية ؛ عند نقل مشروع ، لن تضطر إلى إعادة تكوين أي شيء. ونتيجة لذلك ، نحصل على مثل هذه الصورة وانقر فوق
موافق :

الآن لدينا مشروع فارغ مع المسارات المحددة والإعدادات الأخرى ، يبقى فقط لملئه بالمكتبات. الشيء الوحيد الذي يجب فعله هو التحقق مما إذا كان كل شيء متصلاً. من الناحية النظرية ، يجب أن تحصل على مثل هذا الرمز والصورة ، وتجميع المشروع. للقيام بذلك ، اضغط
CTRL + B أو انتقل إلى
Project → Build All في الأعلى. يجب أن يتم تجميع المشروع دون أخطاء وأن يبدو هكذا (الصورة قابلة للنقر):

الآن دعونا نتحدث قليلاً عن الرابط. في البداية ، عند إنشاء مشروع ، يقوم IDE بإنشاء الملف
28027_RAM_lnk.cmd ، ويضع برنامجنا في ذاكرة الوصول العشوائي أثناء تصحيح الأخطاء والبرامج الثابتة. هذا مناسب عندما نقوم بالتصحيح ، لأن لا يتم إهدار موارد ذاكرة فلاش ودخول التصحيح في ذاكرة الوصول العشوائي أسرع بكثير. ولكن ماذا لو أردنا أن نخيط في فلاش؟ للقيام بذلك ، هناك ملف ارتباط آخر سيضع برنامجنا في فلاش. سأظهر هذا الخيار.
بادئ ذي
بدء ، احذف الملف
28027_RAM_lnk.cmd . كما قلت -
controlSUITE هو كل شيء لدينا. نفتحه. اذهب الآن
الإنجليزية → الجهاز → Piccolo F2802x → المكتبات الداعمة → ملفات الرأس لـ F28027x . على اليمين نرى المجلدات - هذه هي المكتبات القياسية وكل ما هو مطلوب ، بما في ذلك الروابط. الآن نذهب إلى المجلد
f2802x_common → cmd وهنا نرى مجموعة من الروابط لجميع الأحجار في الخط. ليس من الصعب تخمين ملفات _RAM لتحميل الرمز إلى ذاكرة الوصول العشوائي ، وبدون هذه العلامة للتحميل عبر الفلاش. نأخذ الملف
F28027.cmd وننسخه إلى مشروعنا بدلاً من الرابط البعيد البعيد.
حان الوقت الآن لترحيل المكتبات نفسها. نذهب إلى
مصدر المجلد
f2802x_common → ونرى مجموعة من الملفات. هناك نوعان من المكتبات: السجلات القياسية (على غرار CMSIS) ونوع من SPL. في هذه الحالة ، نحن مهتمون فقط
بالعرض الأول ، أي الملفات ذات البادئة
f2802x_ . بالطبع ، يمكنك سحبهم جميعًا في مشروعنا ، ولكن لماذا تسدهم إذا لم نستخدم كل شيء؟ إذا كنت بحاجة إلى شيء ما ، فإننا نضيفه في المستقبل. في الوقت الحالي ، نقصر أنفسنا على مجموعات الملفات التالية:
- f2802x_codestartbranch.asm
- f2802x_defaultisr.c
- f2802x_piectrl.c
- f2802x_pievect.c
- f2802x_sysctrl.c
نقوم بنسخ ملف البيانات ولصقه في مجلد
system_src . الآن نذهب إلى المجلد
f2802x_headers → المصدر ونأخذ الملف
F2802x_GlobalVariableDefs.c من هناك
وننسخه مرة أخرى إلى مجلد
system_src . بعد ذلك ، انتقل إلى مجلد
f2802x_headers → cmd ونسخ ملف
F2802x_Headers_nonBIOS.cmd من هناك إلى نفس المجلد. يؤدي هذا إلى إكمال ملء مجلد
system_src والمتابعة إلى الرؤوس.
نذهب إلى المجلد
f2802x_headers → تضمين ونسخ جميع الملفات من هناك إلى مجلد
system_inc . ننتقل الآن إلى مجلد
f2802x_common → مصدر ونسخ الملفات من هناك:
- f2802x_examples.h
- f2802x_globalprototypes.h
- f2802x_i2c_defines.h
- f2802x_epwm_defines
- f2802x_swprioritizedisrlevels.h
- f2802x_defaultisr.h
يجب أن نحصل على هذه الصورة في شجرة المشروع:
تحتاج الآن إلى توصيل المكتبات الأساسية ، يأخذ الملف
main.h الشكل التالي:
#pragma once #include "F2802x_Device.h" #include "F2802x_examples.h"
نحن نحاول ترجمة. إذا تم تجميع المشروع دون أخطاء وتحذيرات ، فسيتم توصيل كل شيء بشكل صحيح. إذا لم يحدث ذلك ، تحقق جيدًا من كل 10 مرات ، وإذا لم ينجح الأمر على الإطلاق ، فقم بكتابة رسالة إلى رئيس الوزراء - سأساعد ، كما قال Owl:
"Bez-woz-mez-bottom ، أي بدون مقابل" .
تهيئة نظام التحكم والساعة
في هذا القسم ، سنكتب دالة تهيئ موقّت المراقبة وناقلات المقاطعة ، وتضبط إشارات المقاطعة إلى الصفر. قمنا أيضًا بإعداد نظام الساعة ، ونتيجة لذلك ستصبح الكوارتز الخارجية بدلاً من سلسلة RC الداخلية مصدر الساعة ، وتكوين PLL وتمكين تسجيل الوقت لجميع الأجهزة الطرفية.
من أجل دقة الشفرة ، أقترح وضع جميع التهيئة الأساسية في ملف منفصل ، ستكون الواجهة الأمامية لها دالة
إفراغ InitStartSystem (void) . للقيام بذلك ، قم بإنشاء ملفات
systemInitStart.h و
systemInitStart.c . سأكتب على الفور وظيفة ثم نقوم ببساطة بتحليل محتوياتها:
void InitStartSystem (void) { DisableDog(); XtalOscSel(); InitPll(TMS320_PLLCR, TMS320_DIVSEL); InitPeripheralClocks(); InitPieCtrl(); InitPieVectTable(); }
تعتبر كافة الوظائف التي يتم استدعاؤها في
InitStartSystem () قياسية. أنصحك بأن ترى بالتفصيل كيف يتم تنفيذها ، لذلك يمكنك الضغط باستمرار على CTRL والنقر على وظيفة الفائدة. هل نظرت؟ الآن اذهب لفترة وجيزة ...
- DisableDog () - تقوم الوظيفة بإيقاف "الكلب". هذه خطوة إلزامية عند إعداد الجزء الرئيسي من الأجهزة الطرفية الحرجة ، على سبيل المثال ، نظام الساعة. في رمز المكتبة ، غالبًا ما ترى هذا ، سيتم نسخه وتكراره
- XtalOscSel () - تطبق هذه الوظيفة التبديل من مصدر ساعة داخلي إلى كوارتز خارجي. نقطة مهمة! يوجد خطأ في المكتبة القياسية بهذه الوظيفة - لم يتم الإعلان عنها. نذهب إلى الملف f2802x_globalprototypes.h ومن بين جميع الملفات الأخرى ، نضيف السطر الخارجي الفراغ XtalOscSel (void)

النقطة الثانية المهمة! انتقل إلى وظيفة XtalOscSel واحذف وظيفة التأخير.

النقطة الثالثة المهمة! ننتقل إلى الملف f28027x_exmaples.h ونعلق وظيفة تأخير التنفيذ.

- InitPll (TMS320_PLLMUL ، TMS320_DIVSEL) - تقوم الوظيفة بتكوين PLL. يتم نقل قيمتين إليه: المضاعف والمقسوم عليه. يتم تحديد قيمتها في ملف الرأس. نقطة مهمة! نفتح هذه الوظيفة في المكتبة وتحتاج إلى التعليق على التأخير في الأسفل

- InitPll (TMS320_PLLMUL ، TMS320_DIVSEL) - تقوم الوظيفة بتكوين PLL. يتم نقل قيمتين إليه: المضاعف والمقسوم عليه. يتم تحديد قيمتها في ملف الرأس. نقطة مهمة! نفتح هذه الوظيفة في المكتبة وتحتاج إلى التعليق على التأخير في الأسفل
- InitPeripheralClocks () - تتيح هذه الوظيفة ببساطة تسجيل الوقت للمحيط بأكمله. نعم للجميع. C2000 ليس حلاً للغدد التي تعمل بالبطارية ،
لن يلعب هذا الحل من وحدات عشرات المئات من كيلووات و 2-3 mA مثير للشفقة دورًا هنا. حسنًا ، ليس عليك أن تتذكر في كل مرة تقوم فيها بتشغيل الساعة لبعض أنواع SPI أم لا - InitPieCtrl () - تقوم الوظيفة بإيقاف تشغيل جميع المقاطعات وإعادة تعيين إشارات المقاطعة
- InitPieVectTable () - تملأ الوظيفة الجدول بمقاطعات المقاطعة
في الواقع ، هنا كل التهيئة. أعتقد أن الكثيرين لاحظوا "النقاط المهمة" المرتبطة بوظيفة
التأخير . لماذا قطعناها على الكرمة؟ نعم ، كل شيء بسيط - إنه عكاز.
أضاف مهندسو TI هذه التأخيرات غير الضرورية تمامًا إلى بعض الوظائف ، المضافة في التحديثات الأخيرة. لماذا - لغزا ليس لي فقط. التسجيلات والإدخالات الحرجة الأخرى محمية بالفعل ، لذلك لن تجعل وحدة التحكم لدينا غبية. بالمناسبة ، عند التهيئة في إلكترونيات الطاقة ، من المستحيل "الصراخ" على الإطلاق ، وإلا فسيكون من المخنثين. لذلك ، ننسى وظائف
التأخير والشيطانية إلى الأبد ، فقط الموقتات! لا يسمح بالتأخير إلا لبعض الأغراض التعليمية ، على سبيل المثال ، يومض بسرعة مع LED.
من أجل التحقق من أن الرمز يعمل ، فإننا نطلق على وظيفة التهيئة في الرئيسية ، وتجميع ، وفلاش ،
وربط على راسم
الذبذ GPIO18 . هذا الدبوس يشبه MCO لـ STM32 ، مما يعني أنه يخرج تردد النظام. يجب أن يرى المذبذب إشارة بتردد 56 ميجاهرتز. إذا كان الذبذبات جيدًا ، فسترى المتعرج ، إذا كان الصيني (حتى جيدًا) ، فعلى الأرجح سيكون أقرب إلى الجيب. يمكن رؤية ضبط GPIO18 لإخراج تردد النظام في
دالة InitPeripheralClocks () . تحتاج أولاً إلى "توصيل" gpio بمخرجات التردد ، ثم ضبط المقسم على 1:
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 3;
إعداد GPIO
للعمل مع هذه العائلة ، نحتاج فقط إلى دليل مرجعي ، قام مطورو TI بتقسيمه إلى عدة ملفات ، يصف كل منها محيطًا معينًا ، وهو ملائم للغاية. قم بتنزيل ورقة البيانات
هنا وانتقل إلى قسم
دعم الوثائق في الصفحة 126. هنا نرى مجموعة من الروابط إلى الوثائق مع وصفها الموجز: errata ، دليل لبدء إدارة المحرك وأدلة على كل محيط. نحن مهتمون بمستند يسمى
TMS320F2802x / TMS320F2802xx Piccolo System Control and Interrupts Guide Guide ، فهو يحتوي على وصف GPIO وإعدادات النظام الأساسية الأخرى التي تهمنا. نحن ننظر إلى مخطط كتلة GPIO:

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

يظهر مبدأ قراءة حالة المدخلات. في معظم وحدات التحكم ، تتم قراءة حالة الإدخال بتردد ساعة هذا المحيط ، أي بشكل افتراضي بتردد 56 ميجاهرتز في حالتنا ، وبالنسبة لنفس STM في العائلات الأكبر سنًا ، تكون هذه الترددات أعلى. أعتقد أن الجميع يفهم أنه عند هذا التردد يكون لدى المتحكم الوقت "لرؤية" أي تداخل وضجيج. في بعض الأحيان تكون هناك حاجة لمثل هذا التردد ، وأحيانًا لا ، على سبيل المثال ، إذا كنا بحاجة إلى استطلاع زر. لماذا نقابلها كل 18 نانوثانية؟ لذلك ، أدركنا إمكانية تقليل تردد الساعة لمنفذ معين باستخدام سجل
CTRL وبتات QUALPRDx ، حيث تأخذ X قيمة من 0 إلى 3: QUALPRD0 مسؤولة عن GPIO0 ... 7 ، QUALPRD1 مسؤولة عن GPIO8 ... 15 وهكذا. في الواقع ، هذا مقسم تردد عادي بمعامل من 1 إلى 510.

غالبًا ما لا يكون من المنطقي استجواب زر ، لذلك سنقوم بتعديل الفاصل إلى 510 ، أي إلى الحد الأقصى. ننظر مرة أخرى إلى الرسم البياني ونرى أن الإشارة تعتبر ثابتة فقط عندما يكون مستواها دون تغيير لـ 6 علامات. يمكن أن يكون عدد الإجراءات المطلوبة للتثبيت 1 أو 3 أو 6.
كلما زاد حجم الحاجز والمزيد من الدورات التي نصلحها ، زادت حماية الحماية من الثرثرة. عندما يكون هناك ثرثرة من جهات الاتصال ، في البداية ستكون انتقالات فوضوية من 0 إلى 1 والعكس بالعكس ، عندما تمر الثرثرة وتتوقف الإشارة ولا تتغير لمدة 6 علامات ، وهذا يعني أن الزر مضغوط. كل شيء عبقري بسيط.
الآن دعونا نلقي نظرة على السجلات الرئيسية ، لن نلمس المقاطعات - فقط إعدادات المنافذ نفسها. تحتاج أولاً إلى القول بأن السجلات مقسمة إلى نوعين:
سجلات الإعداد وسجلات البيانات . السابق مسؤول عن تكوين الخصائص ، على سبيل المثال ، هذا الإدخال أو الإخراج. المجموعة الثانية مسؤولة عن كتابة وقراءة حالة المنفذ.
سجلات الإعداد:- GPxCTRL - سجل لكتابة مقسم الساعة. بدلاً من "x" نستبدل الحرف "A" - إذا كان لدينا GPIO0 ... 31 ، "B" - إذا استخدمنا GPIO32 ... 63 وهكذا
- GPAQSELx - سجل لتعيين عدد علامات التجزئة لتحديد القيمة عند الإدخال
- GPAMUX1 هو سجل لاختيار الأجهزة الطرفية المتصلة ، على سبيل المثال ، يشير إلى أن GPIO أو UART ، أو ربما PWM ، تأتي إلى القدم.
- GPADIR - سجل اختيار اتجاه GPIO: الإدخال أو الإخراج. بشكل افتراضي ، يتم تكوين جميع المنافذ للإدخال.
- GPAPUD هو السجل المسؤول عن توصيل الحمالة الداخلية بـ VCC.
تجدر الإشارة إلى أنه في بعض المنافذ ، يتم إيقاف تشغيل السحب بشكل افتراضي ، ويتم تشغيل جزء منه.
من المهم أن نتذكر!
سجلات البيانات:- GPADAT - سجل حالة الإخراج. إذا تم تكوين الإخراج للإدخال ، فإننا نقرأ منه حالة الإدخال. إذا تم تكوينه لإخراج ، فيمكننا كتابة القيمة التي يجب أن يأخذها هذا الإخراج ، أي 0 أو 1
- GPASET - تسجيل ضبط الإخراج على "1". للتعيين على "1" ، يجب عليك كتابة "1" ، عند كتابة "0" يتم تجاهل الأمر
- GPACLEAR - سجل تعيين الإخراج إلى "0". للتعيين على "0" ، يجب عليك كتابة "1" ، عند كتابة "0" يتم تجاهل الأمر
- GPATOGGLE هو سجل يعكس القيمة الحالية لحالة الإخراج. لعكس القيمة ، اكتب "1" ؛ عند كتابة "0" ، يتم تجاهل الأمر
هذه مجموعة بسيطة من السجلات. حتى من الوصف أعلاه ، يمكنك بالفعل فهم ما يجب القيام به لتكوين المنفذ ، لكن المهندسين المتعقلين أو الكتاب الفنيين من TI قاموا بتعليمات أخرى خطوة بخطوة:

سأقول على الفور أن الخطوتين 6 و 7 ليست ضرورية لنا ، لأن لا يتم استخدام الكلب ولا المقاطعة في هذه المقالة. سأصف الخطوات المتبقية بإيجاز للأشخاص الذين درسوا اللغة الألمانية في المدرسة:
- الخطوة 1 - تحديد وظيفة الإخراج: أنها ستكون مدخلات أو مخرجات ،
gpio أو الإخراج إلى الأجهزة الطرفية والأشياء الأخرى - الخطوة 2 - تمكين أو تعطيل السحب الداخلي
- الخطوة 3 - تكوين حماية تسجيل الوقت والارتداد لمنفذ معين
- الخطوة 4 - حدد الوظيفة المطلوبة: gpio أو الأجهزة الطرفية
- الخطوة 5 - تحديد اتجاه الإخراج: الإدخال أو الإخراج
هذا هو الإعداد بأكمله ، كما ترى ، فهو أساسي وواضح منطقيًا. أريد أن ألاحظ على الفور أنه ليس من الضروري في هذا الترتيب أن تقوم بإعدادات ، على سبيل المثال ، يمكنك تعيين الاتجاه (الإدخال أو الإخراج) من خلال الخطوة الأولى. لا يهم.
مهم للغاية!عند العمل مع السجلات في عائلة C2000 ، من الضروري مراعاة اللحظة التي تكون فيها محمية. ينطبق كل ما هو موضح أدناه بشكل أساسي على سجلات مجموعة التكوين. إذا نظرت بعناية إلى الوظائف القياسية ، فربما رأيت أوامر غريبة هناك:
EALLOW؛ و
EDIS ؛ . أمر
EALLOW - يزيل الحماية ويوفر الوصول للعمل مع سجلات النظام. أمر
EDIS - يتيح حماية الظهر ويوفر الوصول للعمل مع سجلات النظام. أي أن أي عمل مع سجلات النظام يجب أن يبدو دائمًا كما يلي:
EALLOW;
مثل هذه العملية غير مطلوبة إذا عملنا مع سجلات البيانات ، على سبيل المثال ، إذا قمنا بضبط
مخرجاتنا على "1" باستخدام سجل
GPxSET ، فإننا لا نحتاج إلى إزالة الحماية منه ، وبالتالي إعادة تشغيله. توضح الوثائق في كل مكان ما يلزم حمايته وما هو غير ذلك ، على سبيل المثال ، مثل هذا:

استنادًا إلى كل ما سبق ، فلنقم بتكوين GPIO0 ... 3 مع مصابيح LED للإخراج. أقترح وضع جميع إعدادات GPIO في وظيفة
InitLEDgpio وكتابتها:
void InitLEDgpio (void) { EALLOW; GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; GpioCtrlRegs.GPADIR.bit.GPIO3 = 1; EDIS; }
بشكل افتراضي ، يتم تكوين GPIOs بالفعل على أنها GPIOs ، مثل يتم مسح جميع قيم التسجيل ، مما يعني أن "0" مكتوب بالفعل في سجل GPAMUX1. بالنسبة لـ GPIO0 ... 11 ، يتم تعطيل السحب بشكل افتراضي ، لذلك يمكننا فقط أخذ اتجاه العمل وتحديده إلى الإخراج باستخدام GPADIR. إذا كنت تتذكر ، يتم توصيل مصابيح LED بوحدة التحكم عن طريق الكاثودات ، مما يعني أنه بعد التهيئة مباشرة سوف تتوهج. دعنا نضع هذه الاستنتاجات مباشرة في وظيفة التهيئة على "1":
void InitLEDgpio (void) { EALLOW; GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; GpioCtrlRegs.GPADIR.bit.GPIO3 = 1; EDIS; GpioDataRegs.GPASET.bit.GPIO0 = 1; GpioDataRegs.GPASET.bit.GPIO1 = 1; GpioDataRegs.GPASET.bit.GPIO2 = 1; GpioDataRegs.GPASET.bit.GPIO3 = 1; }
كما ترون ، لا
أستخدم سجل
GPADAT للكتابة ، ولكن استخدم
SET ، CLEAR ، TOGGLE . لاحظ أيضًا أنني أجريت هذا الإدخال خارج المنطقة المحمية ، أي بعد أمر
EDIS . الآن ، في نفس الوظيفة ، قم بتكوين GPIO12 للعمل مع الزر وإضافة وظيفتنا:
void InitLEDgpio (void) { EALLOW; GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; GpioCtrlRegs.GPADIR.bit.GPIO3 = 1; GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1; GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF; GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 2; EDIS; GpioDataRegs.GPASET.bit.GPIO0 = 1; GpioDataRegs.GPASET.bit.GPIO1 = 1; GpioDataRegs.GPASET.bit.GPIO2 = 1; GpioDataRegs.GPASET.bit.GPIO3 = 1; }
بادئ ذي بدء ، أوقف التشديد الداخلي بكتابة "1" في سجل
GPAPUD ، لأنه يتم تمكينه بواسطة GPIO12 بشكل افتراضي. كما كتبت سابقًا ، يتم تكوين جميع المنافذ بعد التهيئة للإدخال ، مثل الأصفار مكتوبة في سجل
GPADIR ، نحن لا نقوم بتكوينه هنا.
يبقى لتكوين الحماية ضد الارتداد ، لأننا نقسم الفواصل
0xFF ، والتي تتوافق مع القيمة / 510. في السجل
GPAQSEL1 نكتب القيمة "10" أو 2 ، والتي تحدد القيمة على عينة من 6 مقاييس. انتهى! لقراءة قيمة إدخال معين ، ما عليك سوى قراءة القيمة من سجل
GPADAT :
if (GpioDataRegs.GPADAT.bit.GPIO12) {
هكذا نستجوب الاستنتاجات الضرورية. الآن دعنا نسمي وظيفة تكوين gpio في وظيفتنا الرئيسية ونحصل على شكلها النهائي:
void InitStartSystem (void) { DisableDog(); XtalOscSel(); InitPll(TMS320_PLLMUL, TMS320_DIVSEL); InitPeripheralClocks(); InitPieCtrl(); InitPieVectTable(); InitLEDgpio(); }
الآن نسمي وظيفة
InitStartSystem في النص الرئيسي للبرنامج بشكل رئيسي وهذا يكمل التكوين. نحصل على الكود التالي:
#include "main.h" int main (void) { InitStartSystem(); while(1) { } }
حان الوقت لكتابة أول برنامج اختبار لدينا واختبار هذا الأمر برمته. الخوارزمية هي: ضوء LED الموجود على GPIO3 يومض ، وعندما تضغط على الزر في GPIO12 ، فإننا ببساطة نضيء LED GPIO0. وبالتالي ، سوف نتحقق من تشغيل المنافذ لكل من المدخلات والمخرجات. نكتب الكود التالي:
#include "main.h" int main (void) { InitStartSystem(); while(1) { if (GpioDataRegs.GPADAT.bit.GPIO12) { GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; } else { GpioDataRegs.GPASET.bit.GPIO0 = 1; } GpioDataRegs.GPATOGGLE.bit.GPIO3 = 1; delay(100000); } }
نحن نجمع ، نذهب إلى المصحح ، نبدأه ونرى كيف يومض مصباح LED باستمرار ، وعندما تضغط على الزر ، يضيء مصباح آخر. في نهاية القسم ، سأرفق مشروعًا بهذا الرمز ، إذا لم ينجح شيء ما ، فابحث فيه. خاصة لأولئك الذين يجدون صعوبة في النصوص أو لم يفهموا جميع النقاط ، أقترح مشاهدة هذا الفيديو حول العمل مع GPIO ، كل شيء يحدث هناك ، كما هو الحال في قسم "GPIO". أحذركم من أن الفيديو لمدة ساعة ، كئيب ، طويل ، لكن مفصل قدر الإمكان وكل شيء مرئي:
ملفات من المقال
- أرشفة مع مشروع تحميل CCS7 هنا
- يمكنك رؤية الرمز على جيثب
الملخص
في هذه المرحلة ، أختتم مقال اليوم. أعتقد أنك فهمت أنه إذا قررت على الفور إظهار تنفيذ DC / AC للعاكس ، فستكون المقالة أكبر عدة مرات أو ستبقى العديد من التفاصيل المهمة ببساطة خلف الكواليس ، وهو في رأيي غير مقبول.
آمل أن تساعد مقالتي الجميع على البدء في تطوير عائلة وحدات التحكم هذه وبدء التطوير في مجال إلكترونيات القوى والأدوات الآلية. في المستقبل ، ربما سأكتب شيئًا آخر حول هذا الموضوع ، على سبيل المثال ، أود التفكير في العمل مع PWM أو تطبيق نوع من الخوارزمية. الشيء الرئيسي هو الحصول على الوقت.
إذا كان لديك أي أسئلة أو إذا كان هناك شيء لا يعمل معك ، يمكنك مراسلتي في رسائل خاصة وسأحاول الإجابة على أسئلتك وتقديم كل المساعدة الممكنة في الدراسة. أتمنى لك التوفيق في التدريب!
UPD شكرا
للنصيحة من
BelerafonL على كتاب
"أنظمة التحكم الرقمية المدمجة عالية الأداء"