by Rob Toulson and Tim Wilmshurst from textbook "Fast and Effective Embedded Systems Design: Applying the ARM mbed"

Dependencies:   mbed

Committer:
robt
Date:
Sun Jun 16 15:19:06 2013 +0000
Revision:
0:581963db97d8
by Rob Toulson and Tim Wilmshurst from textbook "Fast and Effective Embedded Systems Design: Applying the ARM mbed"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
robt 0:581963db97d8 1 /* Program Example 11.3 Delay / Echo Effect
robt 0:581963db97d8 2 */
robt 0:581963db97d8 3 #include "mbed.h"
robt 0:581963db97d8 4 AnalogIn Ain(p15); //object definitions
robt 0:581963db97d8 5 AnalogOut Aout(p18);
robt 0:581963db97d8 6 AnalogIn delay_pot(p16);
robt 0:581963db97d8 7 AnalogIn feedback_pot(p17);
robt 0:581963db97d8 8 Ticker s20khz_tick;
robt 0:581963db97d8 9 void s20khz_task(void); // function prototypes
robt 0:581963db97d8 10 #define MAX_BUFFER 14000 // max data samples
robt 0:581963db97d8 11 signed short data_in; // signed allows positive and negative
robt 0:581963db97d8 12 unsigned short data_out; // unsigned just allows positive values
robt 0:581963db97d8 13 float delay=0;
robt 0:581963db97d8 14 float feedback=0;
robt 0:581963db97d8 15 signed short buffer[MAX_BUFFER]={0}; // define buffer and set values to 0
robt 0:581963db97d8 16 int i=0;
robt 0:581963db97d8 17
robt 0:581963db97d8 18 //main program start here
robt 0:581963db97d8 19 int main() {
robt 0:581963db97d8 20 s20khz_tick.attach_us(&s20khz_task,50);
robt 0:581963db97d8 21 }
robt 0:581963db97d8 22 // function 20khz_task
robt 0:581963db97d8 23 void s20khz_task(void){
robt 0:581963db97d8 24 data_in=Ain.read_u16()-0x7FFF; // read data and normalise
robt 0:581963db97d8 25 buffer[i]=data_in+(buffer[i]*feedback); // add data to buffer data
robt 0:581963db97d8 26 data_out=buffer[i]+0x7FFF; // output buffer data value
robt 0:581963db97d8 27 Aout.write_u16(data_out); // write output
robt 0:581963db97d8 28 if (i>(delay)){ // if delay loop has completed
robt 0:581963db97d8 29 i=0; // reset counter
robt 0:581963db97d8 30 delay=delay_pot*MAX_BUFFER; // calculate new delay buffer size
robt 0:581963db97d8 31 feedback=(1-feedback_pot)*0.9; // calculate feedback gain value
robt 0:581963db97d8 32 }else{
robt 0:581963db97d8 33 i=i+1; // otherwise increment delay counter
robt 0:581963db97d8 34 }
robt 0:581963db97d8 35 }
robt 0:581963db97d8 36