Testing PWM with a speaker

Dependencies:   mbed

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
            }
        }
    }
}