본문 바로가기

[NXP]/LPC1k

[LPC1K EVM] Capture 테스트 - PWM 펄스폭 측정하기

[LPC1K EVM] Capture 테스트 - PWM 펄스폭 측정하기




LPC1113의 타이머는 4개의 Capture 입력을 받을 수 각각 입력에 대한 이벤트를 받을 수 있다.
테스트는 TIMER32_B1의 PWM출력을 TIMER32_B0의 CAP0입력으로 연결하여 PWM의 펄스폭을 측정하도록 했다.




Timer32B0 Capture 초기화 함수
void InitTimer32B0(uint32_t TimerInterval)
{
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);

    LPC_TMR32B0->MR0 = TimerInterval;

    //CAP PIN = P1_5
    LPC_IOCON->PIO1_5 &= ~0x07; /*  Timer0_32 I/O config */
    LPC_IOCON->PIO1_5 |= 0x02; /* Timer0_32 CAP0 */
   
   //Capture 0 on both edge, interrupt enable. 
   LPC_TMR32B0->CCR = (0x1<<0)|(0x1<<1)|(0x1<<2);
       
    LPC_TMR32B0->MCR = 0;   /* Interrupt and Reset on MR0 */    

    /* Enable the TIMER0 Interrupt */
    NVIC_EnableIRQ(TIMER_32_0_IRQn);
   
    //타이머 Enalbe
    LPC_TMR32B0->TCR = 1;  


Captuer0 인터럽트 핸들러
Capture입력시 마다 Capture레지스터의 값을 저장해 펄스폭을 계산할 수 있따.
//-----------------------------------------------------------------------------
//Capture0 interrupt handler
void CT32B0_IRQHandler(void)
{
  if ( LPC_TMR32B0->IR & 0x01 )
  { 
 LPC_TMR32B0->IR = 1;    
  }
 
  if ( LPC_TMR32B0->IR & (0x1<<4) )
  { 
    // clear interrupt flag
    LPC_TMR32B0->IR = 0x1<<4;   
 
    Led1Toggle();

    //capture값을 읽어와 펄스폭 계산  
    gNewCap = LPC_TMR32B0->CR0;
    gPulseWidth = gNewCap - gOldCap;
   
    gOldCap = gNewCap;    
  } 
  return;
}
//-----------------------------------------------------------------------------



LPC1113 Capture테스트 예제 소스코드
TIMER1에서 PWM출력하고 TIMER0 caputre로 펄스폭을 측정하는 예제
int main()
{
    unsigned long period=0;
    unsigned long cnt = 0;
   
    SystemInit();

    Led1Init();
    Led1Off();
   
    Led2Init();
    Led2Off();

    U0_Init(BAUD_115200);
    DebugPrint("LPC1K UART Test\r\n");
   
   
    //CAPTURE 설정   
    InitTimer32B0(SystemAHBFrequency/1000 - 1);
   
   
    //PWM 초기화
    init_timer32PWM(TIMER_1, PWM_INTERVAL, (1<<PWM_CH2));
   enablePWM(TIMER_1, 1);
   
    //주기 설정
    period = SET_PWM(PWM_INTERVAL, 50);       //   50%
    setMatch_timer32PWM (TIMER_1, PWM_CH2, period);   
   
    while(1)
    {
        switch(U0_GetByte())
        {
        case 'g':
            DebugPrint("PulseWidth= %dus\r\n", gPulseWidth/48);
            break;  
            
        case '+':
            cnt += 1;
            period = SET_PWM(PWM_INTERVAL, cnt);
           
            DebugPrint("CNT= %d, %d\r\n", cnt, period);
            setMatch_timer32PWM (TIMER_1, PWM_CH2, period);
            break;            
           
           
        case '-':
            cnt -= 1;
            period = SET_PWM(PWM_INTERVAL, cnt);
           
            DebugPrint("CNT= %d, %d\r\n", cnt, period);
            setMatch_timer32PWM (TIMER_1, PWM_CH2, period);
            break;              
        }
   
    }
 
    return 0;
}
반응형