2016-08-17 16 views
0

배경 : 단일 LTC11C24 마이크로 컨트롤러가 단일 32 비트 타이머를 사용하여 하나의 핀에서 PWM 입력을 읽고 PWM 출력을 2 개로 제어합니다 다른 핀들. 입력과 출력이 같은 타이머에 있기 때문에 타이머 레지스터 (TC)를 리셋하지 않습니다. 특히 출력의 경우, 신호를 HIGH 또는 신호가 LOW 일 때마다 일치 레지스터가 지속적으로 증가하도록 설정하려고합니다.타이머 리셋없이 LPC11CXX 시리즈 마이크로 컨트롤러에서 PWM 출력을 설정하는 방법

예 : 인터럽트가 발생할 때마다 10000 틱의 마침표와 듀티 사이클이 50 % 인 경우 MR0에 5000을 추가하여 다음 인터럽트를 준비하고 싶습니다.

초기화 :

IOCON_R_PIO1_1_bit.FUNC = 0; 
IOCON_R_PIO1_1_bit.MODE = 0; 
GPIO1DIR_bit.P1_1 = 1; 

LPC_TMR32B1->MCR |= (1<<0); /* Interrupt when MR0 matches TC */ 
LPC_TMR32B1->MR0 = 0; /* zero the match value */ 

ISR :

/* If interrupt was from MR0 */ 
if(LPC_TMR32B1->IR & (1<<0)) 
{ 
    /* Clear the interrrupt */ 
    LPC_TMR32B1->IR = (1<<0); 

    if(GPIO1DATA_bit.P1_1 == 1) 
    { 
     LPC_TMR32B1->MR0 = LPC_TMR32B1->TC; 
     LPC_TMR32B1->MR0 += OutputChan0MatchPeriodFalling; 
     GPIO1DATA_bit.P1_1 = 0; 
    } 
    else if(GPIO1DATA_bit.P1_1 == 0) 
    { 
     LPC_TMR32B1->MR0 = LPC_TMR32B1->TC; 
     LPC_TMR32B1->MR0 += OutputChan0MatchPeriodRising; 
     GPIO1DATA_bit.P1_1 = 1; 
    } 
} 

내가 어떠한 출력을 얻을이 핀 프로브, 그래서 내가 잘못 모르겠어요합니다. 내가 가지고있는 또 다른 문제는 일부 외부 코드 (기본적으로 MR0 = TC를 설정 함)에서 새로운 듀티 사이클을 제공 할 때를 제외하고는 인터럽트를 얻지 못한다는 것입니다. 나는 그것이 TC가 MR0보다 앞서 가고 있기 때문에 그것이라고 생각하지만 나는 그것을 방지하는 방법을 모르겠습니다. 정말 고맙습니다! 추가 정보를 제공 할 수 있는지 알려 주시기 바랍니다.

+0

어떻게 "PWM ** 입력 ** 제어"하나요? – Olaf

+0

@Olaf 고맙습니다. 질문이 수정되었습니다. – LaneL

답변

0

나는 그것을 알아 냈다. 여기에 2 가지 일이 잘못되었습니다.

I/O 구성이 잘못되었습니다. 설명서를 읽은 후, GPIO에 대해 함수를 1로 설정해야한다는 것을 알았습니다. 0은 예약 된 기능입니다.

두 번째로 잘못된 점은 ISR을 처리하기 위해 타이머를 일시 중지해야한다는 것입니다.

/* If interrupt was from MR0 */ 
if(LPC_TMR32B1->IR & (1<<0)) 
{ 
    /* Pause timer */ 
    LPC_TMR32B1->TCR = 0; 

    /* Clear interrupt */ 
    LPC_TMR32B1->IR = (1<<0); 

    if(GPIO1DATA_bit.P1_1 == 1) 
    { 
     LPC_TMR32B1->MR0 = LPC_TMR32B1->TC + OutputChan0MatchPeriodFalling; 
     GPIO1DATA_bit.P1_1 = 0; 
    } 
    else if(GPIO1DATA_bit.P1_1 == 0) 
    { 
     LPC_TMR32B1->MR0 = LPC_TMR32B1->TC + OutputChan0MatchPeriodRising; 
     GPIO1DATA_bit.P1_1 = 1; 
    } 

    /* Restart timer */ 
    LPC_TMR32B1->TCR = 1; 
} 
+0

타이머 일시 중지가 잘못되었습니다. 모든 작업이 완료 될 때까지 인터럽트 소스를 지우는 것을 기다려야하지 않습니까? – Lundin

+0

@Lundin 나는 고주파에 대해서도 타이머가 매치 레지스터보다 앞서고 다음 상승/하강 에지에서 결코 인터럽트되지 않는다. 나는 ISR의 끝에서 인터럽트를 지우려고했지만 아무런 차이가없는 것처럼 보였다. – LaneL