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.
Dependencies: mbed
Fork of Chemical_Sensor_DMA by
Revision 0:3927c6d8ad1f, committed 2015-09-06
- Comitter:
- baxterja
- Date:
- Sun Sep 06 04:23:51 2015 +0000
- Child:
- 1:f0a5690db73f
- Commit message:
- Chemical Sensing program
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed.bld | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Sep 06 04:23:51 2015 +0000 @@ -0,0 +1,978 @@ + +// TODO: +#include "mbed.h" +#include <string> + +#include <stdio.h> +#include "PeripheralNames.h" +#include "PeripheralPins.h" +#include "fsl_adc_hal.h" +#include "fsl_clock_manager.h" +#include "fsl_dspi_hal.h" + + + +Serial pc(USBTX, USBRX); + +/* +#if DEBUG +#define DEBUG_PRINT(x) pc.printf(x) +#else +#define DEBUG_PRINT(x) do {} while(0) +#endif +*/ +DigitalOut led_red(LED_RED); +DigitalOut led_green(LED_GREEN); +DigitalOut led_blue(LED_BLUE); + + +#define MAX_FADC 6000000 + +#define TimerInterruptInMicroSeconds 25 // This is for 40 kHz + + +#define CarrierFrequency 190 + +#define ISR_counter_loop_reset 4 // 10 kHz sampling of the signal + +int ISR_counter = 1; + +#define MaxNumSamples 0 //set to 0 if want continuous sampling (i.e. run forever) +#define NumSamplesAverageInADC 32 //hardware averaging default is 2. values 0..32. Higher values reduce noise and maximum sample rate +#define NumADCbits 16 + +int CyclesInState = 0; +// While 32 is the minimum, it seems to take a few cycles to get things to work right. 32 + 18 + 18 + 18 +#define PreCalculateCycles 256 +#define NumCalculatedAverages 500 + +AnalogOut WaveOut(DAC0_OUT); +AnalogIn WaveIn1(A0); +AnalogIn WaveIn2(A2); + + +double previousTime = 0; + + +volatile unsigned long counter = 0; //keep track of how many times the timer interrupt executes + + +volatile int phase_counter = 0; +float twopi = 3.14159265359 * 2; + +#define pre_compute_length 4000 +float i_mod_pre[pre_compute_length]; +float q_mod_pre[pre_compute_length]; +int out_val_pre[pre_compute_length]; + +float current_i_mod; +float current_q_mod; + + +#define lp_fir_length 256 +#define bp_fir_length 256 + +float x_0_i[lp_fir_length]; +float x_0_q[lp_fir_length]; +float x_1_i[lp_fir_length]; +float x_1_q[lp_fir_length]; + +float real_ip = 0; +float real_ip_total = 0; +float imag_ip = 0; +float imag_ip_total = 0; +float y_0_squared = 0; +float y_1_squared = 0; + +int max_0 = -1; +int min_0 = 65536; +int max_1 = -1; +int min_1 = 65536; + + +// Coefficients for FIR low-pass filter +// Order: 127 +// Fs = 10000 +// Fpass = 5 +// Fstop = 50 +// Density Factor 20 +float lp_filter_coeff[lp_fir_length] = { +0.0861805974737537, +0.00194058236914933, +0.00196838475539374, +0.00198494885848217, +0.00201327315570587, +0.00202912020658817, +0.00205837690374429, +0.00207476466732652, +0.00210551867296513, +0.00212232982776793, +0.00215469918380619, +0.00217146660668663, +0.00220558455176705, +0.00222092552588268, +0.00225605241370255, +0.00226646783939495, +0.00230092287432329, +0.00229715073318613, +0.00232623464517315, +0.00225358157041652, +0.00237497949175132, +0.00240962754549243, +0.00239489319998042, +0.00243168327631056, +0.00244169878557599, +0.00247033152393311, +0.00248484040428462, +0.00250942587726843, +0.00252568320446658, +0.00254761155808375, +0.00256464167177514, +0.00258446154111681, +0.00260244294098803, +0.00262131473283837, +0.00264164776893963, +0.00266111980952651, +0.00268646307379128, +0.00270761719256829, +0.00274205375475237, +0.00274149898919641, +0.00274945418608348, +0.00279082346790514, +0.00279778186887203, +0.00282250662520772, +0.00283603752336853, +0.00285874465133605, +0.00287407059058428, +0.00289570516626933, +0.00291199026392523, +0.00293311428662787, +0.00295009345796840, +0.00297044279838009, +0.00298714691522817, +0.00300581268506110, +0.00302120747953588, +0.00303732312039544, +0.00305157040082656, +0.00306643736356742, +0.00308869428115324, +0.00311307778862543, +0.00311424353468359, +0.00313896920891965, +0.00315257957066846, +0.00317063676755790, +0.00318404202174892, +0.00320106537708682, +0.00321431574769385, +0.00323043068211672, +0.00324309082121968, +0.00325830171776266, +0.00327070521989578, +0.00328578417067009, +0.00329857943310240, +0.00331411607506732, +0.00332746621803916, +0.00334278731970893, +0.00335490587728655, +0.00336582204821038, +0.00337340614667260, +0.00339593158768486, +0.00340201380261714, +0.00341358117591052, +0.00342527970126076, +0.00343729081346655, +0.00344788640610150, +0.00345950626709297, +0.00346977560789619, +0.00348137861989829, +0.00349145780595203, +0.00350258155909523, +0.00351179661900564, +0.00352191431883533, +0.00352996025917487, +0.00353918710384162, +0.00354686935571502, +0.00355665353091388, +0.00356587002173744, +0.00357689031711855, +0.00357801462512765, +0.00359006856669697, +0.00359950458629560, +0.00360494297850754, +0.00361233039031660, +0.00361922292724758, +0.00362591596791954, +0.00363226321494882, +0.00363786374022990, +0.00364352288365460, +0.00364862849480178, +0.00365423915635453, +0.00365927328685460, +0.00366494409556548, +0.00366963573779647, +0.00367457381745451, +0.00367783024950588, +0.00368130382332767, +0.00368329710162579, +0.00369126347001870, +0.00369087449038130, +0.00369079790741907, +0.00369643982204526, +0.00369766453946281, +0.00369941489929772, +0.00370041177271180, +0.00370189241602639, +0.00370304548909528, +0.00370413802604405, +0.00370464038533780, +0.00370464038533780, +0.00370413802604405, +0.00370304548909528, +0.00370189241602639, +0.00370041177271180, +0.00369941489929772, +0.00369766453946281, +0.00369643982204526, +0.00369079790741907, +0.00369087449038130, +0.00369126347001870, +0.00368329710162579, +0.00368130382332767, +0.00367783024950588, +0.00367457381745451, +0.00366963573779647, +0.00366494409556548, +0.00365927328685460, +0.00365423915635453, +0.00364862849480178, +0.00364352288365460, +0.00363786374022990, +0.00363226321494882, +0.00362591596791954, +0.00361922292724758, +0.00361233039031660, +0.00360494297850754, +0.00359950458629560, +0.00359006856669697, +0.00357801462512765, +0.00357689031711855, +0.00356587002173744, +0.00355665353091388, +0.00354686935571502, +0.00353918710384162, +0.00352996025917487, +0.00352191431883533, +0.00351179661900564, +0.00350258155909523, +0.00349145780595203, +0.00348137861989829, +0.00346977560789619, +0.00345950626709297, +0.00344788640610150, +0.00343729081346655, +0.00342527970126076, +0.00341358117591052, +0.00340201380261714, +0.00339593158768486, +0.00337340614667260, +0.00336582204821038, +0.00335490587728655, +0.00334278731970893, +0.00332746621803916, +0.00331411607506732, +0.00329857943310240, +0.00328578417067009, +0.00327070521989578, +0.00325830171776266, +0.00324309082121968, +0.00323043068211672, +0.00321431574769385, +0.00320106537708682, +0.00318404202174892, +0.00317063676755790, +0.00315257957066846, +0.00313896920891965, +0.00311424353468359, +0.00311307778862543, +0.00308869428115324, +0.00306643736356742, +0.00305157040082656, +0.00303732312039544, +0.00302120747953588, +0.00300581268506110, +0.00298714691522817, +0.00297044279838009, +0.00295009345796840, +0.00293311428662787, +0.00291199026392523, +0.00289570516626933, +0.00287407059058428, +0.00285874465133605, +0.00283603752336853, +0.00282250662520772, +0.00279778186887203, +0.00279082346790514, +0.00274945418608348, +0.00274149898919641, +0.00274205375475237, +0.00270761719256829, +0.00268646307379128, +0.00266111980952651, +0.00264164776893963, +0.00262131473283837, +0.00260244294098803, +0.00258446154111681, +0.00256464167177514, +0.00254761155808375, +0.00252568320446658, +0.00250942587726843, +0.00248484040428462, +0.00247033152393311, +0.00244169878557599, +0.00243168327631056, +0.00239489319998042, +0.00240962754549243, +0.00237497949175132, +0.00225358157041652, +0.00232623464517315, +0.00229715073318613, +0.00230092287432329, +0.00226646783939495, +0.00225605241370255, +0.00222092552588268, +0.00220558455176705, +0.00217146660668663, +0.00215469918380619, +0.00212232982776793, +0.00210551867296513, +0.00207476466732652, +0.00205837690374429, +0.00202912020658817, +0.00201327315570587, +0.00198494885848217, +0.00196838475539374, +0.00194058236914933, +0.0861805974737537 +}; + + +// Coefficients for FIR band-pass filter (single-precision floating) +// Order: 255 +// Fs = 10000 +// Fstop1 = 140 +// Fpass1 = 180 +// Fpass2 = 200 +// Fstop2 = 240 +// Density Factor 20 +float bp_filter_coeff[bp_fir_length] = { +-0.0222569832875342, +-0.000668571820934435, +-0.000617098880070943, +-0.000526912832180624, +-0.000394083108191473, +-0.000224044823896433, +-1.40519139447993e-05, +0.000228753985399507, +0.000506043646368515, +0.000809081179935479, +0.00113886884349691, +0.00148482706293391, +0.00184749122790831, +0.00221412926605753, +0.00258556196728641, +0.00294623650522875, +0.00329828480589904, +0.00362103051636677, +0.00392129596654753, +0.00416037700790689, +0.00440774110765089, +0.00458742109894213, +0.00470432883601479, +0.00477604326343940, +0.00477932011891816, +0.00472369327143935, +0.00459673449069964, +0.00440550863345307, +0.00414276809544121, +0.00381610310764620, +0.00342194240814885, +0.00296924934443244, +0.00245734168541197, +0.00189704915840860, +0.00128969301635370, +0.000647875455120701, +-2.63604406483334e-05, +-0.000717680016887559, +-0.00142424098193147, +-0.00211871793213848, +-0.00280466259597701, +-0.00347302243192041, +-0.00410155649476450, +-0.00468849572012807, +-0.00521831221732055, +-0.00568473286208729, +-0.00607617428224791, +-0.00638642038264520, +-0.00660654522935380, +-0.00673201343716618, +-0.00675686946570070, +-0.00667909912380224, +-0.00649590629000032, +-0.00620853153050349, +-0.00581778091366643, +-0.00532861669082900, +-0.00474475510188909, +-0.00407398377208893, +-0.00332036080041792, +-0.00249639621821765, +-0.00161692422174727, +-0.000686114637835394, +0.000276969889091618, +0.00126158838172335, +0.00225109525801695, +0.00323185932244432, +0.00418763727591780, +0.00510440961298076, +0.00596653561986331, +0.00676059725642517, +0.00747245231692098, +0.00809037791844765, +0.00860240336852779, +0.00899909501543391, +0.00927138366550150, +0.00941337467689702, +0.00942035086127182, +0.00929102977283836, +0.00902403254438426, +0.00861862088073253, +0.00808277337301294, +0.00741973293721300, +0.00663808854880170, +0.00574764652047989, +0.00475963542671197, +0.00368791267821526, +0.00254692028134653, +0.00135318490817447, +0.000123381816987046, +-0.00112406829604574, +-0.00237116204428360, +-0.00359884130528209, +-0.00478919843371992, +-0.00592368092266592, +-0.00698521179296005, +-0.00795630134054653, +-0.00882180545791639, +-0.00956745282162880, +-0.0101826820881787, +-0.0106544412214730, +-0.0109757370305086, +-0.0111401872280476, +-0.0111439989937533, +-0.0109860306403343, +-0.0106669796725910, +-0.0101903953657629, +-0.00956214881730735, +-0.00879053537462268, +-0.00788592056463026, +-0.00686079789488663, +-0.00572962138717207, +-0.00450868146307788, +-0.00321565789521111, +-0.00186931333282453, +-0.000489113370880662, +0.000904730267919755, +0.00229132886837385, +0.00364982806960963, +0.00496072866543581, +0.00620453967164588, +0.00736222523931905, +0.00841655902006347, +0.00935134258076706, +0.0101530565640308, +0.0108094111402764, +0.0113105535457012, +0.0116487913595070, +0.0118191627771399, +0.0118191627771399, +0.0116487913595070, +0.0113105535457012, +0.0108094111402764, +0.0101530565640308, +0.00935134258076706, +0.00841655902006347, +0.00736222523931905, +0.00620453967164588, +0.00496072866543581, +0.00364982806960963, +0.00229132886837385, +0.000904730267919755, +-0.000489113370880662, +-0.00186931333282453, +-0.00321565789521111, +-0.00450868146307788, +-0.00572962138717207, +-0.00686079789488663, +-0.00788592056463026, +-0.00879053537462268, +-0.00956214881730735, +-0.0101903953657629, +-0.0106669796725910, +-0.0109860306403343, +-0.0111439989937533, +-0.0111401872280476, +-0.0109757370305086, +-0.0106544412214730, +-0.0101826820881787, +-0.00956745282162880, +-0.00882180545791639, +-0.00795630134054653, +-0.00698521179296005, +-0.00592368092266592, +-0.00478919843371992, +-0.00359884130528209, +-0.00237116204428360, +-0.00112406829604574, +0.000123381816987046, +0.00135318490817447, +0.00254692028134653, +0.00368791267821526, +0.00475963542671197, +0.00574764652047989, +0.00663808854880170, +0.00741973293721300, +0.00808277337301294, +0.00861862088073253, +0.00902403254438426, +0.00929102977283836, +0.00942035086127182, +0.00941337467689702, +0.00927138366550150, +0.00899909501543391, +0.00860240336852779, +0.00809037791844765, +0.00747245231692098, +0.00676059725642517, +0.00596653561986331, +0.00510440961298076, +0.00418763727591780, +0.00323185932244432, +0.00225109525801695, +0.00126158838172335, +0.000276969889091618, +-0.000686114637835394, +-0.00161692422174727, +-0.00249639621821765, +-0.00332036080041792, +-0.00407398377208893, +-0.00474475510188909, +-0.00532861669082900, +-0.00581778091366643, +-0.00620853153050349, +-0.00649590629000032, +-0.00667909912380224, +-0.00675686946570070, +-0.00673201343716618, +-0.00660654522935380, +-0.00638642038264520, +-0.00607617428224791, +-0.00568473286208729, +-0.00521831221732055, +-0.00468849572012807, +-0.00410155649476450, +-0.00347302243192041, +-0.00280466259597701, +-0.00211871793213848, +-0.00142424098193147, +-0.000717680016887559, +-2.63604406483334e-05, +0.000647875455120701, +0.00128969301635370, +0.00189704915840860, +0.00245734168541197, +0.00296924934443244, +0.00342194240814885, +0.00381610310764620, +0.00414276809544121, +0.00440550863345307, +0.00459673449069964, +0.00472369327143935, +0.00477932011891816, +0.00477604326343940, +0.00470432883601479, +0.00458742109894213, +0.00440774110765089, +0.00416037700790689, +0.00392129596654753, +0.00362103051636677, +0.00329828480589904, +0.00294623650522875, +0.00258556196728641, +0.00221412926605753, +0.00184749122790831, +0.00148482706293391, +0.00113886884349691, +0.000809081179935479, +0.000506043646368515, +0.000228753985399507, +-1.40519139447993e-05, +-0.000224044823896433, +-0.000394083108191473, +-0.000526912832180624, +-0.000617098880070943, +-0.000668571820934435, +-0.0222569832875342 +}; + + +int lp_fifo_num = 1; +int bp_fifo_num = 1; + +float x_0[bp_fir_length]; +float x_1[bp_fir_length]; + +int value[] = {0,0}; + +float mag = 0; +float calc_mag = 0; +double mag_total = 0; +float calc_phase = 0; +int NumInBlock = 0; + +float mag_result = 0; +float phase_result = 0; +/* +int diff_0[3] = {0, 0, 0}; +int diff_1[3] = {0, 0, 0}; +*/ +double final_mag = 0; +float final_phase = 0; + +// Finite State Machine +int current_state = 0; + +// Flag +bool ADC_reading = false; +bool isTransmitting = false; + + +//IntervalTimer timer0; +Ticker timer0; +Timer t1; + +int adc_cal(void) +{ + ADC0_CFG1 |= (ADC_CFG1_MODE(3) | // 16 bits mode + ADC_CFG1_ADICLK(1)| // Input Bus Clock divided by 2 (20-25 MHz out of reset (FEI mode) / 2) + ADC_CFG1_ADIV(2)) ; // Clock divide by 4 (2.5-3 MHz) + + ADC0_SC3 |= ADC_SC3_AVGE_MASK | // Enable HW average + ADC_SC3_AVGS(3) | // Set HW average of 32 samples + ADC_SC3_CAL_MASK; // Start calibration process + + while(ADC0_SC3 & ADC_SC3_CAL_MASK); // Wait for calibration to end + + if(ADC0_SC3 & ADC_SC3_CALF_MASK) return 1; // Check for successful calibration + + uint16_t calib = 0; // calibration variable + calib += ADC0->CLPS + ADC0_CLP4 + ADC0_CLP3 + ADC0_CLP2 + ADC0_CLP1 + ADC0_CLP0; + calib /= 2; + calib |= 0x8000; // Set MSB + ADC0_PG = calib; + calib = 0; + calib += ADC0_CLMS + ADC0_CLM4 + ADC0_CLM3 + ADC0_CLM2 + ADC0_CLM1 + ADC0_CLM0; + calib /= 2; + calib |= 0x8000; // Set MSB + ADC0_MG = calib; + + return 0; +} + +void adc_init() +{ + // red, indicating not ready + + + // Turn on the ADC0 and ADC1 clocks + SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK; + SIM_SCGC3 |= SIM_SCGC3_ADC1_MASK; + + + __disable_irq(); + adc_cal(); + //if(adc_cal()) {red = 0; green = 0;} // if calibration fails, display yellow + __enable_irq(); + + + + // Setup Configuration Register 1 + ADC0_CFG1 = 0; // clear register + ADC0_CFG1 |= ADC_CFG1_ADICLK(0); // select bus clock + ADC0_CFG1 |= ADC_CFG1_MODE(3); // select 16-bit 2's complement output + ADC0_CFG1 |= ADC_CFG1_ADIV(0); // clock divisor = 0. + ADC0_CFG1 &= ~ADC_CFG1_ADLSMP_MASK; // select short sample time //QUESTION + ADC0_CFG1 &= ~ADC_CFG1_ADLPC_MASK; // select normal power configuration + ADC1_CFG1 = 0; // clear register + ADC1_CFG1 |= ADC_CFG1_ADICLK(0); // select bus clock + ADC1_CFG1 |= ADC_CFG1_MODE(3); // select 16-bit 2's complement output + ADC1_CFG1 |= ADC_CFG1_ADIV(0); // clock divisor = 0. + ADC1_CFG1 &= ~ADC_CFG1_ADLSMP_MASK; // select short sample time + ADC1_CFG1 &= ~ADC_CFG1_ADLPC_MASK; // select normal power configuration + + // Setup Configuration Register 2 + ADC0_CFG2 = 0; // clear register + //ADC0_CFG2 |= ADC_CFG2_ADHSC_MASK ; // select high-speed conversion + ADC0_CFG2 |= ADC_CFG2_MUXSEL_MASK; // select a channels //possibly change to channel b. + ADC1_CFG2 = 0; // clear register + //ADC1_CFG2 |= ADC_CFG2_ADHSC_MASK ; // select high-speed conversion + ADC1_CFG2 &= ~ADC_CFG2_MUXSEL_MASK; // select a channels + + // Setup Status and Control Register 2 + ADC0_SC2 = 0; // clear register + ADC0_SC2 |= ADC_SC2_REFSEL(0); // select external voltage reference //QUESTION + //ADC0_SC2 |= ADC_SC2_DMAEN_MASK; // enable DMA + //ADC0_SC2 &= ~ADC_SC2_ADTRG_MASK; // select hardware trigger //QESTION + ADC1_SC2 = 0; // clear register + ADC1_SC2 |= ADC_SC2_REFSEL(0); // select external voltage reference + //ADC1_SC2 |= ADC_SC2_DMAEN_MASK; // enable DMA + //ADC1_SC2 &= ~ADC_SC2_ADTRG_MASK; // select hardware trigger + + // Setup Status and Control Register 3 now that calibration is complete + ADC0_SC3 = 0; // Hardware Average set to 4 samples averaged + // Hardware Average Disabled + // select single conversion mode + ADC1_SC3 = 0; // Hardware Average set to 4 samples averaged + // Hardware Average Disabled + // select single conversion mode + //ADC1_SC3 = ADC_SC3_AVGS(0) | ADC_SC3_AVGE_MASK;//JARED COME BACK AND LOOK AT THIS + + // Setup Status and Control Register 1A + ADC0_SC1A = 0; // clear register + ADC0_SC1A &= ~ADC_SC1_DIFF_MASK; // select single-ended mode + ADC0_SC1A |= ADC_SC1_AIEN_MASK; // enable interrupt (for debugging) + ADC0_SC1A |= ADC_SC1_ADCH(12); // select channel 13 + ADC1_SC1A = 0; // clear register + ADC1_SC1A &= ~ADC_SC1_DIFF_MASK; // select single-ended mode + ADC1_SC1A |= ADC_SC1_AIEN_MASK; // enable interrupt (for debugging) + ADC1_SC1A |= ADC_SC1_ADCH(14); // select channel 14 + + + // Check if ADC is finished initializing TODO: This part doesn't seem right, but I did it according to 871 + while( (ADC0_SC1B&ADC_SC1_COCO_MASK)) {} + int gain = ADC0_RA; // read the register to clear SC1A[COCO] //possibly a + while( (ADC1_SC1A&ADC_SC1_COCO_MASK)) {} + gain = ADC1_RA; // read the register to clear SC1A[COCO] + + +//QUESTION + ADC0_SC3 &= ~ADC_SC3_ADCO_MASK; // single conversion mode + ADC1_SC3 &= ~ADC_SC3_ADCO_MASK; // single conversion mode + ADC0_SC2 &= ~ADC_SC2_ADTRG_MASK; // set ADC to software trigger + ADC1_SC2 &= ~ADC_SC2_ADTRG_MASK; // set ADC to software trigger + ADC0_SC1A |= ADC_SC1_ADCH(12); // write to SC1B causing a trigger + ADC1_SC1A |= ADC_SC1_ADCH(14); // write to SC1A causing a trigger +} + + + +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 * TimerInterruptInMicroSeconds * 1e-6 * precompute_counter) * 32500.0 + 33000.0); + 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)); + + } +} //pre_compute_tables + + + + +void ISR_repeat() {//40 KHz + // Calculation of loop for generating signal to output on DAC + + WaveOut.write_u16(out_val_pre[phase_counter]); //creates a wave that bounces between 0 & 3.3 V + + // ISR counter reset and increment + if (ISR_counter >= ISR_counter_loop_reset)//10KHz + { + ISR_counter = 1; + //JARED ADD THESE 2 LINES BACK IN + ADC0_SC1A |= ADC_SC1_ADCH(12); // start ADC process Possibly change to B. + ADC1_SC1A |= ADC_SC1_ADCH(14); // start ADC process + + ADC_reading = true; + current_i_mod = i_mod_pre[phase_counter]; + current_q_mod = q_mod_pre[phase_counter]; + } + else { + ISR_counter++; + } + + phase_counter++; + if (phase_counter >= pre_compute_length) phase_counter = 0; + +} //ISR_repeat + + +void execute_DSP() { +bp_fifo_num++; + if (bp_fifo_num >= bp_fir_length) bp_fifo_num = 0; + + x_0[bp_fifo_num] = (float) (value[1] - value[0]); + x_1[bp_fifo_num] = (float) (value[0] - 32768); + + // Band pass filter of incoming data + float y_0 = x_0[bp_fifo_num] * bp_filter_coeff[0]; + float y_1 = x_1[bp_fifo_num] * bp_filter_coeff[0]; + + for(int fir_counter = 1; fir_counter < bp_fir_length; fir_counter++){ + int fir_index = bp_fifo_num + fir_counter; + if (fir_index >= bp_fir_length) { + fir_index -= bp_fir_length; + } + y_0 += x_0[fir_index] * bp_filter_coeff[fir_counter]; + y_1 += x_1[fir_index] * bp_filter_coeff[fir_counter]; + } + + current_i_mod = i_mod_pre[phase_counter]; + current_q_mod = q_mod_pre[phase_counter]; + + // Demodulation of the signal + x_0_i[lp_fifo_num] = (y_0 * current_i_mod); + x_0_q[lp_fifo_num] = (y_0 * current_q_mod); + x_1_i[lp_fifo_num] = (y_1 * current_i_mod); + x_1_q[lp_fifo_num] = (y_1 * current_q_mod); + + lp_fifo_num++; + if (lp_fifo_num >= lp_fir_length) lp_fifo_num = 0; + + // Low pass filter of demodulated signal + float y_0_i = x_0_i[lp_fifo_num] * lp_filter_coeff[0]; + float y_0_q = x_0_q[lp_fifo_num] * lp_filter_coeff[0]; + float y_1_i = x_1_i[lp_fifo_num] * lp_filter_coeff[0]; + float y_1_q = x_1_q[lp_fifo_num] * lp_filter_coeff[0]; + + for(int fir_counter = 1; fir_counter < lp_fir_length; fir_counter++){ + int fir_index = lp_fifo_num + fir_counter; + if (fir_index >= lp_fir_length) { + fir_index -= lp_fir_length; + } + y_0_i += x_0_i[fir_index] * lp_filter_coeff[fir_counter]; + y_0_q += x_0_q[fir_index] * lp_filter_coeff[fir_counter]; + y_1_i += x_1_i[fir_index] * lp_filter_coeff[fir_counter]; + y_1_q += x_1_q[fir_index] * lp_filter_coeff[fir_counter]; + } + + real_ip = y_0_i * y_1_i + y_0_q * y_1_q; + imag_ip = y_0_q * y_1_i - y_0_i * y_1_q; + y_0_squared = y_0_i * y_0_i + y_0_q * y_0_q; + y_1_squared = y_1_i * y_1_i + y_1_q * y_1_q; + +// float mag = sqrt((real_ip * real_ip + imag_ip * imag_ip) / y_0_squared; + mag = sqrt(((float) real_ip * (float) real_ip + (float) imag_ip * (float) imag_ip)) / ((float) y_0_squared); + mag_total += mag; + calc_mag = mag_total / NumInBlock; + + real_ip_total += real_ip; + imag_ip_total += imag_ip; + calc_phase = -atan2(imag_ip_total, real_ip_total); +} + + + +void setup() { + adc_init(); + pre_compute_tables(); + wait(1); +} //setup + +using namespace std; + +int main() { + led_blue = 1; + led_green = 1; + led_red = 0; + + setup(); + int count = 0; + t1.start(); + + pc.baud(115200); + + for(int i = 0; i < 86; i++) + { + if(NVIC_GetPriority((IRQn_Type) i) == 0) NVIC_SetPriority((IRQn_Type) i, 2); + } + + // Give hardware associated with + // sampling the highest priority + NVIC_SetPriority(ADC1_IRQn,0); + NVIC_SetPriority(ADC0_IRQn,0); + NVIC_SetPriority(PDB0_IRQn,0); + NVIC_SetPriority(DMA0_IRQn,0); + NVIC_SetPriority(DMA1_IRQn,0); + NVIC_SetPriority(DMA2_IRQn,0); + + NVIC_SetPriority(ENET_1588_Timer_IRQn,1); + NVIC_SetPriority(ENET_Transmit_IRQn,1); + NVIC_SetPriority(ENET_Receive_IRQn,1); + NVIC_SetPriority(ENET_Error_IRQn,1); + + led_green = 1; + led_red = 1; + led_blue = 1; + + timer0.attach_us(&ISR_repeat, TimerInterruptInMicroSeconds); + while(true) { + + count++; + //printf("Loop"); + + while (!ADC_reading) + { + + led_blue = 0; + } + + + counter++; + + CyclesInState++; + + + execute_DSP(); + + if (CyclesInState <= PreCalculateCycles) { + NumInBlock = 0; + mag_total = 0; + real_ip_total = 0; + imag_ip_total = 0; + + max_0 = -1; + max_1 = -1; + min_0 = 65536; + min_1 = 65536; + } + else { + NumInBlock++; + if (NumInBlock >= NumCalculatedAverages) { + mag_result = calc_mag; + phase_result = calc_phase; + final_mag = mag_result; + final_phase = phase_result; + NumInBlock = 0; + mag_total = 0; + real_ip_total = 0; + imag_ip_total = 0; + printf("Coeficient%f Phase%f\n\r", final_mag, final_phase); + } + } + + + value[0] = ADC0_RA;//Read adc + value[1] = ADC1_RA;//Read adc + //printf("%f %f\n\r", value[0], value[1]); + ADC_reading = false;//lower flag + + }// end while(true) +}// end main
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sun Sep 06 04:23:51 2015 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/ba1f97679dad \ No newline at end of file