![](/media/cache/profiles/d3b154a6afe99c7d4f2b3fa23962a134.jpg.50x50_q85.png)
Testing PWM with a speaker
main.cpp
- Committer:
- ffxx68
- Date:
- 2015-01-08
- Revision:
- 1:aa7cd19c6a4f
- Parent:
- 0:b82c05c12d48
- Child:
- 2:ad1ac14ce44a
File content as of revision 1:aa7cd19c6a4f:
#include "mbed.h" DigitalOut my_led(LED1); InterruptIn my_button(USER_BUTTON); PwmOut my_speaker(PB_3); // Speaker outut on PB 3 // Configuration for sinewave #define PI (3.141592653589793238462) #define AMPLITUDE (1.0) // x * 3.3V #define PHASE (PI * 1) // 2*pi is one period #define RANGE (4096/2) // 12 bits DAC #define OFFSET (4096/2) // 12 bits DAC #define BUFFER_SIZE (360) uint16_t buffer[BUFFER_SIZE]; void calculate_sinewave(void){ for (int i = 0; i < BUFFER_SIZE; i++) { double rads = (PI * i)/180.0; // Convert degree in radian buffer[i] = (uint16_t)(AMPLITUDE * (RANGE * (cos(rads + PHASE))) + OFFSET); } } void pressed() { // change mode my_led = !my_led; } int main() { my_speaker.period_ms(5); // PWM initial frequency: 200Hz my_speaker.write(0); // Set duty to null, initially my_led = 1; // turn on led and action my_button.fall(&pressed); // Set button action calculate_sinewave(); // Fill in the sinewave buffer while(1) { if (my_led) { // play a continuos square wave my_speaker.period_ms(2); // Frequency 500Hz my_speaker.write(0.5); // Duty to 50% } else { // play a sinewave my_speaker.period_us(5); // PWM frequency: 200KHz for (int i = 0; i < BUFFER_SIZE; i++) { my_speaker.write( buffer[i] / (RANGE + OFFSET) ); // duty = sound amplitude wait_us(50); // period: 360*50us -> 1350 Hz sinusoid } } } }