홈으로 돌아가기

STM32에서의 PWM 위상 제어: 타이머 동기화 방법

이 기사는 하드웨어 타이머 동기화를 통해 STM32 마이크로컨트롤러에서 PWM 신호 위상을 정밀하게 제어하는 방법을 설명합니다. 정확도, 제한사항, 코드 예제를 분석한 세 가지 접근 방식을 고려합니다. 오실로스코프를 사용한 위상 진단에 대한 권장 사항이 제공됩니다.

STM32에서의 정밀 PWM 위상 제어: 무손실 구현
Advertisement 728x90

STM32에서의 정밀 PWM 위상 제어: 손실 없는 하드웨어 방법

STM32 마이크로컨트롤러에는 하드웨어 PWM 신호의 위상을 조정하는 직접적인 레지스터가 없습니다. 이 문제는 엄격한 타이밍 시프트가 필요한 작업에서 여러 채널을 동기화할 때 치명적입니다. 성능에 최소한의 영향만 주고 소프트웨어 에뮬레이션 없이 정밀한 위상 제어를 구현하는 방법을 소개하겠습니다.

PWM 위상 조정의 필요성

STM32의 하드웨어 PWM은 주파수와 듀티 사이클 설정이 쉽지만, 표준 라이브러리에는 위상을 이동시키는 직접적인 방법이 없습니다. 이 제한은 다음 시나리오에서 중요해집니다:

  • 고정 시프트가 있는 두 PWM 신호로 직교 인코더 에뮬레이션
  • 직교 믹서용 sin/cos 쌍 생성 (90° 시프트)
  • 3상 BLDC 모터 제어 (채널 간 120° 시프트)
  • 내연기관의 가솔린 인젝터나 점화 코일 동기화
  • SDR 수신기에서 LO 신호 생성
  • 전원 회로에서 위상을 인위적으로 어긋나게 하여 EMI 감소

하드웨어 동기화가 없으면 신호 위상은 타이머 초기화 시간, 코드 실행 속도, 버스 주파수 등의 무작위 요인에 의해 결정됩니다. 이는 예측 가능한 동기화를 불가능하게 만듭니다.

Google AdInline article slot

이론적 기초: 마스터-슬레이브 구조

핵심 아이디어는 하나의 타이머(마스터)를 다른 타이머(슬레이브)의 기준 동기화 소스로 사용하는 것입니다. 슬레이브 타이머의 위상은 마스터 타이머의 비교기 값으로 조정됩니다. 이 값에 도달하면 슬레이브 타이머의 카운터가 리셋되어 원하는 타이밍 시프트가 생성됩니다.

![](./images/image-5.png)

위상이 상대적 단위로 측정된다는 점을 이해하는 것이 중요합니다:

Google AdInline article slot
  • 0° — 동위상 신호
  • 180° — 반위상
  • 360° — 전체 주기 (0°와 동등)

시프트 정확도는 타이머의 해상도에 의해 결정됩니다. 1 ms 주기와 84 MHz 버스 클럭에서 오차는 11.9 ns (1/84e6)까지 작을 수 있습니다.

실제 구현 방법

방법 0: 극성 반전 (180° 시프트)

가장 간단한 방법은 TIMx_CCER 레지스터의 CCxP 비트를 토글하는 것입니다. 이는 추가 자원이 필요 없는 원자적 연산입니다. 단점은 0°와 180°의 두 고정 상태만 가능하다는 점입니다. BPSK 변조에는 적합하지만 부드러운 조정이 필요할 때는 해결책이 되지 않습니다.

방법 1: 소프트웨어 카운터 조정

순진한 접근법은 슬레이브 타이머의 CNT 레지스터에 직접 쓰는 것입니다:

Google AdInline article slot
bool pwm_phase_set_counter_adjust(uint8_t num, int32_t phase_us) {
    bool res = false;
    PwmHandle_t *Node = PwmGetNode(num);
    if(Node) {
        int32_t compare_value = TimerPhaseUsToCompareValue(Node->PhaseComparator.timer, phase_us);
        int32_t counter_base = (int32_t) timer_counter_get(Node->PhaseComparator.timer);
        int32_t value = counter_base + compare_value;
        res = timer_counter_set(Node->TimChan.timer, (uint32_t) value);
    }
    return res;
}

이 방법은 코드 실행 시간으로 인해 1 kHz에서 최대 3 µs 오차 (0.29%)가 발생합니다. 주요 단점:

  • 쓰기 중 타이머 중지 필요
  • 보정 순간 신호 무결성 방해
  • 인터럽트로 CPU 부하

방법 2: 마스터-슬레이브를 통한 하드웨어 동기화

최적의 해결책은 내장된 타이머 동기화 메커니즘을 사용하는 것입니다. 설정은 다음과 같습니다:

  • 마스터 타이머(TIM8)를 OC1 비교기 매치 시 트리거 생성 모드(TIM_TRGO_OC1)로 구성
  • 슬레이브 타이머(TIM4)를 내부 트리거(TIM_TS_ITR3)에서 리셋되도록 설정
  • 슬레이브 모드를 리셋(TIM_SLAVEMODE_RESET)으로 설정

HAL 설정은 다음과 같습니다:

const TimerConfig_t TimerConfig[] = {
    { 
        .num = TIMER_NUM_LO_BASE,
        .role = TIMER_ROLE_MASTER,
        .master_out_trigger = TIMER_MASTER_OUT_TRG_OC1,
    },
    { 
        .num = TIMER_NUM_LO,
        .role = TIMER_ROLE_SLAVE,
        .slave_input_trigger = TIMER_SLAVE_IN_TRIG_INTERNAL_TRIGGER_3,
        .slave_mode = TIMER_SLAVE_MODE_RESET,
    },
};

이 방법의 장점:

  • 인터럽트 없는 완전 하드웨어 구현
  • 버스 클럭 사이클 단위 시프트 정확도 (84 MHz에서 11.9 ns)
  • 동적 조정 중 출력 신호 글리치 없음
  • 최소 CPU 부하 (마스터 타이머 비교기 레지스터 쓰기만)

제한사항:

  • 마스터-슬레이브 연결을 지원하는 타이머 쌍 필요
  • 마스터당 최대 4 슬레이브 타이머 (비교기 수 제한)
  • 일부 타이머 (6,7,10,11,13,14)는 슬레이브 모드 미지원

로직 분석기로 위상 진단

올바른 설정 확인은 오실로스코프나 로직 분석기로 수행합니다. 테스트를 위해:

  • 마스터 타이머(TIM8_CH1)를 1 kHz, 50% 듀티 사이클로 설정
  • 슬레이브 타이머(TIM4_CH2)를 90° 위상 시프트로 설정
  • 해당 핀에 프로브 연결

예상 결과:

  • 0 시프트 시 마스터 신호 상승 에지가 슬레이브 주기 시작과 정렬
  • 1 ms 주기에서 90° 시프트 시 슬레이브 신호가 250 µs 오프셋

![](./images/image-17.png)

핵심 포인트: 오차는 버스 클럭 사이클 단위로 측정됩니다. 84 MHz 버스 STM32F407에서 최소 스텝은 11.9 ns입니다. 1 kHz에서 실제 정확도는 0.012%입니다.

주요 요점

  • 방법 선택은 정확도 요구사항에 따라: 0.01% 오차 시 하드웨어 동기화 사용; 0.3% 시 소프트웨어 조정 가능
  • 타이머 호환성 확인: 모든 쌍이 마스터-슬레이브 연결 지원 안함 (RM0090의 표 참조)
  • 타이머 중지 피하기: 하드웨어 방법은 위상 변경 중 신호 생성 중단 없음
  • 슬레이브 장치 제한 고려: 하나의 마스터당 최대 4 슬레이브 타이머 연결
  • 오실로스코프로 위상 진단: 중요 시스템에서 시각적 확인 필수

— Editorial Team

Advertisement 728x90

다음 읽기