Microprocessor/DSP (TMS320F28x) TR28335 ๊ฐœ๋ฐœ KIT eCAP (Enhanced Capture Module)
  • 728x90
    ๋ฐ˜์‘ํ˜•

     

     

    ๋ชฉ์ฐจ

       

       

      ECAP ๋ž€ ?

      ๐Ÿ“Œ Enhanced capture์˜ ์•ฝ์ž๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•ด์„œ ์‹œ๊ฐ„๋ณ€์œ„์˜ analog data๋ฅผ digital๋กœ ๋ฐ”๊พธ๋Š” ๋™์ž‘์„ ์˜๋ฏธํ•œ๋‹ค.

       

       

      ECAP ๋ชจ๋“ˆ์˜ ํŠน์ง•

      • 32bit ํƒ€์ด๋จธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. (Overflow์—†์ด 42.9sec ์‹ ํ˜ธ ํƒ€์ด๋ฐ ๊ฒ€์ถœ ๊ฐ€๋Šฅ)
      • 4๊ฐœ์˜ 32bit Time stamp ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
      • ์ž…๋ ฅ ์‹ ํ˜ธ์˜ Prescaling์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
      • 2๊ฐ€์ง€ ๋™์ž‘๋ชจ๋“œ(Absolute Time-Stamp mode, Time Difference Mode)
      • APWM Mode(Auxilary PWM)
        • Capture๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” eCAP ๋ชจ๋“ˆ์„ PWM๋ชจ๋“ˆ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

       

       

      Abosolute Time-stamp Mode

      ๐Ÿ“Œ ์ด ๋ชจ๋“œ์—์„œ๋Š” PWM์ž…๋ ฅ ์‹ ํ˜ธ์˜ Rinsing edge๋ฅผ ๊ฒ€์ถœ ํ•˜๋Š”๋ฐ ์ฒซ ๋ฒˆ์งธ Rising edge๋ฅผ ์ฒซ ๋ฒˆ์งธ Time-stamp์— ์ €์žฅ, ๋‘ ๋ฒˆ์งธ Rising edge์˜ time์„ ๋‘ ๋ฒˆ์งธ Time-stamp์— ์ €์žฅํ•˜๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์† ์‹ ํ˜ธ๋ฅผ ๋ฐ›์•„์„œ ๊ธฐ๋กํ•˜๊ณ  Timer๋Š” ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š”๋ฐ ์ด ๊ฒฝ์šฐ Timer๊ฐ€ ์‹ ํ˜ธ๊ฐ€ ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ reset๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— overflow๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

       

       

      Time Difference Mode

      ๐Ÿ“Œ ์ด ๋ชจ๋“œ์—์„œ๋Š” PWM์ž…๋ ฅ ์‹ ํ˜ธ์—์„œ Rising edge์™€ ๊ทธ ๋‹ค์Œ Rising edge์‚ฌ์ด์˜ ์‹œ๊ฐ„์„ ์ €์žฅํ•˜๋Š”๋ฐ edge๊ฐ€ detect๋˜๋ฉด ์ž๋™์œผ๋กœ Timer๊ฐ€ reset์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— overflow๊ฐ€ ๊ฑฐ์˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ edge๊ฐ„์˜ ์‹œ๊ฐ„์€ Time-stamp์— ๊ธฐ๋ก๋˜๋Š” ๊ฐ’์„ ์ฝ์œผ๋ฉด ๋œ๋‹ค.

       

       

      Auxilary PWM Mode

      ๐Ÿ“Œ Capture mode๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด mode๋ฅผ ๋ฐ”๊ฟ”์„œ PWM์ฑ„๋„๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๋ชจ๋“œ์—์„œ๋Š” phase shift๊ธฐ๋Šฅ๊ณผ ePWM๋ชจ๋“ˆ๊ณผ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์€ ์ œ๊ณต์„ ํ•˜์ง€๋งŒ ePWM์˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋“ค์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

       

      SOURCE TR28335_Rotary.h

      /*===========================================================
       *
       * FILE  : TR28335_Rotary.h .2017
       * TITLE : TR28335 Temp ROTARY Sensor eCAP(Enhanced Capture)
       *
       *==========================================================*/ 
      #ifndef __TR28335_ROTARY_H__
      #define __TR28335_ROTARY_H__
      #ifdef _cplusplus
      extern "C" {
      #endif
      #include <main.h>
      
      void InitRotaryIsr(void);
      
      #ifdef _cplusplus
      }
      #endif  /* extern "C"          */
      #endif /* __TR28335_ROTARY_H__ */
       

       

      SOURCE TR28335_Rotary.c

      /*===========================================================
       *
       * FILE  : TR28335_Rotary.c .2017
       * TITLE : TR28335 Temp ROTARY Sensor eCAP(Enhanced Capture)
       *
       *==========================================================*/ 
      #include <TR28335_Rotary.h>
      #include <TR28335_Led.h>
      
      Uint16 gRotaryIsrTicker;
      Uint32 gCaptureCounter1;
      Uint32 gCaptureCounter2;
      Uint32 gEdgeCount;
      
      interrupt void eCapture1_isr(void);
      static void InitECapture1(void);
      
      /*==============================================================
      *
      * Name        : InitECapture1
      * Type        : Fucntion
      * Description : Rotary Interrupt Service Routine Initialization
      *
      ================================================================*/
      void InitRotaryIsr(void)
      {
          InitECap1Gpio();
      
          EALLOW;
          GpioCtrlRegs.GPACTRL.bit.QUALPRD3 = 0xFF;
          GpioCtrlRegs.GPAQSEL2.bit.GPIO24 = 2;
          EDIS;
          
          /*  Interrupt Service Routine Re-mapping */
          EALLOW;
          PieVectTable.ECAP1_INT = &eCapture1_isr;
          EDIS;
      
          /* Enable PIE group4 interrupt 1 for ECAP1_INT */
          PieCtrlRegs.PIEIER4.all = M_INT1;
      
          IER |= M_INT4;
      
          gRotaryIsrTicker = 0;
      
          gCaptureCounter1 = 0;
          gCaptureCounter2 = 0;
          gEdgeCount = 0;
          
          InitECapture1();
          
          return ;
      }
      
      /*=============================================
      *
      * Name        : eCapture1_isr
      * Type        : Interrupt
      * Description : eCap Interrupt Service Routine 
      *
      ==============================================*/
      interrupt void eCapture1_isr(void)
      {
          /* Verifying the ISR */
          gRotaryIsrTicker++;
      
          /* Excute LED toggle function */
          LedCtrl(LED_ALL, LED_TOGGLE);
      
          /* Calculate counter value between Rising Edge and Falling Edge */
          gCaptureCounter1 = ECap1Regs.CAP1;
          gCaptureCounter2 = ECap1Regs.CAP2;
      
          if(ECap1Regs.ECFLG.bit.CTROVF == 1)
          {
              gEdgeCount = (0xFFFFFFFF - gCaptureCounter1) + gCaptureCounter2;
              ECap1Regs.ECCLR.bit.CTROVF = 1;
          }
          else
              gEdgeCount = gCaptureCounter2 - gCaptureCounter1;
      
          /* eCapture 1 Interrupt clear */
          ECap1Regs.ECCLR.bit.CEVT2 = 1;
          ECap1Regs.ECCLR.bit.INT = 1;
      
          /* Acknowledge this interrupt to receive more interrupts from group 4*/
          PieCtrlRegs.PIEACK.bit.ACK4 = 1;
      
          return ;
      }
      
      /*=======================================
      *
      * Name        : InitECapture1
      * Type        : Fucntion
      * Description : eCAP Initialization
      *
      =========================================*/
      void InitECapture1(void)
      {
          ECap1Regs.ECEINT.all = 0x0000;          /* Disable all capture interrupts   */
          ECap1Regs.ECCLR.all = 0xFFFF;           /* Clear all CAP interrupt flag     */
          ECap1Regs.ECCTL1.bit.CAPLDEN = 0;       /* Disable CAP1-CAP4 register loads */
          ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;     /* Make sure the counter is stopped */
      
          /* Configure peripheral regisers */
          ECap1Regs.ECCTL2.bit.CAP_APWM = 0;      /* ECAP1 Module operate in capture mode */
          ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0;   /* Operate in continuous mode           */
          ECap1Regs.ECCTL2.bit.STOP_WRAP = 1;     /* Stop at 2 events                     */
          ECap1Regs.ECCTL1.bit.CAP1POL = 0;       /* Rising edge                          */
          ECap1Regs.ECCTL1.bit.CAP2POL = 1;       /* Falling edge                         */
          ECap1Regs.ECCTL1.bit.CTRRST1 = 0;       /* Absolute time-stamp operation        */
          ECap1Regs.ECCTL1.bit.CTRRST2 = 0;       /* Absolute time-stamp operation        */
          ECap1Regs.ECCTL1.bit.CAPLDEN = 1;       /* Enable capture units                 */
      
          ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;     /* Start Counter                        */
          ECap1Regs.ECCTL1.bit.CAPLDEN = 1;       /* Enable CAP1- CAP4 register loads     */
          ECap1Regs.ECEINT.bit.CEVT2 = 1;         /* 2 events = interrupt                 */
         
          return ;
      }

       

       

      ๐ŸŽฏ ํšŒ๋กœ๋„

       

      ๐ŸŽฏ ์ฝ”๋“œ ๋ถ„์„

      • InitECap1Gpio : ์ด ํ•จ์ˆ˜๋Š” common ํด๋”๋‚ด์˜ DSP2833x_ECap.c ์— ์œ„์น˜ํ•ด ์žˆ๋‹ค. eCAP ํ•€์ธ GPIO24๋ฅผ eCPA ํ•€์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์„ ํ•œ๋‹ค.
      • GPACTRL - QUALPRD3 : Qualification Control ์„ค์ •์„ ํ†ตํ•ด GPIO24์— ์ƒ˜ํ”Œ๋ง CLOCK ๊ธฐ์ค€์„ ์‹œ์Šคํ…œ์ฃผ๊ธฐ์˜ 510๋ฐฐ๋กœ ์„ค์ •ํ•œ๋‹ค.
      • GPAQSEL2 - GPIO24 : GPIO24์— Qualification ์ดˆ๊ธฐ 6์ƒ˜ํ”Œ ๋™์•ˆ์€ ๋ฐ›์ง€ ์•Š๋„๋ก ์„ค์ •ํ•œ๋‹ค.

       

       

       

      • ECAP1_INT : PIE Vector Table ์— Interrupt service routine์„ ๋“ฑ๋กํ•œ๋‹ค.

       

       

       

      • ECEINT : capture interrupt ๋ฅผ ๋ชจ๋‘ Disable ํ•œ๋‹ค.

       

       

       

      • ECCLR : CAP Interrupt flag ๋ชจ๋‘ Clear ํ•œ๋‹ค.

       

       

       

      • ECCTL1 - CAPLDEN : ์ด ๋ ˆ์ง€์Šคํ„ฐ์— 0์„ ๋„ฃ์–ด CAP1-4 capture event time ๋กœ๋“œ๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•œ๋‹ค. 1์„ ๋„ฃ์œผ๋ฉด CAP1-4 capture event time ๋กœ๋“œ๋ฅผ ํ™œ์„ฑํ™” ํ•œ๋‹ค.

       

       

       

      • ECCTL2 - TSCTRSTOP : 0์„ ๋„ฃ์œผ๋ฉด Time Stamp Counter ๋ฅผ Stop ์‹œํ‚จ๋‹ค. 1์„ ๋„ฃ์œผ๋ฉด Time Stamp Counter ๋ฅผ Start ์‹œํ‚จ๋‹ค.

       

       

       

      • ECCTL2 - CAP/APWM : ์ด ๋ ˆ์ง€์Šคํ„ฐ๋Š” Capture ๋˜๋Š” APWM ๋ชจ๋“œ๋ฅผ ์„ค์ • ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ์†Œ์Šค์—์„œ๋Š” 0์„ ๋„ฃ์–ด ECAP1 Module ์„ capture mode๋กœ ์„ค์ •.

       

       

       

      • ECCTL2 - CONT/ONESHT : ์—ฐ์† Capture ๋ชจ๋“œ ์„ค์ •์ด๋ฉฐ, Capture ๋ชจ๋“œ ์—์„œ๋งŒ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

       

       

       

      • ECCTL2 - STOP/WRAP : 2๋ฒˆ์˜ Capture Event ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฉˆ์ถ”๋„๋ก ์„ค์ •.

       

       

       

      • ECCTL1 - CAP1POL : ์ด ๋ ˆ์ง€์Šคํ„ฐ์— 0์„ ๋„ฃ์–ด Capture Event 1์— ์ƒ์Šน ์—ฃ์ง€๋ฅผ ๊ฒ€์ถœ ํ•˜๋„๋ก ์„ค์ •.

       

       

       

      • ECCTL1 - CAP2POL : ์ด ๋ ˆ์ง€์Šคํ„ฐ์— 1์„ ๋„ฃ์–ด Capture Event 2์— ํ•˜๊ฐ• ์—ฃ์ง€๋ฅผ ๊ฒ€์ถœ ํ•˜๋„๋ก ์„ค์ •.

       

       

       

      • ECCTL1 - CTRRST1 : ์ด ๋ ˆ์ง€์Šคํ„ฐ์— 0์„ ๋„ฃ์–ด Capture Event 1์— ์นด์šดํ„ฐ๋ฅผ ๋ฆฌ์…‹ํ•œ๋‹ค.

       

       

       

      • ECCTL1 - CTRRST2 : ์ด ๋ ˆ์ง€์Šคํ„ฐ์— 0์„ ๋„ฃ์–ด Capture Event 2์— ์นด์šดํ„ฐ๋ฅผ ๋ฆฌ์…‹ํ•œ๋‹ค.

       

       

       

      • ECCTL1 - CEVT2 : ์ด ๋ ˆ์ง€์Šคํ„ฐ์— 1 ์„ ๋„ฃ์–ด Capture Event 2์— Interrupt source๋ฅผ ํ™œ์„ฑํ™” ํ•œ๋‹ค.

       

       

       

      • CAP1-CAP2 : ์ƒ์Šน ์—ฃ์ง€๋‚˜ ํ•˜๊ฐ• ์—ฃ์ง€๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉด ์ด ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์นด์šดํŒ… ๋œ๋‹ค.

       

       

       

      • ECFLG - CTROVF : Counter ์— Overflow ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉด ์ด ๋น„ํŠธ์— 1๋กœ ์“ฐ์—ฌ์ง„๋‹ค.

       

       

       

      • ECCLR - CTROVF : ์ด ๋น„ํŠธ์— 1์„ ๋„ฃ์–ด Counter Overflow flag ๋ฅผ ํด๋ฆฌ์–ด ํ•œ๋‹ค.

       

       

      • ECCLR - CEVT2 : ์ด ๋น„ํŠธ์— 1์„ ๋„ฃ์–ด CEVT2 ์ƒํƒœ๋ฅผ ํด๋ฆฌ์–ด ํ•œ๋‹ค.

       

       

       

      • ECCLR - INT : ์ด ๋น„ํŠธ์— 1์„ ๋„ฃ์–ด Interrupt  ํด๋ฆฌ์–ด ํ•œ๋‹ค.

       

       

       

      ๐ŸŽฏ ๊ฒฐ๊ณผ

       

      728x90
      ๋ฐ˜์‘ํ˜•
    ์ƒ๋‹จ์œผ๋กœ