본문 바로가기

[NXP]/LPC1k

[LPC1K EVM] Captuer 이용 IR 리모콘 테스트

[LPC1K EVM] Captuer 이용 IR 리모콘 테스트



Capture를 이용하면 펄스폭을 쉽게 측정할 수 있고 IR 리모콘 코드 분석이 가능하다. CAP32B0 입력핀인 PIO1_5에 IR 출력핀을 연결하였다.



IR포멧은 가장 많이 사용되는 NEC포멧으로 처리 할수 있도록 했다.
전체 구조는 108ms동안 시작을 알리는 리드신호와 데이터 신호를 전송한다.




좀더 자세히 보면 13ms의 리드 코드(이 길이는 제조사 마다 조금씩 차이가 있으므로 가변할 수 있도록 하면 된다.)가 시작 신호를 나타낸다. 그 뒤로 32비트의 코드가 출력된다.



데이터 비트는 펄스폭이 1.125ms이면 '0'을 2.25ms이면 '1'을 나타낸다.




실제 IR모듈의 출력은 반전된 데이터를 출력하므로 Captur입력에서 폴링일때 인터럽트가 걸리도록 해서 인식하면 된다.
void InitTimer32B0(uint32_t TimerInterval)
{
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);

    LPC_TMR32B0->MR0 = TimerInterval;

    LPC_IOCON->PIO1_5 &= ~0x07; /*  Timer0_32 I/O config */
    LPC_IOCON->PIO1_5 |= 0x02; /* Timer0_32 CAP0 */
    
   // Capture 0 폴링모드 인터럽트 설정
   LPC_TMR32B0->CCR = (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;  




모콘 테스트 동영상
리모콘 데이터가 수신되면 코드를 인식해서 LCD에 출력하는 예제




LPC1113 Capture - IR 리모콘 테스트 코드
#include "system.h"
#include "serial.h"
#include "ir_decoder.h"

extern volatile uint8_t  gIrCode, gIrCmd, gIrRead;
//-----------------------------------------------------------------------------
//Capture interrupt handler
void CT32B0_IRQHandler(void)
{
  if ( LPC_TMR32B0->IR & (0x1<<4) )
  { 
 LPC_TMR32B0->IR = 0x1<<4;
   
    //capture값을 읽어와 펄스폭 계산  
    gNewCap = LPC_TMR32B0->CR0;
    gPulseWidth = gNewCap - gOldCap;
   
    gOldCap = gNewCap; 
   
 //IR 코드 처리
 IrDecoder(gPulseWidth);
  } 
}
//-----------------------------------------------------------------------------


int main()
{
    int i = 0;
    unsigned char buf[20];
    SystemInit();

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

    U0_Init(BAUD_115200);
    LCD_Display("LPC1K IR Test\r\n");
   
    //Capture 설정   
    InitTimer32B0(SystemAHBFrequency/10000 - 1);
   
    while(1)
    {
       if(gIrRead ==1)
      {
         Led1Toggle();
            
         sprintf(buf, "A:%02X C:%02X\n", gIrCode, gIrCmd);
         LCD_Display(buf);
         gIrRead = 0;
      }       
    }
    return 0;
}



반응형