2016-12-05 7 views
0

PWM 및 MSP430f2618을 사용하여 오프 보드 LED를 페이드 아웃하기 위해 C 코드를 작성하려고합니다. 나는 LED가 켜지도록 할 수는 있지만 최대한의 강도를 유지합니다. 주파수 값의 배열을 읽고 주파수 값에 따라 LED를 희미하게 표시하려고합니다.msp430f2618 pwm을 사용한 페이딩 LED

int main(void) 
{ 
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer 
    int array_size = 0, i = 0, delay = 0; 
    double frequency[50] = {0.0}; 

    array_size = sizeof(frequency); 

    frequency [0] = 60.0; 

    for (i = 1; i < array_size; i++) 
    { 
     if (frequency[i - 1] < 61) 
     { 
      frequency[i] = frequency[i-1] + 0.1; 
     } 
     else 
     { 
      frequency[i] = 60.0; 
     } 
    } 

    P4OUT &= 0; 
    P4DIR |= (BIT1 + BIT2); //P4.1 and P4.2 output 
    P4SEL &= ~(BIT1 + BIT2); //P4.1 and P4.2 TBx options, timer select 
    TBCCR0 = 512-1; 

    TBCCTL1 = OUTMOD_7; 
    TBCCTL2 = OUTMOD_7; 

    for (i = 0; i < array_size; i++) 
    { 
     P4OUT &= 0; 
     if ((frequency[i] < 60.2) && (frequency[i] >=60.0)) 
     { 
      //TBCCR1 = 3200; 
      TBCCR1 = 384; 
     } 

     else if ((frequency[i] < 60.4) && (frequency[i] >=60.2)) 
     { 
      //TBCCR1 = 2560; 
      TBCCR1 = 256; 
     } 

     else if ((frequency[i] < 60.6) && (frequency[i] >=60.4)) 
     { 
      //TBCCR1 = 1920; 
      TBCCR1 = 128; 
     } 

     else if ((frequency[i] < 60.8) && (frequency[i] >=60.6)) 
     { 
      //TBCCR1 = 1280; 
      TBCCR1 = 64; 
     } 

     else if ((frequency[i] < 61) && (frequency[i] >=60.8)) 
     { 
      //TBCCR1 = 640; 
      TBCCR1 = 32; 
     } 

     else 
     { 
      TBCCR2 = 512; 
     } 

     P4OUT ^= BIT1; 
     for (delay = 0; delay < 32000; delay++); 

    } 
    TBCTL = TBSSEL_2 + MC_1;     // ACLK, up mode 



    __bis_SR_register(LPM0_bits);    // Enter LPM3 
    return 0; 
} 

답변

0

MC 필드를 설정하여 시작할 때까지 타이머가 실행되지 않습니다. 초기화는 처음에 수행되어야합니다.

+0

TBCTL = TBSSEL_2 + MC_1 라인을 워치 독 타이머 라인 바로 아래로 이동했지만 여전히 작동하지 않습니까? – user3277932

+0

필자는 코드 라인을 옮기고, 최종 듀티 사이클을 결정한 후 pwm을 구동하기 위해 for 문을 변경했다. 당신의 도움을 주셔서 감사합니다 – user3277932