Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Impedance_Fast_Circuitry by
Diff: main.cpp
- Revision:
- 85:f1be018aacac
- Parent:
- 84:5b4466dd2326
- Child:
- 86:850351993d88
--- a/main.cpp Wed Feb 21 23:23:17 2018 +0000 +++ b/main.cpp Wed Apr 25 16:21:11 2018 +0000 @@ -10,23 +10,44 @@ #include "dsp.h" #include "print_data.h" +#define PROBE_NUMBER 5 +#if PROBE_NUMBER == 1 + #define PRE_COMPUTE_LENGTH 232 +#elif PROBE_NUMBER == 2 + #define PRE_COMPUTE_LENGTH 528 +#elif PROBE_NUMBER == 3 + #define PRE_COMPUTE_LENGTH 176 +#elif PROBE_NUMBER == 4 + #define PRE_COMPUTE_LENGTH 320 +#elif PROBE_NUMBER == 5 + #define PRE_COMPUTE_LENGTH 208 +#elif PROBE_NUMBER == 6 + #define PRE_COMPUTE_LENGTH 528 +#endif +//#define probe_number 1 //Probe number +const int probe_number = PROBE_NUMBER; +//const int PCL_LUT[] = {232,528,176,320,208}; //Pre-compute-length for the different probe numbers +//190Hz 528 +//312Hz 320 +//431Hz 232 +//481Hz 208 +//568Hz 176 + #define PRINT_BUFFER_LENGTH 10000 #define GATHER_STATISTICS 1 +Serial pc(USBTX, USBRX); // for debug purposes -DigitalOut led1(LED1); -DigitalOut led2(LED2); -Serial pc(USBTX, USBRX); DigitalOut led_red(LED_RED); DigitalOut led_green(LED_GREEN); DigitalOut led_blue(LED_BLUE); DigitalOut status_0(D0); DigitalOut status_1(D1); DigitalOut status_3(D3); -DigitalOut Start_sync(D4);// -DigitalIn sw2(SW2);//Button 2 -DigitalIn sw3(SW3);//Button 3 +DigitalOut Start_sync(D4);// Currently not being used. +DigitalIn sw2(SW2);//Button 2 Currently not being used +DigitalIn sw3(SW3);//Button 3 Currently not being used // defined in dma.cpp extern int len; @@ -35,14 +56,14 @@ 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 +//#define INPUT_ARRAY_SIZE 32 +//#define DECIMATION_FACTOR 8 +//#define DEMODULATED_SIGNAL_LENGTH 64 float *input_50k[8]; -int probe_number = -1; -bool recording = false; + + //190Hz 528 @@ -50,12 +71,12 @@ //431Hz 232 //481Hz 208 //568Hz 176 -#define pre_compute_length 208 -//#define demodulation_length 125 -#define CarrierFrequency (100000/208) +//#define pre_compute_length 208 +//#define CarrierFrequency (100000/pre_compute_length) +const int pre_compute_length = PRE_COMPUTE_LENGTH; +const float CarrierFrequency = (100000/pre_compute_length); #define SAMPLEFREQUENCY 100000 -//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; @@ -66,18 +87,10 @@ 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)); } -void callback() { - // Note: you need to actually read from the serial to clear the RX interrupt - printf("%c\n", pc.getc()); - led2 = !led2; -} + int main() { led_blue = 1; @@ -93,9 +106,8 @@ pc.baud(230400); - + /* //pc.printf("High: %x Mid: %x Low: %x",SIM->UIDH,SIM->UIDML,SIM->UIDL); - if(SIM->UIDH == 0x2effff && SIM->UIDML == 0x4e453154 && SIM->UIDL == 0x1004001e) probe_number = 6; else if(SIM->UIDH == 0x1cffff && SIM->UIDML == 0x4e453215 && SIM->UIDL == 0x700b0003) probe_number = 2; else if(SIM->UIDH == 0x2effff && SIM->UIDML == 0x4e453215 && SIM->UIDL == 0x700b0021) probe_number = 3; @@ -109,19 +121,14 @@ pc.printf("High: %x Mid: %x Low: %x\n\r",SIM->UIDH,SIM->UIDML,SIM->UIDL); probe_number = 6; } + */ pc.printf("PROBE #%d",probe_number); wait(1.0f); - /* - while(!pc.readable()) - { - continue; - } - pc.printf("%d",probe_number); - */ + int DAC_COUNTER = 0; - //SIM_UIDH == 0x20ffff && SIM_UIDML == 0x4e453103 && SIM_UIDL == 0x60010028) - //printf("High: %x Mid: %x Low: %x",SIM->UIDH,SIM->UIDML,SIM->UIDL); + + //Filters used in program. Coefficients generated using matlab FDA tool //Fs = 100000, FPass = 1500, FStop = 4500, -40db float Coeffs_100k[64] = {0.00368762746013400, -0.00390835182721185, -0.00352466159836192, -0.00378044968164769, -0.00434746630849834, -0.00502920744118478, -0.00570543677799210, -0.00628464650365093, -0.00668691824262464, -0.00683917139561193, -0.00667505410229485, -0.00613341508706847, -0.00516232410283893, -0.00371868951723358, -0.00177417571286934, 0.000685809876396031, 0.00365648516386919, 0.00711658039739992, 0.0110234409358280, 0.0153179248880130, 0.0199204447074274, 0.0247385052308702, 0.0296636617979935, 0.0345813441342327, 0.0393672306749833, 0.0438989152744108, 0.0480511039644129, 0.0517108728403463, 0.0547710075854812, 0.0571509837193129, 0.0587848911618005, 0.0596038010741317, 0.0596038010741317, 0.0587848911618005, 0.0571509837193129, 0.0547710075854812, 0.0517108728403463, 0.0480511039644129, 0.0438989152744108, 0.0393672306749833, 0.0345813441342327, 0.0296636617979935, 0.0247385052308702, 0.0199204447074274, 0.0153179248880130, 0.0110234409358280, 0.00711658039739992, 0.00365648516386919, 0.000685809876396031, -0.00177417571286934, -0.00371868951723358, -0.00516232410283893, -0.00613341508706847, -0.00667505410229485, -0.00683917139561193, -0.00668691824262464, -0.00628464650365093, -0.00570543677799210, -0.00502920744118478, -0.00434746630849834, -0.00378044968164769, -0.00352466159836192, -0.00390835182721185, 0.00368762746013400}; //FS = 12500, Fpass = 100 Fstop 595 -50 db, picks on 1KHz signal @@ -134,10 +141,16 @@ 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}; + //note I allocate space for 4 adc inputs, but usually I only use 2 for(int i = 0; i < 8; i++) input_50k[i] = new float[64];//each array represents the input of the adcs - + //filters(const int num_filters, const int DECIMATION, filters * f, const int block_size, const int numTaps, float coeffs[], int demodulate_after) + //num filters: usually 4. In-phase and quadrature phase for both voltage and current + //DECIMATION: Decimation Factor + //f: the filter after current filter. + //block_size: block size of each filter command should be an integer multiple of DECIMATION + //Flag noting rather or not to demodulate, and if so what frequency to demodulate at filters f4 = filters(4, 8, NULL, 8, 32, Coeffs_782,DEMOD_No_Demod); filters f3 = filters(4, 2, &f4, 4, 32, Coeffs_1563,DEMOD_No_Demod); filters f2 = filters(4, 8, &f3, 8, 64, Coeffs_12500,DEMOD_No_Demod); @@ -175,23 +188,23 @@ { if(pc.readable())//if the python code has sent any characters recently { - while(pc.readable()) + while(pc.readable())//if there is a Keyboard input { - read_in_character = pc.getc(); - if (read_in_character == 'R') + read_in_character = pc.getc();// read the keyboard input + if (read_in_character == 'R')//start printing is_actively_printing = true; - else if (read_in_character == 'S') + else if (read_in_character == 'S')//Stop printing is_actively_printing = false; - else if (read_in_character == 'P') + else if (read_in_character == 'P')//return probe number pc.printf("p%d",probe_number); } } - while(sampling_status == 0)//wait until the ADCs read a new value + while(sampling_status == 0)//wait until the ADCs read a new values { - status_0 = 1; - print_filter_data(&pc,is_actively_printing); + status_0 = 1; //used for debugging allows to see utilization + print_filter_data(&pc,is_actively_printing);//while waiting for new samples print as much data as possible //Thread::wait(.0001); } sampling_status = 0;//sets sampling status to 0. DMA sets it to one once ADCs sample @@ -207,16 +220,15 @@ //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 + //Note currently we are sampling 2 adc at 100 KHz. If desired you can also sample 4 ADCs at 50 KHz input_50k[1][i]=float(static_input_array1[i]); // input_50k[3][i/2]=static_input_array1[i+1]; input_50k[0][i]=float(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 - //input_50k[0] = static_input_array0; - //input_50k[1] = static_input_array1; + + f1.input(input_50k,64,DEMOD_200HZ); //f1_b.input(input_50k,64,DEMOD_1000HZ); //status_3 = 1; @@ -225,11 +237,11 @@ 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 + //prints ADC buffer if desired + //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]);