Skip to content
irmusy edited this page Oct 7, 2013 · 2 revisions

개요

myCortex-LM8962는 3개의 PWM 생성 장치를 내장하고 있습니다. MCU 장치 구성에 생색내기용으로 집어넣은 단순 PWM 생성기가 아닌 본격 PWM 발생장치이며, 6개 PWM 출력을 통하여 BLDC 모터도 바로 제어할 수 있습니다. 본 예제에서는 PWM 장치의 기본적인 기능을 살펴볼 수 있습니다.

각각의 PWM 장치는 16비트 카운터를 중심으로 2개의 비교기, PWM 파형 생성기, dead-band 생성기 등으로 구성되어 2개의 PWM 출력을 낼 수 있습니다. 장치가 3개 있으므로 총 6개 PWM 출력을 낼 수 있습니다. 16비트 카운터로 시스템 클럭을 카운트하며 2개의 비교기로 PWM 주파수와 듀티비(duty ratio)를 만들어 냅니다. 본 예제에서는 50MHz 시스템 클럭을 입력으로 받아 440Hz의 PWM 기본 주파수를 만들고, 듀티비 25%와 75% 두 개의 출력을 만드는 예를 구현하고 있습니다.

PWM을 이용해 모터 제어를 할 때 P 채널, N 채널 스위치의 스위칭 딜레이 차이에 의해 shoot-through 현상이 일어날 수 있습니다. 이를 방지하기 위해서는 잘 튜닝된 스위치 쌍을 사용하거나 PWM 스위칭 시 dead-band를 인위적으로 집어넣어야 합니다. myCortex-LM8962는 dead-band generator를 이용해 PWM 스위칭 시 사용자가 지정한 delay를 자동으로 만들어 줌으로써 실전 회로를 보다 쉽게 구현할 수 있게 합니다.

관련 Peripheral

  • SysCtl
  • GPIO
  • PWM

소스 살펴보기

45 line:

    //
    // Set the clocking to use PLL
    //
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_8MHZ);

시스템 클럭을 PLL을 사용하여 50MHz로 설정합니다.

54 line:

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



    //
    // Set GPIO F0 and G1 as PWM pins.  They are used to output the PWM0 and
    // PWM1 signals.
    //
    GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0);
    GPIOPinTypePWM(GPIO_PORTG_BASE, GPIO_PIN_1);

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

71 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%.
    //
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, period / 4);
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, period * 3 / 4);

PWM0에 25% 듀티, PWM1에 75% 듀티를 설정합니다.

89 line:

    //
    // Enable the PWM0 and PWM1 output signals.
    //
    PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT, true);

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

PWM 출력을 enable 합니다.

실행 방법 안내

  1. 펌웨어를 빌드한 후 다운로드 하고, 보드의 리셋 버튼을 1회 누릅니다.
  2. 오실로스코프를 이용하여 PF0와 PG1 핀을 관찰하여 PWM 출력이 나오는지 확인합니다.
  3. PWM duty를 바꿔서 다시 다운로드 해 보고 변경사항이 적용되는지 확인합니다.