Alwyn Nixon-Lloyd
/
ribbonWithDDS
This uses a ribbon controller and a pressure sensor to control an onboard DDS generating tones
main.cpp@0:88f7ab41bdce, 2011-05-09 (annotated)
- Committer:
- zarquin
- Date:
- Mon May 09 03:43:21 2011 +0000
- Revision:
- 0:88f7ab41bdce
Version 0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
zarquin | 0:88f7ab41bdce | 1 | #include "mbed.h" |
zarquin | 0:88f7ab41bdce | 2 | |
zarquin | 0:88f7ab41bdce | 3 | DigitalOut myled(LED1); |
zarquin | 0:88f7ab41bdce | 4 | |
zarquin | 0:88f7ab41bdce | 5 | DigitalIn pushButton(p23); |
zarquin | 0:88f7ab41bdce | 6 | DigitalIn rotaryA(p21); |
zarquin | 0:88f7ab41bdce | 7 | DigitalIn rotaryB(p22); |
zarquin | 0:88f7ab41bdce | 8 | |
zarquin | 0:88f7ab41bdce | 9 | AnalogIn pressure(p20); |
zarquin | 0:88f7ab41bdce | 10 | AnalogIn pos1(p17); |
zarquin | 0:88f7ab41bdce | 11 | AnalogIn top(p16); |
zarquin | 0:88f7ab41bdce | 12 | AnalogIn bottom(p15); |
zarquin | 0:88f7ab41bdce | 13 | |
zarquin | 0:88f7ab41bdce | 14 | float wiper_f; |
zarquin | 0:88f7ab41bdce | 15 | float top_f; |
zarquin | 0:88f7ab41bdce | 16 | float bottom_f; |
zarquin | 0:88f7ab41bdce | 17 | float vol_f; |
zarquin | 0:88f7ab41bdce | 18 | float tmp_f; |
zarquin | 0:88f7ab41bdce | 19 | int tmp_i; |
zarquin | 0:88f7ab41bdce | 20 | |
zarquin | 0:88f7ab41bdce | 21 | float pressureAvg[4]; |
zarquin | 0:88f7ab41bdce | 22 | float wiperAvg[4]; |
zarquin | 0:88f7ab41bdce | 23 | |
zarquin | 0:88f7ab41bdce | 24 | AnalogOut signal(p18); |
zarquin | 0:88f7ab41bdce | 25 | |
zarquin | 0:88f7ab41bdce | 26 | Ticker sampleClock; |
zarquin | 0:88f7ab41bdce | 27 | // 16 entry sinewave table. |
zarquin | 0:88f7ab41bdce | 28 | char sineWave[]={127,175,216,244,255,244,216,175,127,78,37,9,0,9,36,78}; |
zarquin | 0:88f7ab41bdce | 29 | |
zarquin | 0:88f7ab41bdce | 30 | char sawWave[]={0,16,31,47,64,79,95,111,127,143,159,175,191,207,223,255}; |
zarquin | 0:88f7ab41bdce | 31 | |
zarquin | 0:88f7ab41bdce | 32 | unsigned int counter; |
zarquin | 0:88f7ab41bdce | 33 | unsigned int counterSum; |
zarquin | 0:88f7ab41bdce | 34 | unsigned int counterLimit = 2147483647; //31 bits 2^31 - 1 |
zarquin | 0:88f7ab41bdce | 35 | |
zarquin | 0:88f7ab41bdce | 36 | char temp; |
zarquin | 0:88f7ab41bdce | 37 | |
zarquin | 0:88f7ab41bdce | 38 | float byteToFloat(char in){ |
zarquin | 0:88f7ab41bdce | 39 | float i = in; |
zarquin | 0:88f7ab41bdce | 40 | return (i/255.0)*0.5; |
zarquin | 0:88f7ab41bdce | 41 | } |
zarquin | 0:88f7ab41bdce | 42 | |
zarquin | 0:88f7ab41bdce | 43 | void sample2(){ |
zarquin | 0:88f7ab41bdce | 44 | |
zarquin | 0:88f7ab41bdce | 45 | |
zarquin | 0:88f7ab41bdce | 46 | |
zarquin | 0:88f7ab41bdce | 47 | } |
zarquin | 0:88f7ab41bdce | 48 | |
zarquin | 0:88f7ab41bdce | 49 | void sample(){ |
zarquin | 0:88f7ab41bdce | 50 | |
zarquin | 0:88f7ab41bdce | 51 | //useing a 31 bit counter. |
zarquin | 0:88f7ab41bdce | 52 | counter = counter + counterSum; |
zarquin | 0:88f7ab41bdce | 53 | if(counter > counterLimit){ |
zarquin | 0:88f7ab41bdce | 54 | //wrap the counting. |
zarquin | 0:88f7ab41bdce | 55 | counter = counter - counterLimit; |
zarquin | 0:88f7ab41bdce | 56 | } |
zarquin | 0:88f7ab41bdce | 57 | |
zarquin | 0:88f7ab41bdce | 58 | //Fout = CounterSum*Fclk/MaxCount |
zarquin | 0:88f7ab41bdce | 59 | |
zarquin | 0:88f7ab41bdce | 60 | temp = counter>>27; //shift the top 4 bits down. |
zarquin | 0:88f7ab41bdce | 61 | //float x = temp; |
zarquin | 0:88f7ab41bdce | 62 | //signal.write(x/16.0); |
zarquin | 0:88f7ab41bdce | 63 | |
zarquin | 0:88f7ab41bdce | 64 | //write the output out |
zarquin | 0:88f7ab41bdce | 65 | signal.write(vol_f*byteToFloat(sineWave[temp]) +0.5); |
zarquin | 0:88f7ab41bdce | 66 | } |
zarquin | 0:88f7ab41bdce | 67 | |
zarquin | 0:88f7ab41bdce | 68 | int read_encoder() |
zarquin | 0:88f7ab41bdce | 69 | { |
zarquin | 0:88f7ab41bdce | 70 | int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0}; |
zarquin | 0:88f7ab41bdce | 71 | static char old_AB = 0; |
zarquin | 0:88f7ab41bdce | 72 | /**/ |
zarquin | 0:88f7ab41bdce | 73 | old_AB <<= 2; |
zarquin | 0:88f7ab41bdce | 74 | char x = rotaryA.read(); |
zarquin | 0:88f7ab41bdce | 75 | x<<=1; |
zarquin | 0:88f7ab41bdce | 76 | x = x+rotaryB.read(); //remember previous state |
zarquin | 0:88f7ab41bdce | 77 | old_AB |= ( x & 0x03 ); //add current state |
zarquin | 0:88f7ab41bdce | 78 | return ( enc_states[( old_AB & 0x0f )]); |
zarquin | 0:88f7ab41bdce | 79 | } |
zarquin | 0:88f7ab41bdce | 80 | |
zarquin | 0:88f7ab41bdce | 81 | int main() { |
zarquin | 0:88f7ab41bdce | 82 | |
zarquin | 0:88f7ab41bdce | 83 | //setup variables. |
zarquin | 0:88f7ab41bdce | 84 | tmp_i = 0; |
zarquin | 0:88f7ab41bdce | 85 | counter = 0; |
zarquin | 0:88f7ab41bdce | 86 | counterSum = 302365697; |
zarquin | 0:88f7ab41bdce | 87 | counterSum = 18897856; |
zarquin | 0:88f7ab41bdce | 88 | //counterSum = 1181116; |
zarquin | 0:88f7ab41bdce | 89 | //18897856.1 |
zarquin | 0:88f7ab41bdce | 90 | |
zarquin | 0:88f7ab41bdce | 91 | vol_f = 0.0; |
zarquin | 0:88f7ab41bdce | 92 | |
zarquin | 0:88f7ab41bdce | 93 | //hook up sample() to the ticker. run the counter at 50kHz |
zarquin | 0:88f7ab41bdce | 94 | sampleClock.attach_us(sample,20); |
zarquin | 0:88f7ab41bdce | 95 | |
zarquin | 0:88f7ab41bdce | 96 | while(1){ |
zarquin | 0:88f7ab41bdce | 97 | wiper_f = pos1.read(); |
zarquin | 0:88f7ab41bdce | 98 | bottom_f = bottom.read(); |
zarquin | 0:88f7ab41bdce | 99 | |
zarquin | 0:88f7ab41bdce | 100 | if(wiper_f >= bottom_f){ |
zarquin | 0:88f7ab41bdce | 101 | // wiper is being pressed, play a note |
zarquin | 0:88f7ab41bdce | 102 | top_f = top.read(); |
zarquin | 0:88f7ab41bdce | 103 | |
zarquin | 0:88f7ab41bdce | 104 | tmp_f = 1.0 - (wiper_f - bottom_f)/(top_f - bottom_f); |
zarquin | 0:88f7ab41bdce | 105 | |
zarquin | 0:88f7ab41bdce | 106 | vol_f = 1.0 - pressure.read(); |
zarquin | 0:88f7ab41bdce | 107 | //ribbon is about 3 octaves worth. |
zarquin | 0:88f7ab41bdce | 108 | //if the top is 440Hz = 18897856.1 |
zarquin | 0:88f7ab41bdce | 109 | //44Hz = 1889785.61 |
zarquin | 0:88f7ab41bdce | 110 | //55Hz is 2362232.013 //low A |
zarquin | 0:88f7ab41bdce | 111 | tmp_i = (int)(16535624*tmp_f); |
zarquin | 0:88f7ab41bdce | 112 | |
zarquin | 0:88f7ab41bdce | 113 | counterSum = 2362232+ tmp_i; |
zarquin | 0:88f7ab41bdce | 114 | |
zarquin | 0:88f7ab41bdce | 115 | }else{ |
zarquin | 0:88f7ab41bdce | 116 | vol_f = 0.0; |
zarquin | 0:88f7ab41bdce | 117 | } |
zarquin | 0:88f7ab41bdce | 118 | |
zarquin | 0:88f7ab41bdce | 119 | |
zarquin | 0:88f7ab41bdce | 120 | } |
zarquin | 0:88f7ab41bdce | 121 | } |