PWM & Brightness

hyeony·2025년 8월 27일

임베디드

목록 보기
9/10

1. PWM(Pulse Width Modulation)

가. Introduction to PWM

PWM이란 신호를 매우 빠르게 켜고 끄는 방식으로 장치가 받는 전력을 제어하는 방법이다. 이러한 방식 덕분에, 디지털 방식으로 아날로그 신호와 비슷한 효과를 낼 수 있다. 또한, 효율적으로 전력을 조절할 수 있다. 단순히 열로 에너지를 소모하는 대신, 신호가 켜져있는 시간을 조절하여 전력을 제어한다. 이는 LED 밝기 조절이나 서보 모터 제어와 같은 곳에서 사용된다.

나. 소프트웨어 PWM vs 하드웨어 PWM

PWM은 다음과 같이 두 가지 방식으로 생성할 수 있다.

① 소프트웨어 PWM

  • 프로그래머가 직접 신호를 켜고 끄는 시간을 제어한다.
  • 유연성이 있지만 CPU 자원을 많이 사용한다.

② 하드웨어 PWM

  • 마이크로컨트롤러에 내장된 PWM 발생기를 사용한다.
  • 훨씬 효율적이고, 여러 PWM 신호를 동시에 안정적으로 생성할 수 있다.

임베디드 시스템에서는 일반적으로 하드웨어 PWM을 선호한다. 왜냐하면 신뢰성이 더 높고, 프로세서를 느리게 하지 않기 때문이다.

다. Duty Cycle

PWM의 핵심 개념은 Duty Cycle이다. Duty Cycle이란 한 주기에서 신호가 켜져 있는 시간의 비율(%)을 의미한다. Duty Cycle이 높을수록 더 많은 전력이 전달된다.

예를 들어, 1 kHz PWM 신호에서 한 주기는 1 ms이다. Duty Cycle이 75 %라면 신호는 0.75 ms 동안 켜지고 0.25 ms 동안 꺼진다.

즉, PWM은 주파수를 일정하게 유지한 상태에서 Duty Cycle을 조절하여 전력을 제어하는 방식이다.

2. Practice

가. Code Implementation

#include "mbed.h"

UnbufferedSerial pc(USBTX, USBRX, 112500);

PwmOut led(PB_13);

int main() {
	led.period_ms(1);					// 1 kHz frequency
    
    while (true) {
    	printf("LED is off\n");
       	led.write(0.0f);
        ThisThread::sleep_for(2s);
        
        printf("LED is at 25%%\n");
        led.write(0.25f);
        ThisThread::sleep_for(2s);
        
        printf("LED is at 75%%\n");
        led.write(0.75f);
        ThisThread::sleep_for(2s);
        
        printf("LED is at 100%%\n");
        led.write(1);
        ThisThread::sleep_for(2s);
    }
}

나. Result

1) OFF


2) 25 %


3) 75 %


<참고 자료>
https://www.udemy.com/course/microcontrollers-iot-learn-with-real-online-hardware/?kw=Microcontrollers+%26+Embedded+Systems%3A+Use+Real+STM32+Online&src=sac

profile
Chung-Ang Univ. EEE.

0개의 댓글