Fabio Fumi / Mbed 2 deprecated Nucleo_pwm_speaker

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 DigitalOut  my_led(LED1);
00004 InterruptIn my_button(USER_BUTTON);
00005 PwmOut      my_speaker(PA_0); // Speaker output PWM2/1
00006 Ticker      led_flash;
00007 
00008 // Configuration for sinewave
00009 #define PI        (3.141592653589793238462)
00010 #define AMPLITUDE (1.0)    // x * 3.3V
00011 #define PHASE     (PI * 1) // 2*pi is one period
00012 //#define RANGE     (4096/2) // for a 12 bits DAC
00013 //#define OFFSET    (4096/2) // for a 12 bits DAC
00014 #define RANGE     (10) // for 0-20 range
00015 #define OFFSET    (10) // for 0-20 range
00016 #define BUFFER_SIZE (50)
00017 int    buffer[BUFFER_SIZE];
00018 int    mode = 0;
00019 
00020 // Fill sinewave buffer
00021 void calculate_sinewave(void){
00022   for (int i = 0; i < BUFFER_SIZE; i++) {
00023      float rads = PI * i * 360 / BUFFER_SIZE / 180.0; // Convert degree in radian
00024      buffer[i] = OFFSET + AMPLITUDE * RANGE * cos(rads + PHASE);
00025      // printf ("%d\n", buffer[i]);
00026   }
00027 }
00028 
00029 void pressed() {
00030 
00031     my_led = !my_led;
00032     
00033     // change mode
00034     if (mode < 2) mode++;
00035     else mode = 0;
00036     
00037     if (!mode) {
00038         printf ("mute\n");
00039         my_speaker=0.0; // turn off PWM
00040     }
00041     else if (mode == 1){
00042         printf ("square wave\n");
00043         my_speaker.period_ms(2); // Frequency 500 Hz
00044         my_speaker.write(0.5); // Duty Cycle to 50% (max volume)
00045     } else if (mode == 2){
00046         printf ("sine wave\n");
00047         my_speaker.period_us(20); // PWM frequency 50Khz
00048         my_speaker.write(0); // swith off initially
00049     } 
00050 }
00051 
00052 int main()
00053 {
00054     int i;
00055     
00056     my_speaker.period_ms(5); // PWM initial frequency: 200Hz 
00057     my_speaker.write(0); // Set duty to null, initially (mute)
00058     my_led = 1; // set mode 1
00059     my_button.fall(&pressed); // Set button action
00060     calculate_sinewave(); // Fill in the sinewave buffer
00061 
00062     printf ("PWM speaker driver example\n");
00063     
00064     // intro beeps
00065     for (i=0; i<3; i++) {
00066         my_speaker.period_ms(2); // 500Hz
00067         my_speaker.write(0.25); //25% duty cycle - mid range volume
00068         wait(.02);
00069         my_speaker=0.0; // turn off audio
00070         wait(0.5);
00071     }
00072     
00073     while(1) {
00074         if (mode == 2) {
00075             // play one cycle of a sinewave
00076             for (int i = 0; i < BUFFER_SIZE; i++) {
00077                 my_speaker.pulsewidth_us ( buffer[i] ); // sweep duty with waveform
00078                 wait_us(2); // waveform period: BUFFER_SIZE*delay
00079             }
00080         }
00081         else if (mode == 1) {
00082             // square wave - nop
00083             wait(0.2);
00084         }
00085     }
00086 }