[LPC1K EVM] Capture 테스트 - PWM 펄스폭 측정하기
LPC1113의 타이머는 4개의 Capture 입력을 받을 수 각각 입력에 대한 이벤트를 받을 수 있다.
테스트는 TIMER32_B1의 PWM출력을 TIMER32_B0의 CAP0입력으로 연결하여 PWM의 펄스폭을 측정하도록 했다.
Timer32B0 Capture 초기화 함수
Captuer0 인터럽트 핸들러
Capture입력시 마다 Capture레지스터의 값을 저장해 펄스폭을 계산할 수 있따.
LPC1113 Capture테스트 예제 소스코드
TIMER1에서 PWM출력하고 TIMER0 caputre로 펄스폭을 측정하는 예제
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;
}
{
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;
}
//-----------------------------------------------------------------------------
//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;
}
{
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;
}
반응형