Embedded Lecture/Arduino2017. 3. 20. 21:03


Arduino Uno 보드의 디지털 핀은 '1'과 '0'의 진리값만을 출력할 수 있습니다. Uno 보드의 전원 전압이 5V이라면 'HIGH' 값으로 5V 그리고 'LOW' 값으로 0V를 출력한다는 것입니다. 그렇다면 아날로그 물리량은 나타낼 수가 없는 것일까요? 디지털 값을 아날로그 물리량으로 나타낼 수 있는 것이 있는데, 이를 DAC(Digital to Analog Converter)라 부릅니다. 하지만 Uno 보드의 메인칩인 ATmega328은 이 DAC를 탑재하지 않습니다(정교한 아날로그 물리량의 표현이 요구된다면 외장 DAC를 사용할 수 있습니다).


그렇다면 외부에서 DAC를 사용해야 하지만 정밀한 아날로그 물리량을 요구하지 않는 경우에, Uno 보드의 PWM 기능을 이용하여 아날로그 물리량을 표현할 수 있다는 것입니다. PWM(Pulse Width Modulation, 펄스 폭 변조)이란 5V와 0V를 교대로 이루어진 구형파(펄스) 신호를 출력하고 5V인 구간의 폭을 구형파 주기 내에서 변화시킴으로서 외부에서는 마치 0~5V까지 변하는 것처럼 보이게 한다는 것입이다.



위 그림에서 모든 구형파의 주기(T)는 동일하지만 출력이 HIGH인 구간인 구형파의 폭(width)이 점점 증가합니다. 만일 외부에서 디지털 출력 핀을 바라다 볼 때, 구형파의 주기(T)가 충분히 작거나 혹은 주파수(f=1/T)가 충분히 높다면, 구형파의 HIGH인 구간의 폭을 증가시킴에 따라 출력 전압도 증가하는 것처럼 보일 것입니다. 


즉, 이 구형파의 주파수를 높게 하면 상대적으로 반응 속도가 느린 모터 등과 같은 기계 장치는 이것을 아날로그 전압으로 착각하게 된다는 것입니다. 이 주파수는 Uno인 경우 490Hz 혹은 980Hz이며, HIGH인 구간 대비 LOW인 구간의 비율을 듀티비(Duty)라 부릅니다. Arduino의 모든 핀이 PWM 출력을 낼 수 있는 것은 아닙니다. Uno 보드의 경우 3, 5, 6, 9, 10, 11번 핀이 PWM 출력을 낼 수 있으며 보드상에 '~'로 표시됩니다. 이와 같은 디지털 핀의 펄스 폭 변조는 굳이 메인칩이 PWM 기능을 제공하지 않더라도 펌웨어 상에서 구현할 수 있습니다. 그러나 인터럽트나 CPU 타임을 일정부분 할애하기 때문에 코딩이 복잡해지고 효율성이 떨어지게 됩니다.



Uno 보드의 PWM의 동작 주파수는 다음과 같습니다. 

        • 3, 9, 10, 11번 핀 - 490Hz

        • 5, 6번 핀 – 980Hz


Uno 보드의 PWM 기능을 사용하기 위해서는 analogWrite() 함수를 이용하는데, 첫 번째 인수는 아날로그 핀의 번호(3, 5, 6, 9, 10, 11 중 하나)이며 두번째 인수는 0~255 사이의 정수로써 256 레벨의 듀티비를 의미합니다.



Posted by Nature & Life