OPENLABS

기본기:: PWM

토픽 OPENLABS > 마이크로프로세서 > [2016] 아두이노 초급

PWM(Pulse Width Modulation)

 PWM 이란 Pulse Width Modulation의 준말로 펄스의 폭을 컨트롤 하는 주기 제어방법입니다. 출력되는 전압값을 일정한 비율(duty)동안은 High를 유지하고, 나머지는 Low를 출력하여 아래와 같은 사각파의 출력을 만들어 내는데, PWM을 사용하면 0V와 5V 사이의 아날로그 값을 모사할 수도 있으며, 제어 및 통신에서도 많이 사용됩니다.

analogWrite

 아두이노에서는 analogWrite 함수를 통해서 이러한 PWM 출력을 제공하는데, analogWrite 함수의 인자로는 0~255까지의 정수가 들어갈 수 있습니다. 이 값에 따라 PWM의 duty가 0~100%로 변하게 됩니다.

led_gradation.ino 
int ledPin = 6;      // LED connected to digital pin 6
int val = 0;         // variable to store the read value
  
void setup()
{
  pinMode(ledPin, OUTPUT);   // sets the pin as output
}
  
void loop()
{
  analogWrite(ledPin, val);  // analogWrite values from 0 to 255
  delay(5);
    
  val += 1;
  
  if(val >= 256)
    val = 0;
}

 

서보 모터 제어하기

 서보 모터 또한 PWM으로 각도 제어가 가능합니다. 통상적으로, 서보 모터를 제어하는 PWM은 20ms 정도의 주기를 가지고 있으며, 1ms ~ 2ms의 High 신호에 따라 0도 에서 180도까지 회전합니다. 반면 analogWrite 로 발생되는 PWM은 약 490Hz(핀마다 다름) 정도의 빠른 주기를 가지고 있는데, 따라서 해당 PWM 신호는 서보 모터를 제어하기 부적합 합니다. 해당 예제에서 우리는 미리 만들어 진 Servo 라이브러리를 사용하여 서보 모터를 제어 해 볼 것입니다.

servo.ino
#include <Servo.h>

Servo myservo;    // create servo object to control a servo
int pos = 0;    // variable to store the servo position

void setup(){
  myservo.attach(6);    // attaches the servo on pin 6 to the servo object
}
  
void loop(){
  for(pos=0; pos<=180; pos++){    // goes from 0 degrees to 180 degrees
    myservo.write(pos);
    delay(15);
  }

  for(pos=180; pos >=0; pos--){    // goes from 180 degrees to 0 degrees
    myservo.write(pos);
    delay(15);
  }
}

참고자료

댓글

댓글 본문
  1. 26
  2. 여기에서 저항을 꼭 써야하나요?!
  3. Jake
    감사합니다. 실제로 PWM 사각파를 보니 이해가 훨씬 쉽네요. ^^
  4. 이지원
    대박입니다...ㅠㅠ
  5. 이지원
    대박입니다...ㅠㅠ
  6. SangHak Kim
    감사합니다~ 이해가 잘 됐어요 ㅎ
  7. 서시오
    감사합니다
  8. JustStudy
    고맙습니다
  9. 아 펄스의 전체적인 위치가 다른 이유는 제가 오실로스코프의 설정을 좀 잘못해서 그런 것입니다.ㅠㅠ LOW일 때 위치가 0V라 생각하시면 됩니다. 255를 입력하면 결국 한 주기의 255등분 중 255등분을 HIGH로 하라는 의미이니 결국에는 계속 HIGH를 출력하라는 의미이겠죠. 따라서 이때는 계속 5V가 나오는 겁니다. 영상에서는 기준점이 계속 바뀌어서 혼란스러웠군요 ㅠㅠ
    대화보기
    • 죠이
      7번 영상에 보면 analogWrite(6, 127) 할때와 (6,30)할때 LOW 위치가 올라가는데 그건 왜 그렇죠?
      그리고, 마지막에 255라고 넣었을때 이건 계속 HIGH 인 상태를 의미하나요? 이 위치도 기존 다른 예제의 HIGH 위치와는 다르네요? 위치가 다른 이유가 뭘까요?