본문 바로가기

Computer Science/Embedded Software

[Embedded Software] PWM 실습

+ 한국항공대학교 최차봉 교수님의 임베디드 SW 과목 내용을 정리한 글입니다.

PWM (Pulse - Width - Modulation) 

디지털 시그널을 이용하여 아날로그 신호를 모방하는 방법이다.

 

주어진 시간동안 신호가 높은 상태(1)와 낮은 상태(0)을 반복하는 주기가 존재한다.

 

주기동안 높은 상태(1)의 지속 시간인 Pulse Width를 조절하여 출력을 제어한다.

analogWrite(pin, DutyValue)

+ DutyValue: 0 ~ 255

 

=> LED 밝기를 제어할 수 있다.

< 첫 번째 실습 - PWM으로 LED 제어하기 1 >

LED가 점점 밝아졌다 꺼졌다를 반복하는 아두이노를 제작하라.

 

+ LED의 극성에 주의해야한다. (+: 긴 부분, -: 짧은 부분)

void setup() {
  pinMode(11, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 255; i++) {
    analogWrite(11, i);
    delay(10);
    Serial.println(i);
  }
}

< 두 번째 실습 - PWM으로 LED  제어하기 2 >

첫 번째 실습을 기반으로 LED가 점점 밝아지다가 최대치에 이르면 점점 어두어짐을 반복하는 아두이노를 제작하라.

void setup() {
  pinMode(11, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 255; i++) {
    analogWrite(11, i);
    delay(10);
    Serial.println(i);
  }
  for (int i = 255; i > 0; i--) {
    analogWrite(11, i);
    delay(10);
    Serial.println(i);
  }
}

< 세 번째 실습 - PWM으로 LED 제어하기 3 >

두 번째 실습에 스위치를 연결하여 Pause 기능을 추가하라.

- 스위치를 누르면 LED 변화가 정지하고, 다시 누르면 LED 변화가 정지되었던 시점부터 다시 변화한다.

int pause = 0;
int delta = 1;
volatile byte state = LOW;
int n = 0; // pwm value

void sw_pressed() {
  state = HIGH;
  Serial.println("Interrupt..");
}

void setup()
{
  pinMode(11, OUTPUT);
  pinMode(2, INPUT);
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(2), sw_pressed, RISING);
}

void loop()
{
  if (pause == 0) { // pause가 0이 아닐때만 진행
    analogWrite(11, n);
    n += delta; // PWM 값 변화 (1 or -1)
    
    // PWM값이 1씩 증가해서 255가 되면 다음부터는 1씩 감소
    if (n == 255) {
      delta = -1;
    }
    
    // PWM값이 1씩 감소해서 0이 되면 다음부터는 1씩 증가
    if (n == 0) {
      delta = 1;
    }
    Serial.println(n);
  }
  if (state == HIGH) {
    pause = pause ? 0 : 1;
  Serial.print("pause= ");
  Serial.println(pause);
  state = LOW;
  }
}