قدرات وحدة EPWM
- يمكن أن تعمل مخرجات EpwmA epwmB على النحو التالي:
- عملية أحادية الحافة
- عملية متماثلة مزدوجة الحافة
- عملية مزدوجة الحافة غير المتماثلة
- يمكن تكوين الوقت الميت
- يمكن تكوين حدث TZ ويمكن ضبط الحالة المنطقية لكل من مخرجات HI و LO.
- يمكن تكوين حدث مقاطعة أو حدث SOC لـ ADC.
دعنا نقترب أكثر من الكتل الرئيسية: ما تتكون منه وحدة ePWM وما الذي تتصل به.
كما ترى من الشكل ، لا توجد العديد من الكتل في وحدة ePWM. لذلك ، من المنطقي النظر في مسؤولية كل وحدة والبدء بالإشارات.
- من المحتمل أن تكون إشارات EPWMxA و EPWMxB هي إشارات الإخراج الأكثر وضوحًا. الحالة المنطقية العادية هي إما HI أو LO ، اعتمادًا على كيفية تكوين إجراء الإخراج
- TZ1 — TZ6 — . , , , . , EPWMxA EPWMxB . , , - , , . . , .
- EPWMxSYNCI EPWMxSYNCO — , , .
- إشارات EPWMxSOCA و EPWMxSOCB - هنا كل شيء أكثر وضوحًا من الاسم. يمكن لهذه الأحداث تعيين أحداث SOC لـ ADC.
- إشارات EPWMxTZINT و EPWMxINT - هنا حدث مقاطعة على TZ والأحداث المتعلقة بـ PWM نفسها ، على سبيل المثال ، إنشاء مقاطعة في فترة PWM.
الآن دعنا ننتقل إلى
وحدات قاعدة الوقت (TB) - الوحدة مسؤولة عن وقت الحدث لكل وحدة ePWM. لن ندخل في جميع إعدادات هذه الوحدة ، أعتقد أنه يكفي الانتباه إلى حقيقة أن هناك 3 أوضاع لتشغيل العداد:
- وضع Up-Down-Count
- وضع Up-Count
- وضع العد التنازلي
وأيضًا هناك إعداد مزامنة مؤقت من خلال ضبط
وحدة بت مقارنة عداد TBCLKSYNC (CC) - من خلالها قمنا للتو بتعيين دورة عملنا.
وحدة مؤهل الإجراء (AQ) - من خلالها يمكنك تكوين الحالة لحدث ما. وبالنسبة للمخرجات ، يمكنك تكوين الإجراءات التالية:
- اضبط على حالة HI
- اضبط على حالة LO
- أداء انعكاس الحالة
- لا شيء لأفعله
وحدة Dead-Band Subodule (DB) - يمكن استخدام هذه الوحدة لتعيين نطاقات ميتة لقنوات PWM. لن يخفى على أحد أن مفاتيح الترانزستور لا يتم تبديلها على الفور ، ومن أجل تجنب الموقف عندما لا يكون لمفتاح الجسر العلوي وقتًا للإغلاق ، ويكون المفتاح السفلي مفتوحًا بالفعل ، فقد قاموا بتعيين تأخير للتبديل إلى حالة HI والتبديل المبكر إلى حالة LO.
وحدة الوحدة الفرعية لمنطقة الرحلة (TZ) - كما ذكر أعلاه ، ترتبط هذه الوحدة بالتعامل مع حالات الطوارئ. هنا يمكننا اختيار 1 من 4 إجراءات.
- اضبط على حالة HI
- اضبط على حالة LO
- تعيين حالة مقاومة عالية
- لا شيء لأفعله
يمكن تشغيل الحدث الذي يؤدي إلى تشغيل وحدة TZ بواسطة كل من البرامج والأجهزة. بالإضافة إلى ذلك ، يتم توفير مكالمة مقاطعة.
الآن دعنا ننتقل من الكلمات إلى الممارسة.
أولاً ، تحتاج إلى تكوين GPIO لوظيفة epwm بديلة
EALLOW;
// pull-up
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0x000;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0x000;
// GPIO EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0x001;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0x001;
EDIS;
بعد ذلك ، عندما نكون قد قمنا بالفعل بتكوين GPIO ، يمكننا متابعة الإعدادات المختلفة. لتكوين عملية PWM ، عليك أن تقرر ما نريد الحصول عليه. لنبدأ بتردد TBCLK. يتم تحديده بواسطة الصيغة:
هنا تحتاج إلى الانتباه إلى حقيقة أن CLKDIV هي 1 افتراضيًا ، مع HSPCLKDIV كل شيء مختلف ، افتراضيًا هو 2. يجب أن يؤخذ هذا في الاعتبار ، حيث توجد أوقات ينسى فيها الناس ذلك. عند تحميل برنامج في ذاكرة الوصول العشوائي ، غالبًا ما يكون HSPCLKDIV = 1 ، على التوالي ، لا يتم ملاحظة هذه المشكلة على الفور.
لقد قررنا تردد ساعة TBCLK. لكن سيتعين علينا اختيار كيفية عمل العداد بالنسبة لنا. عن طريق الركود ، عن طريق الزيادة ، وربما بهذه الطريقة وذاك ، لهذا تحتاج إلى تكوين السجل المناسب ، على سبيل المثال:
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
في المستقبل ، حتى لا يخيف أحد من وحدات الماكرو ، سنحدد من أين أتوا على الإطلاق. يتم تعريف هذه التعريفات في ملف يسمى DSP2833x_EPwm_defines.h.
ثم عليك أن تقرر كيف ستتفاعل GPIOs الخاصة بنا للوصول إلى قيم TBCTR معينة. هناك أكثر من خيارات كافية. وهي موضحة في الجدول أدناه:
ثم عليك أن تقرر السلوك الذي نريده من المنفذين A و B ، أي أننا نريدهما أن يكونا متصلين ببعضهما البعض أو أن نكون قادرين على العمل بشكل مستقل. إذا أردنا أن يكون المنفذ A هو الرئيسي ، فإننا ببساطة نكتب الإجراءات الخاصة به ، على سبيل المثال (حالة العد التصاعدي):
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
إذا كنا نريد استقلال الميناء الثاني ، نضيف:
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
لمزيد من التفاصيل حول الإعدادات ، تحتاج إلى الرجوع إلى الصورة أعلاه لإضافة واحدة فقط ، وهناك عدد أكبر قليلاً من سجلات AQCTLA مما هو موضح في الجدول ، وهذا لا يغير الصورة كثيرًا ، ولكن يتم تقديم تفاصيل فقط بخصوص هذه الحالة وصل العداد إلى القيمة المطلوبة ، على سبيل المثال ، عند العد في أعلى أو العد التنازلي. يمكن العثور على مزيد من المعلومات حول البتات في المقطع من ملف .h الخاص بالنظام
struct AQCTL_BITS { // bits description
Uint16 ZRO:2; // 1:0 Action Counter = Zero
Uint16 PRD:2; // 3:2 Action Counter = Period
Uint16 CAU:2; // 5:4 Action Counter = Compare A up
Uint16 CAD:2; // 7:6 Action Counter = Compare A down
Uint16 CBU:2; // 9:8 Action Counter = Compare B up
Uint16 CBD:2; // 11:10 Action Counter = Compare B down
Uint16 rsvd:4; // 15:12 reserved
};
إذا كان لدينا منفذا ePWM يعملان بشكل مستقل ونريد ضبط الوقت الميت ، فنحن بحاجة إلى ضبط السجل على الحالة المطلوبة ، على سبيل المثال:
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
الآن وقد قررنا وصف المحيط ، يمكننا المضي قدمًا في أمثلة محددة.
تكوين ePWM في وضع العد
فيما يلي مثال بدون وقت ميت ويعمل المنفذ A والمنفذ B بشكل مستقل. عندما يكون A نشطًا ، يكون B غير نشط.
EPwm1Regs.TBPRD = 150000 / 5; // . 150 / 5000
// 50%
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;
EPwm1Regs.TBPHS.half.TBPHS = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;
على مخطط الذبذبات ، يمكنك رؤية النتيجة التي تم الحصول عليها:
الآن يمكنك محاولة إضافة الوقت الميت ، لذلك نضيف:
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.all = BP_ENABLE + POLSEL_ACTIVE_HI_CMP; // db
EPwm1Regs.DBFED = 300; // = 150 * 2 = 300
EPwm1Regs.DBRED = 300;
يحسب الوقت الميت بنفس طريقة التكرار ، حسب الصيغة:
والآن أصبح لدينا وقت ميت بالطريقة التي أردناها ،
ماذا لو احتجنا إلى فك المنفذ A والمنفذ B؟ هذا يحدث أيضا. كل شيء بسيط هنا. نعود إلى المثال الأول ونحذف آخر 4 سطور ، ونكتب كل دورة عمل في السجلات التالية.
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2; // 50%
EPwm1Regs.CMPB = EPwm1Regs.TBPRD / 3; // 33%
الآن لدينا مثل هذه الصورة. يمكنك ضبط دورة العمل لكل قناة على حدة.
بالنسبة لوضع الاضمحلال ، كل شيء متماثل تقريبًا. يوجد اختلاف مع العد التنازلي في الوضع التصاعدي. هنا يتم حساب تردد الرقائق باستخدام الصيغة:
وينطبق الشيء نفسه على الوقت الميت.
ربما يكون الشيء الوحيد المهم الذي لم يتم النظر فيه هو إعداد TZ ، حسنًا ، دعنا الآن نتناول هذه الوحدة بمزيد من التفاصيل.
لتشغيل حدث إنذار برمجيًا ، يكفي تكوين السجلات التالية:
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
يمكن استدعاء إنذار PWM وإعادة ضبطه باستخدام الأوامر التالية:
//
EALLOW;
EPwm1Regs.TZFRC.bit.OST = 0x001;
EDIS;
//
EALLOW;
EPwm1Regs.TZCLR.bit.OST = 0x0001;
EDIS;
إذا أردنا استدعاء إشارة TZ في الجهاز ، فكل شيء أسهل ، من خلال سجل TZSEL ، قمنا بتعيين TZ الذي نحتاجه ، ولكن بالإضافة إلى ذلك ، نحتاج إلى تكوين GPIO إلى TZ.
خاتمة
إذا وجد شخص ما هذه المقالة مثيرة للاهتمام ، فيمكنني كتابة مقالتين إضافيتين بطريقة متسارعة إلى حد ما. أخطط للنظر في وحدة العلبة ، وأود أن أذكر dma ، وربما سأكتب أيضًا مقالًا صغيرًا عن IQMath من ti مع مكتباتهم.