Capstone project files

Dependencies:   mbed-dsp mbed capstone_display_2

Committer:
ryanyuyu
Date:
Tue Apr 15 20:46:22 2014 +0000
Revision:
5:bc45ed158abf
Parent:
4:9ee3ae61db7f
Child:
6:8441a6864784
Latest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ryanyuyu 0:3aae5d23d0db 1 #include "mbed.h"
ryanyuyu 2:8ae58834937f 2 #include "FIR_f32.h"
ryanyuyu 0:3aae5d23d0db 3 #include "arm_math.h"
ryanyuyu 3:30dcfcf9412c 4 #include "display.h"
ryanyuyu 2:8ae58834937f 5 #define f_sampling 2000 //the sampling frequency
ryanyuyu 4:9ee3ae61db7f 6 #define NumTaps 27 //the number of filter coefficients
ryanyuyu 4:9ee3ae61db7f 7 #define BlockSize 512 //the size of the buffer
ryanyuyu 3:30dcfcf9412c 8
ryanyuyu 4:9ee3ae61db7f 9 Serial pc(USBTX, USBRX); //USB serial for PC, to be removed later
ryanyuyu 4:9ee3ae61db7f 10 AnalogOut waveOut(p18); //for debugging
ryanyuyu 4:9ee3ae61db7f 11
ryanyuyu 4:9ee3ae61db7f 12 //-------------------- SPI communication
ryanyuyu 3:30dcfcf9412c 13 SPI spi(p5, p6, p7);
ryanyuyu 3:30dcfcf9412c 14 DigitalOut cs(p8);
ryanyuyu 4:9ee3ae61db7f 15
ryanyuyu 4:9ee3ae61db7f 16 //-------------------- LCD display
ryanyuyu 3:30dcfcf9412c 17 ST7735_LCD disp( p14, p13, p12, p10, p11); //for digital display
ryanyuyu 3:30dcfcf9412c 18 display lcd(&disp);
ryanyuyu 2:8ae58834937f 19
ryanyuyu 4:9ee3ae61db7f 20 //-------------------- signal-related stuff
ryanyuyu 2:8ae58834937f 21 AnalogIn input(p15); //pin 15 for analog reading
ryanyuyu 2:8ae58834937f 22 float32_t waveform[BlockSize]; //array of input data
ryanyuyu 2:8ae58834937f 23 float32_t postFilterData[BlockSize]; //array of filtered data
ryanyuyu 2:8ae58834937f 24 bool fullRead; //whether the MBED has finish
ryanyuyu 2:8ae58834937f 25 bool waitForNext;
ryanyuyu 4:9ee3ae61db7f 26 int index_g; //tracks the index for the waveform array
ryanyuyu 2:8ae58834937f 27
ryanyuyu 4:9ee3ae61db7f 28 //-------------------the tuning constants for distance calculation
ryanyuyu 4:9ee3ae61db7f 29 float minThreshold;
ryanyuyu 4:9ee3ae61db7f 30 float maxThreshold;
ryanyuyu 4:9ee3ae61db7f 31 float gain1;
ryanyuyu 4:9ee3ae61db7f 32 float gain2;
ryanyuyu 4:9ee3ae61db7f 33 float c1;
ryanyuyu 4:9ee3ae61db7f 34 float c2;
ryanyuyu 4:9ee3ae61db7f 35 float c3;
ryanyuyu 3:30dcfcf9412c 36
ryanyuyu 4:9ee3ae61db7f 37 //------------------------the filter coefficients for FIR filter
ryanyuyu 2:8ae58834937f 38 float32_t pCoeffs[NumTaps] =
ryanyuyu 2:8ae58834937f 39 { 0.012000000000000, 0.012462263166161, -0.019562318415964, -0.026175892863747,
ryanyuyu 2:8ae58834937f 40 0.031654803781611, 0.050648026372209, -0.032547136829180, -0.070997780956819,
ryanyuyu 2:8ae58834937f 41 0.032992306874347, 0.094643188024724, -0.020568171368385, -0.106071176200193,
ryanyuyu 2:8ae58834937f 42 0.009515198320277, 0.114090808482376, 0.009515198320275, -0.106071176200193,
ryanyuyu 2:8ae58834937f 43 -0.020568171368382, 0.094643188024728, 0.032992306874351, -0.070997780956815,
ryanyuyu 2:8ae58834937f 44 -0.032547136829177, 0.050648026372211, 0.031654803781612, -0.026175892863746,
ryanyuyu 2:8ae58834937f 45 -0.019562318415964, 0.012462263166161, 0.012000000000000 };
ryanyuyu 4:9ee3ae61db7f 46 float32_t pState[NumTaps + BlockSize - 1];
ryanyuyu 3:30dcfcf9412c 47 // */
ryanyuyu 4:9ee3ae61db7f 48
ryanyuyu 4:9ee3ae61db7f 49
ryanyuyu 4:9ee3ae61db7f 50 //-----------------------IIR stuff (if needed)
ryanyuyu 4:9ee3ae61db7f 51 /*
ryanyuyu 4:9ee3ae61db7f 52 float32_t pkCoeffs[NumTaps] =
ryanyuyu 4:9ee3ae61db7f 53 {
ryanyuyu 4:9ee3ae61db7f 54 1,-2.496708288,3.17779085,-2.022333713,0.6561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ryanyuyu 4:9ee3ae61db7f 55 };
ryanyuyu 4:9ee3ae61db7f 56
ryanyuyu 4:9ee3ae61db7f 57 float32_t pvCoeffs[NumTaps] =
ryanyuyu 4:9ee3ae61db7f 58 {
ryanyuyu 4:9ee3ae61db7f 59 0.0000556000,0.0002167120,0.0004326320,0.0005056930,0.0002111890,-0.0004911030,-0.0013071920,-0.0017060250,-0.0012444070,0.0000684000,0.0016603140,0.0026622100,0.0024306750,0.0009787140,-0.0009787140,-0.0024306750,-0.0026622100,-0.0016603140,-0.0000684000,0.0012444070,0.0017060250,0.0013071920,0.0004911030,-0.0002111890,-0.0005056930,-0.0004326320,-0.0002167120,-0.0000556000
ryanyuyu 4:9ee3ae61db7f 60 };
ryanyuyu 4:9ee3ae61db7f 61 float32_t pState[NumTaps + BlockSize];
ryanyuyu 4:9ee3ae61db7f 62 //*/
ryanyuyu 4:9ee3ae61db7f 63
ryanyuyu 4:9ee3ae61db7f 64
ryanyuyu 4:9ee3ae61db7f 65 //--------------------------------if needed, the 4kHz FIR filter
ryanyuyu 3:30dcfcf9412c 66 /*
ryanyuyu 3:30dcfcf9412c 67 float32_t pCoeffs[NumTaps] =
ryanyuyu 3:30dcfcf9412c 68 {
ryanyuyu 3:30dcfcf9412c 69 -0.00130297171184699, -0.00456436168827987, -0.00757978930408609, -0.00696944302000657,
ryanyuyu 3:30dcfcf9412c 70 -0.00100059082174453, 0.00812867271498616, 0.0148953048520266, 0.0137935053264369,
ryanyuyu 3:30dcfcf9412c 71 0.00350484996910501, -0.0112195199182290, -0.0216305356563913, -0.0202538386423356,
ryanyuyu 3:30dcfcf9412c 72 -0.00609419278464673, 0.0137348990478646, 0.0275645559768492, 0.0261107576153156,
ryanyuyu 3:30dcfcf9412c 73 0.00866220574766616, -0.0156131009924596, -0.0324957126350438, -0.0311514181527343,
ryanyuyu 3:30dcfcf9412c 74 -0.0110879396617141, 0.0168179120126559, 0.0362758644669149, 0.0352058948414930,
ryanyuyu 3:30dcfcf9412c 75 0.0132978095684398, -0.0172706692984796, -0.0386711719606551, -0.0379507530937637,
ryanyuyu 3:30dcfcf9412c 76 -0.0149419841919419, 0.0172996706397712, 0.0400000000000000, 0.0397279151377323,
ryanyuyu 3:30dcfcf9412c 77 0.0164353142069562, -0.0164055618588934, -0.0396949785867063, -0.0399629114640568,
ryanyuyu 3:30dcfcf9412c 78 -0.0172605211576678, 0.0149790280104299, 0.0379815311949588, 0.0386933807609119,
ryanyuyu 3:30dcfcf9412c 79 0.0172844840085185, -0.0132904115318555, -0.0352024033389307, -0.0362742608690452,
ryanyuyu 3:30dcfcf9412c 80 -0.0168170401765007, 0.0110885383139611, 0.0311518509994083, 0.0324959946809230,
ryanyuyu 3:30dcfcf9412c 81 0.0156132578212073, -0.00866213238945794, -0.0261107291487171, -0.0275645472357883,
ryanyuyu 3:30dcfcf9412c 82 -0.0137348973043660, 0.00609419268963993, 0.0202538383407381, 0.0216305354798053,
ryanyuyu 3:30dcfcf9412c 83 0.0112195198475825, -0.00350484999121515, -0.0137935053321021, -0.0148953048532365,
ryanyuyu 3:30dcfcf9412c 84 -0.00812867271519995, 0.00100059082171422, 0.00696944302000319, 0.00757978930408577,
ryanyuyu 3:30dcfcf9412c 85 0.00456436168827984, 0.00130297171184699
ryanyuyu 3:30dcfcf9412c 86 };
ryanyuyu 3:30dcfcf9412c 87 //*/
ryanyuyu 4:9ee3ae61db7f 88
ryanyuyu 2:8ae58834937f 89
ryanyuyu 2:8ae58834937f 90
ryanyuyu 0:3aae5d23d0db 91
ryanyuyu 2:8ae58834937f 92
ryanyuyu 4:9ee3ae61db7f 93 /*
ryanyuyu 4:9ee3ae61db7f 94 This is a helper function for precision timing of Tickers
ryanyuyu 4:9ee3ae61db7f 95 */
ryanyuyu 2:8ae58834937f 96 void readPoint()
ryanyuyu 2:8ae58834937f 97 {
ryanyuyu 2:8ae58834937f 98 waitForNext = false;
ryanyuyu 2:8ae58834937f 99 }
ryanyuyu 2:8ae58834937f 100
ryanyuyu 2:8ae58834937f 101
ryanyuyu 2:8ae58834937f 102 /**
ryanyuyu 2:8ae58834937f 103 * This function reads one full set of analog data into the uC
ryanyuyu 2:8ae58834937f 104 */
ryanyuyu 2:8ae58834937f 105 void readSamples()
ryanyuyu 2:8ae58834937f 106 {
ryanyuyu 2:8ae58834937f 107 Ticker sampler; //allows for precision data reading
ryanyuyu 2:8ae58834937f 108 waitForNext = true;
ryanyuyu 2:8ae58834937f 109 sampler.attach_us(&readPoint, (int) (1000000/f_sampling) ); //read in data according the sampling freq
ryanyuyu 2:8ae58834937f 110 for (int i = 0; i < BlockSize; i++)
ryanyuyu 2:8ae58834937f 111 {
ryanyuyu 2:8ae58834937f 112 while (waitForNext); //wait until the ticker calls for the next sample
ryanyuyu 2:8ae58834937f 113 waveform[i] = input.read();
ryanyuyu 2:8ae58834937f 114 waitForNext = true;
ryanyuyu 2:8ae58834937f 115 }
ryanyuyu 2:8ae58834937f 116 sampler.detach();
ryanyuyu 2:8ae58834937f 117 }
ryanyuyu 3:30dcfcf9412c 118
ryanyuyu 4:9ee3ae61db7f 119 /**
ryanyuyu 4:9ee3ae61db7f 120 This function spits out the waveform on the analogOut pin (p18)
ryanyuyu 4:9ee3ae61db7f 121 This function will be unused in the final version, but is still usefull for debugging.
ryanyuyu 4:9ee3ae61db7f 122 @param array (float32_t *): (array of data) pointer to the data to output over the analogOut pin
ryanyuyu 4:9ee3ae61db7f 123 @return none
ryanyuyu 4:9ee3ae61db7f 124 */
ryanyuyu 4:9ee3ae61db7f 125 void outputWaveform(float32_t* array)
ryanyuyu 3:30dcfcf9412c 126 {
ryanyuyu 3:30dcfcf9412c 127 Ticker outputter;
ryanyuyu 3:30dcfcf9412c 128 waitForNext = true;
ryanyuyu 3:30dcfcf9412c 129 outputter.attach_us(&readPoint, (int) (1000000/f_sampling) ); //output data according the sampling freq
ryanyuyu 3:30dcfcf9412c 130 for (int i = 0; i < BlockSize; i++)
ryanyuyu 3:30dcfcf9412c 131 {
ryanyuyu 3:30dcfcf9412c 132 while (waitForNext); //wait until the ticker calls for the next data point
ryanyuyu 4:9ee3ae61db7f 133 waveOut.write(array[i]);
ryanyuyu 3:30dcfcf9412c 134 waitForNext = true;
ryanyuyu 3:30dcfcf9412c 135 }
ryanyuyu 3:30dcfcf9412c 136 outputter.detach();
ryanyuyu 3:30dcfcf9412c 137 }
ryanyuyu 3:30dcfcf9412c 138
ryanyuyu 4:9ee3ae61db7f 139 /*
ryanyuyu 4:9ee3ae61db7f 140 This method writes to the digital potentiometer (MCP4251)
ryanyuyu 4:9ee3ae61db7f 141 @param wiperNo (int): this is the wiper number to write to (either 0 or 1)
ryanyuyu 4:9ee3ae61db7f 142 @param kOhms (float): this is the value to set the resistance (in kilo Ohms) between the wiper and terminal B
ryanyuyu 4:9ee3ae61db7f 143 note
ryanyuyu 4:9ee3ae61db7f 144 @return: the integer command actually sent (for debugging)
ryanyuyu 4:9ee3ae61db7f 145 */
ryanyuyu 4:9ee3ae61db7f 146 int setPot(int wiperNo, float kOhms)
ryanyuyu 3:30dcfcf9412c 147 {
ryanyuyu 3:30dcfcf9412c 148 //257 steps (8 bits + 1), see section 7.0 for SPI instructions
ryanyuyu 3:30dcfcf9412c 149 float Rmax = 100000;
ryanyuyu 3:30dcfcf9412c 150 spi.frequency(2000000);
ryanyuyu 3:30dcfcf9412c 151 spi.format(16, 0); //16 bits, mode b00
ryanyuyu 3:30dcfcf9412c 152 float ratio = kOhms * 1000.0 / Rmax;
ryanyuyu 3:30dcfcf9412c 153 if (ratio > 1) ratio = 1;
ryanyuyu 3:30dcfcf9412c 154 if (ratio < 0) ratio = 0;
ryanyuyu 3:30dcfcf9412c 155 int dataBits = (int) (ratio * 0x100);
ryanyuyu 3:30dcfcf9412c 156 int command = wiperNo << 12; //setting the Address and Command bits
ryanyuyu 4:9ee3ae61db7f 157 command += dataBits; //add in the data bits (digital settings)
ryanyuyu 3:30dcfcf9412c 158 spi.write(command);
ryanyuyu 3:30dcfcf9412c 159 return command;
ryanyuyu 3:30dcfcf9412c 160 }
ryanyuyu 3:30dcfcf9412c 161
ryanyuyu 4:9ee3ae61db7f 162 /*
ryanyuyu 4:9ee3ae61db7f 163 This function calculates the RMS (root mean squared) of an array of float data.
ryanyuyu 4:9ee3ae61db7f 164 @param array (float32_t *): the array to calculate RMS from
ryanyuyu 4:9ee3ae61db7f 165 @return float_32: the resulting RMS value of the given array
ryanyuyu 4:9ee3ae61db7f 166 */
ryanyuyu 4:9ee3ae61db7f 167 float32_t rms(float32_t* array)
ryanyuyu 3:30dcfcf9412c 168 {
ryanyuyu 3:30dcfcf9412c 169 float32_t rms = 0;
ryanyuyu 3:30dcfcf9412c 170 for(int i = 0; i < BlockSize; i++)
ryanyuyu 3:30dcfcf9412c 171 {
ryanyuyu 4:9ee3ae61db7f 172 rms += array[i]*array[i];
ryanyuyu 3:30dcfcf9412c 173 }
ryanyuyu 4:9ee3ae61db7f 174 //pc.printf("Sum of squares %f\n\r", rms);
ryanyuyu 3:30dcfcf9412c 175 return sqrt(rms/BlockSize);
ryanyuyu 3:30dcfcf9412c 176 }
ryanyuyu 4:9ee3ae61db7f 177
ryanyuyu 4:9ee3ae61db7f 178 void calibrate()
ryanyuyu 4:9ee3ae61db7f 179 {
ryanyuyu 4:9ee3ae61db7f 180 gain1 = 1.0;
ryanyuyu 4:9ee3ae61db7f 181 gain2 = 25.0;
ryanyuyu 4:9ee3ae61db7f 182 minThreshold = .0275;
ryanyuyu 4:9ee3ae61db7f 183 maxThreshold = .1850;
ryanyuyu 4:9ee3ae61db7f 184 }
ryanyuyu 4:9ee3ae61db7f 185
ryanyuyu 4:9ee3ae61db7f 186 int adjustGains(float estimate)
ryanyuyu 4:9ee3ae61db7f 187 {
ryanyuyu 4:9ee3ae61db7f 188 if (estimate < minThreshold)
ryanyuyu 4:9ee3ae61db7f 189 {
ryanyuyu 4:9ee3ae61db7f 190 if (gain2 < 100) //post amp not yet maxed
ryanyuyu 4:9ee3ae61db7f 191 {
ryanyuyu 4:9ee3ae61db7f 192
ryanyuyu 4:9ee3ae61db7f 193 }
ryanyuyu 4:9ee3ae61db7f 194 else;
ryanyuyu 4:9ee3ae61db7f 195 }
ryanyuyu 4:9ee3ae61db7f 196 else if (estimate > maxThreshold)
ryanyuyu 4:9ee3ae61db7f 197 {
ryanyuyu 4:9ee3ae61db7f 198
ryanyuyu 4:9ee3ae61db7f 199 }
ryanyuyu 2:8ae58834937f 200
ryanyuyu 4:9ee3ae61db7f 201 }
ryanyuyu 4:9ee3ae61db7f 202
ryanyuyu 4:9ee3ae61db7f 203 float estimateDistance(float estimate)
ryanyuyu 4:9ee3ae61db7f 204 {
ryanyuyu 4:9ee3ae61db7f 205 return estimate;
ryanyuyu 4:9ee3ae61db7f 206 }
ryanyuyu 0:3aae5d23d0db 207
ryanyuyu 0:3aae5d23d0db 208 int main() {
ryanyuyu 4:9ee3ae61db7f 209 //arm_iir_lattice_instance_f32* filter1 = new arm_iir_lattice_instance_f32();
ryanyuyu 4:9ee3ae61db7f 210 arm_fir_instance_f32* filter = new arm_fir_instance_f32();
ryanyuyu 5:bc45ed158abf 211 float* history; //history of RMS voltages.
ryanyuyu 5:bc45ed158abf 212 int index_h = 0;
ryanyuyu 4:9ee3ae61db7f 213 int state = 0; //which state of the state machine to be in, change to enum if desired
ryanyuyu 2:8ae58834937f 214
ryanyuyu 2:8ae58834937f 215 uint16_t numTaps = NumTaps;
ryanyuyu 2:8ae58834937f 216 uint32_t blockSize = BlockSize;
ryanyuyu 3:30dcfcf9412c 217 char buffer[32]; //for debugging scanf things
ryanyuyu 4:9ee3ae61db7f 218 char* outputString; //string to be printed to the LCD display (or other output)
ryanyuyu 3:30dcfcf9412c 219 float32_t estimate = 0;
ryanyuyu 2:8ae58834937f 220 while(1)
ryanyuyu 2:8ae58834937f 221 {
ryanyuyu 2:8ae58834937f 222 //pc.printf("While loop\n\r");
ryanyuyu 2:8ae58834937f 223 switch(state)
ryanyuyu 2:8ae58834937f 224 {
ryanyuyu 2:8ae58834937f 225 case 0: //initialization
ryanyuyu 4:9ee3ae61db7f 226 calibrate();
ryanyuyu 5:bc45ed158abf 227
ryanyuyu 5:bc45ed158abf 228 for (int i = 0; i < NumTaps; i++)
ryanyuyu 5:bc45ed158abf 229 {
ryanyuyu 5:bc45ed158abf 230 pCoeffs[i] *= 1.3;
ryanyuyu 5:bc45ed158abf 231 }
ryanyuyu 5:bc45ed158abf 232
ryanyuyu 2:8ae58834937f 233 arm_fir_init_f32(filter, numTaps, pCoeffs, pState, blockSize);
ryanyuyu 4:9ee3ae61db7f 234 //arm_iir_lattice_init_f32(filter1, numTaps, pkCoeffs, pvCoeffs, pState, blockSize);
ryanyuyu 2:8ae58834937f 235 //pc.printf("Pre-attachment");
ryanyuyu 3:30dcfcf9412c 236 spi.frequency(1000000);
ryanyuyu 4:9ee3ae61db7f 237 setPot(1, gain1);
ryanyuyu 4:9ee3ae61db7f 238 setPot(0, gain2);
ryanyuyu 2:8ae58834937f 239 state = 1;
ryanyuyu 2:8ae58834937f 240 pc.printf("Done with init.\n\r");
ryanyuyu 2:8ae58834937f 241 break;
ryanyuyu 2:8ae58834937f 242
ryanyuyu 2:8ae58834937f 243 case 1: //read data, take samples
ryanyuyu 5:bc45ed158abf 244 //pc.printf("Reading data.\n\r");
ryanyuyu 2:8ae58834937f 245 readSamples();
ryanyuyu 3:30dcfcf9412c 246 state = 3;
ryanyuyu 2:8ae58834937f 247 break;
ryanyuyu 2:8ae58834937f 248
ryanyuyu 3:30dcfcf9412c 249 case 2: //printout to pc connection or other output debugging
ryanyuyu 4:9ee3ae61db7f 250
ryanyuyu 4:9ee3ae61db7f 251 for (int i = 0; i < 10; i++) outputWaveform(postFilterData);
ryanyuyu 3:30dcfcf9412c 252 wait_ms(500);
ryanyuyu 3:30dcfcf9412c 253 state = 1;
ryanyuyu 2:8ae58834937f 254 break;
ryanyuyu 2:8ae58834937f 255 case 3: //filter?
ryanyuyu 4:9ee3ae61db7f 256 pc.printf("RMS of waveform = %f\n\r", rms(waveform));
ryanyuyu 2:8ae58834937f 257 pc.printf("Filtering?\n\r");
ryanyuyu 2:8ae58834937f 258 arm_fir_f32(filter, waveform, postFilterData, blockSize);
ryanyuyu 4:9ee3ae61db7f 259 //arm_iir_lattice_f32(filter1, waveform, postFilterData, blockSize);
ryanyuyu 4:9ee3ae61db7f 260 state = 6;
ryanyuyu 2:8ae58834937f 261 break;
ryanyuyu 2:8ae58834937f 262 case 4: //FFT?
ryanyuyu 2:8ae58834937f 263 break;
ryanyuyu 2:8ae58834937f 264 case 5: //output, write to display and PWM tone
ryanyuyu 4:9ee3ae61db7f 265 /*
ryanyuyu 3:30dcfcf9412c 266 sprintf(outputString, "RMS = %f", estimate);
ryanyuyu 3:30dcfcf9412c 267 lcd.print(outputString);
ryanyuyu 3:30dcfcf9412c 268 state = 1;
ryanyuyu 4:9ee3ae61db7f 269 //*/
ryanyuyu 2:8ae58834937f 270 break;
ryanyuyu 4:9ee3ae61db7f 271 case 6: //calculate the average voltage
ryanyuyu 3:30dcfcf9412c 272
ryanyuyu 4:9ee3ae61db7f 273 estimate = rms(postFilterData);
ryanyuyu 4:9ee3ae61db7f 274 pc.printf("post filter RMS = %f\n\n\r", estimate);
ryanyuyu 4:9ee3ae61db7f 275 state = 1;
ryanyuyu 4:9ee3ae61db7f 276 adjustGains(estimate);
ryanyuyu 5:bc45ed158abf 277 /*
ryanyuyu 5:bc45ed158abf 278 array[index_h] = estimate;
ryanyuyu 5:bc45ed158abf 279 index_h++;
ryanyuyu 5:bc45ed158abf 280 */
ryanyuyu 5:bc45ed158abf 281
ryanyuyu 3:30dcfcf9412c 282 break;
ryanyuyu 4:9ee3ae61db7f 283 case 7: //estimate amplitude using simple peak detection (consider discarding)
ryanyuyu 5:bc45ed158abf 284
ryanyuyu 2:8ae58834937f 285 break;
ryanyuyu 3:30dcfcf9412c 286
ryanyuyu 3:30dcfcf9412c 287 case 8: //digital pot interfacing and calibration
ryanyuyu 3:30dcfcf9412c 288 pc.printf("kOhms?\n\r");
ryanyuyu 3:30dcfcf9412c 289 pc.scanf("%s", buffer);
ryanyuyu 3:30dcfcf9412c 290 float value = atof(buffer);
ryanyuyu 4:9ee3ae61db7f 291 pc.printf("Command: %x Scanned:%f\n\r", setPot(1, value), value);
ryanyuyu 3:30dcfcf9412c 292 wait_ms(250);
ryanyuyu 4:9ee3ae61db7f 293 state = 8;
ryanyuyu 4:9ee3ae61db7f 294 break;
ryanyuyu 4:9ee3ae61db7f 295
ryanyuyu 4:9ee3ae61db7f 296 case 9:
ryanyuyu 4:9ee3ae61db7f 297
ryanyuyu 4:9ee3ae61db7f 298 case 10: //purely for testing that the digital potentiometer is working.
ryanyuyu 4:9ee3ae61db7f 299 pc.printf("Start of loop.\n\r");
ryanyuyu 4:9ee3ae61db7f 300 setPot(1,0);
ryanyuyu 4:9ee3ae61db7f 301 wait_ms(1000);
ryanyuyu 4:9ee3ae61db7f 302 setPot(1,20);
ryanyuyu 4:9ee3ae61db7f 303 wait_ms(1000);
ryanyuyu 4:9ee3ae61db7f 304 setPot(1,40);
ryanyuyu 4:9ee3ae61db7f 305 wait_ms(1000);
ryanyuyu 4:9ee3ae61db7f 306 setPot(1,50);
ryanyuyu 4:9ee3ae61db7f 307 wait_ms(1000);
ryanyuyu 4:9ee3ae61db7f 308 setPot(1, 80);
ryanyuyu 4:9ee3ae61db7f 309 wait_ms(1000);
ryanyuyu 4:9ee3ae61db7f 310 setPot(1, 100);
ryanyuyu 4:9ee3ae61db7f 311 wait_ms(1000);
ryanyuyu 4:9ee3ae61db7f 312 state = 10;
ryanyuyu 3:30dcfcf9412c 313 break;
ryanyuyu 2:8ae58834937f 314 default:
ryanyuyu 2:8ae58834937f 315 break;
ryanyuyu 2:8ae58834937f 316 }
ryanyuyu 2:8ae58834937f 317 } //end of (infinite) while loop
ryanyuyu 0:3aae5d23d0db 318 }
ryanyuyu 4:9ee3ae61db7f 319
ryanyuyu 4:9ee3ae61db7f 320
ryanyuyu 4:9ee3ae61db7f 321 //-----------------------------Unused code, but potentially useful
ryanyuyu 4:9ee3ae61db7f 322
ryanyuyu 4:9ee3ae61db7f 323 /*
ryanyuyu 4:9ee3ae61db7f 324 double sum = 0;
ryanyuyu 4:9ee3ae61db7f 325 for (int i = 0; i < BlockSize; i++) sum += postFilterData[i];
ryanyuyu 4:9ee3ae61db7f 326 double average = sum/BlockSize*3.3; //*3.3 V_ref (array stored as fractions of V_ref)
ryanyuyu 4:9ee3ae61db7f 327 pc.printf("Average = %f\n\r", average);
ryanyuyu 4:9ee3ae61db7f 328 wait_ms(500);
ryanyuyu 4:9ee3ae61db7f 329 state = 2;
ryanyuyu 4:9ee3ae61db7f 330 */
ryanyuyu 4:9ee3ae61db7f 331
ryanyuyu 4:9ee3ae61db7f 332 //pc.printf("into print\n\r");
ryanyuyu 4:9ee3ae61db7f 333 /*
ryanyuyu 4:9ee3ae61db7f 334 for (int i = 0; i < BlockSize; i++)
ryanyuyu 4:9ee3ae61db7f 335 {
ryanyuyu 4:9ee3ae61db7f 336 pc.printf("Waveform contents:%f\n\r", waveform[i]);
ryanyuyu 4:9ee3ae61db7f 337 }
ryanyuyu 4:9ee3ae61db7f 338 */
ryanyuyu 5:bc45ed158abf 339
ryanyuyu 5:bc45ed158abf 340
ryanyuyu 5:bc45ed158abf 341
ryanyuyu 5:bc45ed158abf 342 /*
ryanyuyu 5:bc45ed158abf 343 ---------------peak detection
ryanyuyu 5:bc45ed158abf 344 pc.printf("Into estimation\n\r");
ryanyuyu 5:bc45ed158abf 345 int peaks = 0;
ryanyuyu 5:bc45ed158abf 346 float sum = 0.0;
ryanyuyu 5:bc45ed158abf 347 float prev, current, next;
ryanyuyu 5:bc45ed158abf 348 for (int i = 0+1; i < BlockSize-1; i++)
ryanyuyu 5:bc45ed158abf 349 {
ryanyuyu 5:bc45ed158abf 350 prev = postFilterData[i-1];
ryanyuyu 5:bc45ed158abf 351 current = postFilterData[i];
ryanyuyu 5:bc45ed158abf 352 next = postFilterData[i+1];
ryanyuyu 5:bc45ed158abf 353 if (prev < current && next < current) //local max
ryanyuyu 5:bc45ed158abf 354 {
ryanyuyu 5:bc45ed158abf 355 sum += current;
ryanyuyu 5:bc45ed158abf 356 peaks++;
ryanyuyu 5:bc45ed158abf 357 }
ryanyuyu 5:bc45ed158abf 358 }
ryanyuyu 5:bc45ed158abf 359 float average = sum/peaks;
ryanyuyu 5:bc45ed158abf 360 pc.printf("Average of peaks (scalar) = %f\n\r", average);
ryanyuyu 5:bc45ed158abf 361 state = 1;
ryanyuyu 5:bc45ed158abf 362 //*/