Skip to content
irmusy edited this page Oct 8, 2013 · 1 revision

개요

pwm_dimming 예제는 PWM 생성기를 이용해 PWM을 만들고, 듀티비를 주기적으로 바꿔 보는 간단한 예제입니다. PWM 출력에 LED를 연결하면 LED의 밝기가 서서히 변하는 것을 확인할 수 있습니다.

관련 Peripheral

  • SysCtl
  • GPIO
  • PWM

소스 살펴보기

60 line:

    //
    // Enable the peripherals used by this example.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);



    //
    // Set GPIO F0 as PWM pin.  They are used to output the PWM0
    // PWM1 signals.
    //
    GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0);

본 예제에서 사용 할 장치들을 enable합니다. PWM0는 PF0 핀을 사용합니다.

74 line:

    //
    // Compute the PWM period based on the system clock.
    //
    period = SysCtlClockGet() / 440;


    // Set the PWM period to 440 (A) Hz.
    //
    PWMGenConfigure(PWM_BASE, PWM_GEN_0,
                    PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
    PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, period);

PWM 생성기 0의 주파수를 440Hz로 설정합니다.

83 line:

    //
    // Set PWM0 to a duty cycle of 25% and PWM1 to a duty cycle of 75%.
    //
    SetPWMDuty(25);

PWM0에 25% 듀티를 설정합니다. SetPWMDuty()함수는 아래 설명 참조하세요.

91 line:

    //
    // Enable the PWM0 output signals.
    //
    PWMOutputState(PWM_BASE, PWM_OUT_0_BIT, true);

    //
    // Enable the PWM generator.
    //
    PWMGenEnable(PWM_BASE, PWM_GEN_0);

PWM 출력을 enable 합니다.

101 line:

    //
    // Set up the period for the SysTick timer.
    //
    SysTickPeriodSet(SysCtlClockGet() / 100);   // 100Hz SysTick timer


    //
    // Enable the SysTick Interrupt.
    //
    SysTickIntEnable();
    SysTickIntRegister(SysTickIntHandler);

    //
    // Enable SysTick.
    //
    SysTickEnable();

100Hz 주기의 SysTick 타이머를 설정합니다. 이 SysTick 타이머는 주기적으로 PWM 듀티를 변경하여 dimming 효과를 얻기 위해 사용합니다.

128 line:

void SysTickIntHandler(void)
{
    if (++duty >= 100)
        duty = 0;

    SetPWMDuty(duty);
}

SysTick 타이머 인터럽트 핸들러입니다. SysTick 타이머는 100Hz로 설정되었습니다. 따라서 매 10ms 마다 이 인터럽트가 발생하고, 인터럽트가 발생할 때 마다 PWM 듀티를 1씩 증가시킵니다. 그러므로 1초가 지나면 듀티가 최대값인 100이 되어 다시 0으로 초기화 됩니다.

138 line:

static void SetPWMDuty(unsigned long duty)
{
    unsigned long period = SysCtlClockGet() / 440;

    PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, period * duty / 100);
}

PWM의 듀티를 설정하는 함수입니다. 듀티는 0~100%의 값을 지정합니다.

실행 방법 안내

  1. 펌웨어를 빌드한 후 다운로드 하고, 보드의 리셋 버튼을 1회 누릅니다.
  2. 오실로스코프를 이용하여 PF0 핀을 관찰하여 PWM 출력이 나오고, 듀티가 서서히 변하는지 확인합니다.
  3. PF0 핀에 LED와 저항을 연결하여 LED의 밝기가 변하는지 확인합니다.

Clone this wiki locally