ECE 4180 - Mid mini project, lab 4

Dependencies:   Motor Servo mbed

Committer:
ckabuloglu
Date:
Mon Mar 13 16:08:11 2017 +0000
Revision:
0:d9d5943dfa45
intial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ckabuloglu 0:d9d5943dfa45 1 class Speaker
ckabuloglu 0:d9d5943dfa45 2 {
ckabuloglu 0:d9d5943dfa45 3 public:
ckabuloglu 0:d9d5943dfa45 4 Speaker(PinName pin) : _pin(pin) {
ckabuloglu 0:d9d5943dfa45 5 // _pin(pin) means pass pin to the Speaker Constructor
ckabuloglu 0:d9d5943dfa45 6 // precompute 32 sample points on one sine wave cycle
ckabuloglu 0:d9d5943dfa45 7 // used for continuous sine wave output later
ckabuloglu 0:d9d5943dfa45 8 for(int k=0; k<32; k++) {
ckabuloglu 0:d9d5943dfa45 9 Analog_out_data[k] = int (65536.0 * ((1.0 + sin((float(k)/32.0*6.28318530717959)))/2.0));
ckabuloglu 0:d9d5943dfa45 10 // scale the sine wave to 16-bits - as needed for AnalogOut write_u16 arg
ckabuloglu 0:d9d5943dfa45 11 }
ckabuloglu 0:d9d5943dfa45 12
ckabuloglu 0:d9d5943dfa45 13 }
ckabuloglu 0:d9d5943dfa45 14 // class method to play a note based on AnalogOut class
ckabuloglu 0:d9d5943dfa45 15 void PlayNote(float frequency, float duration, float volume) {
ckabuloglu 0:d9d5943dfa45 16 // scale samples using current volume level arg
ckabuloglu 0:d9d5943dfa45 17 for(int k=0; k<32; k++) {
ckabuloglu 0:d9d5943dfa45 18 Analog_scaled_data[k] = Analog_out_data[k] * volume;
ckabuloglu 0:d9d5943dfa45 19 }
ckabuloglu 0:d9d5943dfa45 20 // reset to start of sample array
ckabuloglu 0:d9d5943dfa45 21 i=0;
ckabuloglu 0:d9d5943dfa45 22 // turn on timer interrupts to start sine wave output
ckabuloglu 0:d9d5943dfa45 23 Sample_Period.attach(this, &Speaker::Sample_timer_interrupt, 1.0/(frequency*32.0));
ckabuloglu 0:d9d5943dfa45 24 // play note for specified time
ckabuloglu 0:d9d5943dfa45 25 wait(duration);
ckabuloglu 0:d9d5943dfa45 26 // turns off timer interrupts
ckabuloglu 0:d9d5943dfa45 27 Sample_Period.detach();
ckabuloglu 0:d9d5943dfa45 28 // sets output to mid range - analog zero
ckabuloglu 0:d9d5943dfa45 29 this->_pin.write_u16(32768);
ckabuloglu 0:d9d5943dfa45 30
ckabuloglu 0:d9d5943dfa45 31 }
ckabuloglu 0:d9d5943dfa45 32 private:
ckabuloglu 0:d9d5943dfa45 33 // sets up specified pin for analog using AnalogOut class
ckabuloglu 0:d9d5943dfa45 34 AnalogOut _pin;
ckabuloglu 0:d9d5943dfa45 35 // set up a timer to be used for sample rate interrupts
ckabuloglu 0:d9d5943dfa45 36 Ticker Sample_Period;
ckabuloglu 0:d9d5943dfa45 37
ckabuloglu 0:d9d5943dfa45 38 //variables used by interrupt routine and PlayNote
ckabuloglu 0:d9d5943dfa45 39 volatile int i;
ckabuloglu 0:d9d5943dfa45 40 short unsigned Analog_out_data[32];
ckabuloglu 0:d9d5943dfa45 41 short unsigned Analog_scaled_data[32];
ckabuloglu 0:d9d5943dfa45 42
ckabuloglu 0:d9d5943dfa45 43 // Interrupt routine
ckabuloglu 0:d9d5943dfa45 44 // used to output next analog sample whenever a timer interrupt occurs
ckabuloglu 0:d9d5943dfa45 45 void Sample_timer_interrupt(void) {
ckabuloglu 0:d9d5943dfa45 46 // send next analog sample out to D to A
ckabuloglu 0:d9d5943dfa45 47 this->_pin.write_u16(Analog_scaled_data[i]);
ckabuloglu 0:d9d5943dfa45 48 // increment pointer and wrap around back to 0 at 32
ckabuloglu 0:d9d5943dfa45 49 i = (i+1) & 0x01F;
ckabuloglu 0:d9d5943dfa45 50 }
ckabuloglu 0:d9d5943dfa45 51 };
ckabuloglu 0:d9d5943dfa45 52