نتعامل مع وحدة PWM على tms320

مساء الخير. قرأت منذ بعض الوقت أن شخصًا ما أراد أن يدرس السؤال بشكل أعمق حول وحدة ePWM على mk tms320f28xxx ، لذلك قررت لماذا لا أكتب مقالة حول هذا الموضوع سأحاول فيها مضغ هذه الوحدة بالتفصيل باستخدام مثال tms320f28335 ...



قدرات وحدة 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%  


الآن لدينا مثل هذه الصورة. يمكنك ضبط دورة العمل لكل قناة على حدة.







بالنسبة لوضع الاضمحلال ، كل شيء متماثل تقريبًا. يوجد اختلاف مع العد التنازلي في الوضع التصاعدي. هنا يتم حساب تردد الرقائق باستخدام الصيغة:

تيبصرد=تيبجإلك/(2Fصثم)



وينطبق الشيء نفسه على الوقت الميت.



ربما يكون الشيء الوحيد المهم الذي لم يتم النظر فيه هو إعداد 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 مع مكتباتهم.



All Articles