Jared Baxter
/
Impedance_Fast_Circuitry
Impedance Fast Circuitry Software
Fork of DSP_200kHz by
Diff: main.cpp
- Revision:
- 73:b059b5bdc664
- Parent:
- 72:0b554f5026b9
- Child:
- 74:ebc9f09fda11
--- a/main.cpp Thu May 18 20:19:12 2017 +0000 +++ b/main.cpp Wed May 31 22:02:56 2017 +0000 @@ -4,12 +4,13 @@ #include "DMA_sampling/adc.h" #include "DMA_sampling/dac.h" #include "DMA_sampling/pdb.h" +#include "Jareds_DSP/filters_jared.h" // DSP #include "dsp.h" #define PRINT_BUFFER_LENGTH 10000 - +#define GATHER_STATISTICS 1 // for debug purposes Serial pc(USBTX, USBRX); @@ -18,69 +19,120 @@ DigitalOut led_blue(LED_BLUE); DigitalOut status_0(D0); DigitalOut status_1(D1); -DigitalIn sw2(SW2); -DigitalIn sw3(SW3); +DigitalIn sw2(SW2);//Button 2 +DigitalIn sw3(SW3);//Button 3 // defined in dma.cpp extern int len; -extern uint16_t static_input_array0[]; -extern uint16_t static_input_array1[]; -extern uint16_t static_output_array0[]; -extern uint16_t sampling_status; +extern uint16_t static_input_array0[];//ADC 0(swaps between a0 and a1. Used to measure current) +extern uint16_t static_input_array1[];//ADC 1(measures the voltage between the probe and ground) +extern uint16_t static_output_array0[];//DAC outputs whatever wave form we want. +extern uint16_t sampling_status;//used to determine when adc's are done reading. +#define INPUT_ARRAY_SIZE 32 +#define DECIMATION_FACTOR 8 +#define DEMODULATED_SIGNAL_LENGTH 64 + +float *input_50k[8]; + + + +/* // To set up FIR filtering -#define TOTAL_TAPS 16 -#define STATE_LENGTH 79 -#define BUFFER_LENGTH 64 +#define TOTAL_TAPS 20 +#define STATE_LENGTH 51 +#define BUFFER_LENGTH 32 uint16_t numTaps = TOTAL_TAPS; -float State[STATE_LENGTH]= {0}; -float Coeffs[TOTAL_TAPS] = {0.0351885543264657, 0.0326718041339497, 0.0447859388579763, 0.0571840193174261, 0.0688188647212066, 0.0786841934234295, 0.0858044659079242, 0.0895870376972757, 0.0895870376972757, 0.0858044659079242, 0.0786841934234295, 0.0688188647212066, 0.0571840193174261, 0.0447859388579763, 0.0326718041339497, 0.0351885543264657}; -arm_fir_instance_f32 S = {numTaps, State, Coeffs}; +float States_50k[4][STATE_LENGTH]= {0}; +float States_6250[8][STATE_LENGTH]= {0}; +float States_781[8][STATE_LENGTH]= {0}; + +float Coeffs[TOTAL_TAPS] = {0.0380723866161221, 0.0263930577547015, 0.0332622132972336, 0.0408057838845535, 0.0482178949738844, 0.0551211071268984, 0.0611830030337647, 0.0660392721230197, 0.0694611630329689, 0.0711942672973351, 0.0711942672973351, 0.0694611630329688, 0.0660392721230197, 0.0611830030337647, 0.0551211071268984, 0.0482178949738844, 0.0408057838845535, 0.0332622132972336, 0.0263930577547015, 0.0380723866161221}; +//arm_fir_instance_f32 S = {numTaps, State, Coeffs}; +arm_fir_decimate_instance_f32 filterStruct_50k[4] = {DECIMATION_FACTOR, numTaps, Coeffs, States_50k[0], + DECIMATION_FACTOR, numTaps, Coeffs, States_50k[1], + DECIMATION_FACTOR, numTaps, Coeffs, States_50k[2], + DECIMATION_FACTOR, numTaps, Coeffs, States_50k[3]}; + +arm_fir_decimate_instance_f32 filterStruct_6250[8] = {DECIMATION_FACTOR, numTaps, Coeffs, States_6250[0], + DECIMATION_FACTOR, numTaps, Coeffs, States_6250[1], + DECIMATION_FACTOR, numTaps, Coeffs, States_6250[2], + DECIMATION_FACTOR, numTaps, Coeffs, States_6250[3], + DECIMATION_FACTOR, numTaps, Coeffs, States_6250[4], + DECIMATION_FACTOR, numTaps, Coeffs, States_6250[5], + DECIMATION_FACTOR, numTaps, Coeffs, States_6250[6], + DECIMATION_FACTOR, numTaps, Coeffs, States_6250[7]}; + +arm_fir_decimate_instance_f32 filterStruct_781[8] = {DECIMATION_FACTOR, numTaps, Coeffs, States_781[0], + DECIMATION_FACTOR, numTaps, Coeffs, States_781[1], + DECIMATION_FACTOR, numTaps, Coeffs, States_781[2], + DECIMATION_FACTOR, numTaps, Coeffs, States_781[3], + DECIMATION_FACTOR, numTaps, Coeffs, States_781[4], + DECIMATION_FACTOR, numTaps, Coeffs, States_781[5], + DECIMATION_FACTOR, numTaps, Coeffs, States_781[6], + DECIMATION_FACTOR, numTaps, Coeffs, States_781[7]}; +//filterStruct_50k[0] = {DECIMATION_FACTOR, numTaps, Coeffs, States_50k[0]}; +//filterStruct_50k[1] = {DECIMATION_FACTOR, numTaps, Coeffs, States_50k[1]}; +//filterStruct_50k[2] = {DECIMATION_FACTOR, numTaps, Coeffs, States_50k[2]}; +//filterStruct_50k[3] = {DECIMATION_FACTOR, numTaps, Coeffs, States_50k[3]}; float filter_input_array[BUFFER_LENGTH] = {0}; float filter_output_array[BUFFER_LENGTH] = {0}; - - - +*/ #define pre_compute_length 500 +#define demodulation_length 125 #define CarrierFrequency 200 #define SAMPLEFREQUENCY 100000 -//float i_mod_pre[pre_compute_length]; -//float q_mod_pre[pre_compute_length]; -uint16_t out_val_pre[pre_compute_length]; +//float i_mod_pre[demodulation_length+(INPUT_ARRAY_SIZE/DECIMATION_FACTOR)]; +//float q_mod_pre[demodulation_length+(INPUT_ARRAY_SIZE/DECIMATION_FACTOR)]; +uint16_t out_val_pre[pre_compute_length]; //used to write values to the dac float twopi = 3.14159265359 * 2; void pre_compute_tables() { // This function will precompute the cos and sin tables used in the rest of the program for(int precompute_counter = 0; precompute_counter < pre_compute_length; precompute_counter++){ - out_val_pre[precompute_counter] = (int) (cos(twopi * CarrierFrequency /SAMPLEFREQUENCY * precompute_counter) * 2046.0 + 2048.0); - //if(precompute_counter<len) - // static_output_array0[precompute_counter] = out_val_pre[precompute_counter]; - //printf("%d\n\r",out_val_pre[precompute_counter]); - //i_mod_pre[precompute_counter] = (cos(twopi * CarrierFrequency * TimerInterruptInMicroSeconds * 1e-6 * precompute_counter)); - //q_mod_pre[precompute_counter] = (-sin(twopi * CarrierFrequency * TimerInterruptInMicroSeconds * 1e-6 * precompute_counter)); - + out_val_pre[precompute_counter] = (int) (cos(twopi * CarrierFrequency /SAMPLEFREQUENCY * precompute_counter) * 2046.0 + 2048.0);//12 bit cos wave } + + //float decimated_frequency = 6250; + //for(int precompute_counter = 0; precompute_counter < demodulation_length+(INPUT_ARRAY_SIZE/DECIMATION_FACTOR); precompute_counter++){ + // i_mod_pre[precompute_counter] = (cos(twopi * CarrierFrequency / decimated_frequency * precompute_counter)); + // q_mod_pre[precompute_counter] = (-sin(twopi * CarrierFrequency / decimated_frequency * precompute_counter)); + } int main() { + pre_compute_tables(); + //turn off all LEDs led_blue = 1; led_green = 1; led_red = 1; + int DAC_COUNTER = 0; - //bool is_magnified_sample = true; - pre_compute_tables(); + + pc.baud(230400); + pc.printf("Starting\r\n"); + float Coeffs[20] = {0.0328368433284673, 0.0237706090075265, 0.0309894695180997, 0.0385253568846695, 0.0459996974310349, 0.0530165318016261, 0.0591943866845610, 0.0641755708098907, 0.0676960677594849, 0.0694621149975389, 0.0694621149975389, 0.0676960677594849, 0.0641755708098907, 0.0591943866845610, 0.0530165318016261, 0.0459996974310349, 0.0385253568846695, 0.0309894695180997, 0.0237706090075265, 0.0328368433284673}; + float Coeffs2[20] = {-0.00506451294187997, -0.00824932319607346, -0.00986370066237912, -0.00518913235010027, 0.00950858650162284, 0.0357083149022659, 0.0711557142019980, 0.109659494661247, 0.142586101123340, 0.161603335553589, 0.161603335553589, 0.142586101123340, 0.109659494661247, 0.0711557142019980, 0.0357083149022659, 0.00950858650162284, -0.00518913235010027, -0.00986370066237912, -0.00824932319607346, -0.00506451294187997}; + + + for(int i = 0; i < 8; i++) + input_50k[i] = new float[32];//each array represents the input of the adcs + + filters f3 = filters(8, 8, NULL, 8, 20, Coeffs2,false); + + //6250->781 + filters f2 = filters(8, 8, &f3, 8, 20, Coeffs,false); + + //50,000->6250 + filters f1 = filters(4, 8, &f2, 32, 20, Coeffs,true); - pc.baud(230400); - pc.printf("Starting\r\n"); - - - uint16_t output_print_buffer[PRINT_BUFFER_LENGTH]; - uint16_t output_print_buffer2[PRINT_BUFFER_LENGTH]; + //float output_print_buffer[PRINT_BUFFER_LENGTH];//used to store the adc0 values(current measurment) + //float output_print_buffer2[PRINT_BUFFER_LENGTH];//used to store the adc0 values(voltage measurment) int print_buffer_count = 0; pdb_init(); // Initalize PDB @@ -97,129 +149,49 @@ pdb_start(); //while(print_buffer_count<PRINT_BUFFER_LENGTH) - while(1) + while(!GATHER_STATISTICS||print_buffer_count<PRINT_BUFFER_LENGTH) + { + while(sampling_status == 0)//wait until the ADCs read a new value + { + status_0 = 1; + } + sampling_status = 0;//sets sampling status to 0. DMA sets it to one once ADCs sample + status_0 = 0;//Tied to D0. use an O-scope to measure how much free time there is to play with. + status_1 = 1;//Tied to D1. use an O-scope to measure how much time the processing takes + + for(int i = 0; i < len; i+=2) { - while(sampling_status == 0) - { - status_0 = 1; - } - /* - if (is_magnified_sample) - { - ADC0_SC1A = 0x0D; - } - else - { - ADC0_SC1A = 0x0C; - } - is_magnified_sample = !is_magnified_sample; - */ - sampling_status = 0; - status_0 = 0; - - if(sw2) - { - if(sw3) - { - //Default PASSTHROUGH Condition - status_1 = 1; - //printf("%d\n\r",static_input_array0[0]); - for(int i = 0; i < len; i++) - { - //static_output_array0[i] = static_input_array0[i] >> 4; - static_output_array0[i] = out_val_pre[DAC_COUNTER]; - DAC_COUNTER++; - if (DAC_COUNTER>=pre_compute_length) - { - DAC_COUNTER = 0; - } - //printf("%d\n\r",static_input_array0[i]); - - - //output_print_buffer[print_buffer_count] = static_input_array0[i]; - //output_print_buffer2[print_buffer_count] = static_input_array1[i]; - - - //if (i>4&&static_input_array0[i]==static_input_array0[i-1]&&static_input_array0[i]==static_input_array0[i-2]) - // printf("Y"); - print_buffer_count++; - - //if (print_buffer_count>=PRINT_BUFFER_LENGTH) - //{ - // break; - //} - - } - //print_buffer_count+=len; - status_1 = 0; - } - else - { - // Can show that buttons are active - Serial link working - status_1 = 1; - pc.printf("DSP: %d\r\n",out_val_pre[DAC_COUNTER]); - //pc.printf("DSP: %d\r\n",out_val_pre[DAC_COUNTER]); - for(int i = 0; i < len; i++) - { - static_output_array0[i] = static_input_array0[i] >> 4; - } - status_1 = 0; - } - } - else - { - // Here we can really put our DSP blocks - status_1 = 1; - for(int i = 0; i < len; i++) - { - //static_output_array0[i] = static_input_array0[i] >> 4; - //filter_input_array[i] = (float) (((int) static_input_array0[i]) - 0x8000); - filter_input_array[i] = (float) (((int)static_input_array0[i]) - 0x8000); - } - - //filter_input_array[0] = (float) static_input_array0[0]; - - arm_fir_f32(&S, filter_input_array, filter_output_array, len); - - - // Scale for output - /* - for(int i = 0; i < len; i++) - { - //static_output_array0[i] = static_input_array0[i] >> 4; - //filter_output_array[i] = 0.25 * filter_input_array[i]; - filter_output_array[i] = 0.0625 * filter_output_array[i]; - } - */ - - for(int i = 0; i < len; i++) - { - //static_output_array0[i] = static_input_array0[i] >> 4; - //static_output_array0[i] = (uint16_t) (( (int) filter_output_array[i] ) + 0x800); - //static_output_array0[i] = (uint16_t) (filter_output_array[i] + 0x8000) >> 4; - //static_output_array0[i] = (uint16_t) filter_input_array[i]; - //static_output_array0[i] = static_input_array0[i] >> 4; - - - static_output_array0[i] = out_val_pre[DAC_COUNTER]; - DAC_COUNTER++; - if (DAC_COUNTER>=pre_compute_length) - { - DAC_COUNTER = 0; - } - } - - - status_1 = 0; - } - - } + static_output_array0[i] = out_val_pre[DAC_COUNTER];//DAC output + DAC_COUNTER++;//Counter to kepp track of where we are in our precomputed table + if (DAC_COUNTER>=pre_compute_length) {DAC_COUNTER = 0;}//wrap around the counter + static_output_array0[i+1] = out_val_pre[DAC_COUNTER];//DAC output + DAC_COUNTER++;//Counter to kepp track of where we are in our precomputed table + if (DAC_COUNTER>=pre_compute_length) {DAC_COUNTER = 0;}//wrap around the counter + + input_50k[1][i/2]=static_input_array1[i]; + input_50k[3][i/2]=static_input_array1[i+1]; + input_50k[0][i/2]=static_input_array0[i]; + input_50k[2][i/2]=static_input_array0[i+1]; + + + + }//End of for loop going throught the buffer of adc samples + f1.input(input_50k,32); - for(int i = 0; i<PRINT_BUFFER_LENGTH; i++) - { - printf("%d %d\n\r",output_print_buffer[i],output_print_buffer2[i]); - } + + + status_1 = 0;//turn off D1 used in deterimining how long processing is taking + //filter_input_array[i] = (float) (((int)static_input_array0[i]) - 0x8000); + //arm_fir_f32(&S, filter_input_array, filter_output_array, len); + + }//end of while loop + + //for(int i = 0; i<PRINT_BUFFER_LENGTH; i++)//print all the adc values measured + //{ + // printf("%.1f %.1f\n\r",output_print_buffer[i],output_print_buffer2[i]); + //} + }