Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Tue Jul 12 2022 13:22:00 by
1.7.2