Capstone project files
Dependencies: mbed-dsp mbed capstone_display_2
main.cpp@5:bc45ed158abf, 2014-04-15 (annotated)
- 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?
User | Revision | Line number | New 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 | //*/ |