이 예제는 PWM을 이용해 buzzer를 울리는 실습에 관한 것이다. PWM은 Pulse Width Modulation의 약자이다. 특정한 펄스의 폭을 가진 디지털 파형을 만드는 데 사용이된다. WIZwiki 보드의 W7500 칩 내부의 PWM 모듈을 설정하면 다양한 파형을 만들 수 있다. PWM을 이용해 높낮이가 다른 소리 출력, LED 밝기 조절, 모터 구동 등을 할 수 있다.
예제 코드이다. mbed 환경에서 main.c에 아래 code를 복사해 붙여넣기 한 후 컴파일한다.
#include "mbed.h" #define VOLUME 0.02 #define BPM 100.0 PwmOut pwm_pin(D3); // Plays a sound with the defined frequency, duration, and volume void playNote(float frequency, float duration, float volume) { pwm_pin.period(1.0/frequency); pwm_pin = volume/2.0; wait(duration); pwm_pin = 0.0; } int main() { float beat_duration; // Calculate duration of a quarter note from bpm beat_duration = 60.0 / BPM; // Loop forever while(1) { playNote(261.626, (0.75 * beat_duration), VOLUME); playNote(329.628, (0.75 * beat_duration), VOLUME); playNote(391.995, (0.75 * beat_duration), VOLUME); playNote(261.626, (0.75 * beat_duration), VOLUME); playNote(329.628, (0.75 * beat_duration), VOLUME); playNote(391.995, (0.75 * beat_duration), VOLUME); playNote(440.000, (0.75 * beat_duration), VOLUME); playNote(440.000, (0.75 * beat_duration), VOLUME); playNote(440.000, (0.75 * beat_duration), VOLUME); playNote(391.995, ((2 * beat_duration) - 0.1), VOLUME); wait(0.1); playNote(349.228, (0.75 * beat_duration), VOLUME); playNote(349.228, (0.75 * beat_duration), VOLUME); playNote(349.228, (0.75 * beat_duration), VOLUME); playNote(329.628, (0.75 * beat_duration), VOLUME); playNote(329.628, (0.75 * beat_duration), VOLUME); playNote(329.628, (0.75 * beat_duration), VOLUME); playNote(293.665, (0.75 * beat_duration), VOLUME); playNote(293.665, (0.75 * beat_duration), VOLUME); playNote(293.665, (0.75 * beat_duration), VOLUME); //playNote(261.626, ((2 * beat_duration) - 0.1), VOLUME); playNote(261.626, ((3 * beat_duration) - 0.1), VOLUME); wait(0.1); } }
코드를 실행시키면, PWM 디지털 신호가 부저를 울려 간단한 음악이 연주된다.