by Rob Toulson and Tim Wilmshurst from textbook "Fast and Effective Embedded Systems Design: Applying the ARM mbed"
main.cpp@0:581963db97d8, 2013-06-16 (annotated)
- 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?
User | Revision | Line number | New 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 |