Beunbox test code for gold SP

Dependencies:   mbed ADS1015_fast KXTJ3

Committer:
timleferink
Date:
Tue May 21 14:04:56 2019 +0000
Revision:
13:14f3b1f12aa2
Parent:
11:14eb6b43fe28
updated for white

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DEldering 0:c0e44c46c573 1 #include "mbed.h"
DEldering 0:c0e44c46c573 2 #include "Adafruit_ADS1015.h"
deldering95 9:ea6536825a29 3 #include "KXTJ3.h"
DEldering 0:c0e44c46c573 4
timleferink 13:14f3b1f12aa2 5 #define SERIAL_BAUD_RATE 230400
deldering95 8:00b7a8cbd6ef 6 #define ADC_MAX_VALUE 2048
deldering95 7:d5e1c7c12a26 7 #define DYNAMIC_SCALE 0.6f
deldering95 7:d5e1c7c12a26 8 // READOUT_FREQ should work up to around 200 I think
deldering95 7:d5e1c7c12a26 9 #define READOUT_FREQ 120
RoelvdPlas 10:35dc5fbb025a 10 //
timleferink 11:14eb6b43fe28 11
RoelvdPlas 10:35dc5fbb025a 12 I2C i2c(PC_9, PA_8);
deldering95 8:00b7a8cbd6ef 13 Adafruit_ADS1115 piezo_resistive_adc1(&i2c, 0x48); // first PiëzoResistive ADC
deldering95 8:00b7a8cbd6ef 14 Adafruit_ADS1115 piezo_resistive_adc2(&i2c, 0x49); // second PiëzoResistive ADC
deldering95 8:00b7a8cbd6ef 15 Adafruit_ADS1115 piezo_electric_adc(&i2c, 0x4B);
deldering95 8:00b7a8cbd6ef 16 Adafruit_ADS1115 piezo_electric_adc2(&i2c, 0x4A);
deldering95 9:ea6536825a29 17 KXTJ3 accelero(&i2c);
deldering95 7:d5e1c7c12a26 18 adsGain_t pga_table[]= {GAIN_SIXTEEN,GAIN_EIGHT,GAIN_FOUR,GAIN_TWO,GAIN_ONE};
timleferink 11:14eb6b43fe28 19 //Serial pc(PC_12, PD_2); // debug tx, rx
timleferink 11:14eb6b43fe28 20 Serial pc(PB_10, PC_5); // RS232 tx, rx
deldering95 7:d5e1c7c12a26 21 Ticker sample;
deldering95 8:00b7a8cbd6ef 22 int16_t res[8] = {0,0,0,0,0,0,0,0}; // 8 PR sensors 1 time per cycle
deldering95 8:00b7a8cbd6ef 23 uint8_t scaler_res[8] = {1,1,1,1,1,1,1,1}; // 8 PR sensors 1 time per cycle
deldering95 8:00b7a8cbd6ef 24 int ele[6] = {0,0,0,0,0,0}; // 8 PR sensors 1 time per cycle
deldering95 8:00b7a8cbd6ef 25 uint8_t scaler_ele[6] = {1,1,1,1,1,1}; // 8 PR sensors 1 time per cycle
RoelvdPlas 10:35dc5fbb025a 26 //short read[10];
deldering95 9:ea6536825a29 27 float accelerometer_data[3];
deldering95 9:ea6536825a29 28 int accelerometer_zaxis;
timleferink 11:14eb6b43fe28 29
timleferink 11:14eb6b43fe28 30
deldering95 8:00b7a8cbd6ef 31 int channel_electric=0;
deldering95 8:00b7a8cbd6ef 32 int channel_resistive=0;
deldering95 9:ea6536825a29 33 int sample_period;
deldering95 9:ea6536825a29 34
deldering95 7:d5e1c7c12a26 35 Timer times;
deldering95 9:ea6536825a29 36 Timer total_time;
deldering95 7:d5e1c7c12a26 37
deldering95 8:00b7a8cbd6ef 38 uint8_t determineNextGain(int last_sample)
deldering95 7:d5e1c7c12a26 39 {
deldering95 8:00b7a8cbd6ef 40 if(last_sample<0) {
deldering95 8:00b7a8cbd6ef 41 last_sample=abs(last_sample);
deldering95 8:00b7a8cbd6ef 42 }
deldering95 8:00b7a8cbd6ef 43 uint8_t gain_factor=0;
deldering95 8:00b7a8cbd6ef 44 uint8_t result=1;
deldering95 8:00b7a8cbd6ef 45 uint16_t sample_normalized=last_sample/ADC_MAX_VALUE;//! determine what would have been the ideal gain setting of the last sample
deldering95 8:00b7a8cbd6ef 46 for(uint8_t i=0; i<5; i++) {//! Find the highest power of two in the number (all gain settings are powers of two)
deldering95 8:00b7a8cbd6ef 47 if(sample_normalized&(1<<i)) {
deldering95 8:00b7a8cbd6ef 48 gain_factor=i+1;
deldering95 8:00b7a8cbd6ef 49 }
deldering95 8:00b7a8cbd6ef 50 }
deldering95 8:00b7a8cbd6ef 51 for(uint8_t i=0; i<gain_factor; i++)result*=2;//! 2^(gain_factor)
deldering95 8:00b7a8cbd6ef 52 if(((result*ADC_MAX_VALUE)-last_sample)<(DYNAMIC_SCALE*(result*ADC_MAX_VALUE/2)))gain_factor++;//! If the last sample was closer to the max value of the ideal gain setting than the threshold take one gain setting broader
deldering95 8:00b7a8cbd6ef 53 if(gain_factor>4)gain_factor=4;
deldering95 8:00b7a8cbd6ef 54 return gain_factor;
deldering95 8:00b7a8cbd6ef 55 }
deldering95 8:00b7a8cbd6ef 56
deldering95 8:00b7a8cbd6ef 57 void getSingleResistive()
deldering95 8:00b7a8cbd6ef 58 {
deldering95 8:00b7a8cbd6ef 59 if(channel_resistive>3)return;//! make sure it is a valid channel
deldering95 8:00b7a8cbd6ef 60 uint8_t pga_gain=determineNextGain(res[(channel_resistive+1)%4]);//! calculate pga setting for the next sample conversion of that adc
deldering95 8:00b7a8cbd6ef 61 scaler_res[(channel_resistive+1)%4]=16;
deldering95 8:00b7a8cbd6ef 62 for(uint8_t i=0; i<pga_gain; i++)scaler_res[(channel_resistive+1)%4]/=2; //! Update the scaler to correctly process the gain setting of the incoming adc value later on
deldering95 8:00b7a8cbd6ef 63 piezo_resistive_adc1.setGain(pga_table[pga_gain]);//! Set pga for the next sample conversion
deldering95 8:00b7a8cbd6ef 64 res[channel_resistive]=piezo_resistive_adc1.readADC_SingleEnded(((channel_resistive+1)%4))/scaler_res[channel_resistive];//! Readout sample and start next conversion
deldering95 7:d5e1c7c12a26 65
deldering95 8:00b7a8cbd6ef 66 //! same as above but for the other PR ADC
deldering95 8:00b7a8cbd6ef 67 pga_gain=determineNextGain(res[((channel_resistive+1)%4)+4]);
deldering95 8:00b7a8cbd6ef 68 scaler_res[((channel_resistive+1)%4)+4]=16;
deldering95 8:00b7a8cbd6ef 69 for(uint8_t i=0; i<pga_gain; i++)scaler_res[((channel_resistive+1)%4)+4]/=2;
deldering95 8:00b7a8cbd6ef 70 piezo_resistive_adc2.setGain(pga_table[pga_gain]);
deldering95 8:00b7a8cbd6ef 71 res[channel_resistive+4]=piezo_resistive_adc2.readADC_SingleEnded(((channel_resistive+1)%4))/scaler_res[channel_resistive+4];
deldering95 8:00b7a8cbd6ef 72 channel_resistive=(channel_resistive+1)%4;
deldering95 8:00b7a8cbd6ef 73 }
deldering95 8:00b7a8cbd6ef 74
deldering95 8:00b7a8cbd6ef 75 void getSingleElectric()
deldering95 8:00b7a8cbd6ef 76 {
deldering95 8:00b7a8cbd6ef 77
deldering95 8:00b7a8cbd6ef 78 //! Same as getResistive but for the PE ADCs
deldering95 8:00b7a8cbd6ef 79 if(channel_electric>2) {
deldering95 8:00b7a8cbd6ef 80 channel_electric=(channel_electric+1)%4;
deldering95 8:00b7a8cbd6ef 81 return;//! Make sure it is a valid channel
deldering95 7:d5e1c7c12a26 82 }
deldering95 8:00b7a8cbd6ef 83 uint8_t pga_gain=determineNextGain(ele[(channel_electric+1)%3]);
deldering95 8:00b7a8cbd6ef 84 scaler_ele[(channel_electric+1)%3]=16;
deldering95 8:00b7a8cbd6ef 85 for(uint8_t i=0; i<pga_gain; i++)scaler_ele[(channel_electric+1)%3]/=2;
deldering95 8:00b7a8cbd6ef 86 piezo_electric_adc.setGain(pga_table[pga_gain]);
deldering95 8:00b7a8cbd6ef 87 ele[channel_electric]=piezo_electric_adc.readADC_Differential((channel_electric+1)%3)/scaler_ele[channel_electric];
deldering95 8:00b7a8cbd6ef 88
deldering95 8:00b7a8cbd6ef 89 //2nd adc
deldering95 7:d5e1c7c12a26 90
deldering95 8:00b7a8cbd6ef 91 pga_gain=determineNextGain(ele[((channel_electric+1)%3)+3]);
deldering95 8:00b7a8cbd6ef 92 scaler_ele[((channel_electric+1)%3)+3]=16;
deldering95 8:00b7a8cbd6ef 93 for(uint8_t i=0; i<pga_gain; i++)scaler_ele[((channel_electric+1)%3)+3]/=2;
deldering95 8:00b7a8cbd6ef 94 piezo_electric_adc2.setGain(pga_table[pga_gain]);
deldering95 8:00b7a8cbd6ef 95 ele[channel_electric+3]=piezo_electric_adc2.readADC_Differential((channel_electric+1)%3)/scaler_ele[channel_electric+3];
deldering95 8:00b7a8cbd6ef 96
deldering95 8:00b7a8cbd6ef 97
deldering95 8:00b7a8cbd6ef 98 channel_electric=(channel_electric+1)%4;
deldering95 8:00b7a8cbd6ef 99 }
deldering95 8:00b7a8cbd6ef 100
deldering95 8:00b7a8cbd6ef 101 void read_all_adc_single_channel()
deldering95 8:00b7a8cbd6ef 102 {
deldering95 8:00b7a8cbd6ef 103 getSingleElectric();
deldering95 8:00b7a8cbd6ef 104 getSingleResistive();
deldering95 7:d5e1c7c12a26 105 }
DEldering 0:c0e44c46c573 106
DEldering 0:c0e44c46c573 107 void read_adc()
DEldering 0:c0e44c46c573 108 {
deldering95 9:ea6536825a29 109 times.reset();
deldering95 9:ea6536825a29 110 times.start();
RoelvdPlas 10:35dc5fbb025a 111 //if(boobs.read() > 0.5) {
RoelvdPlas 10:35dc5fbb025a 112 // p++;
RoelvdPlas 10:35dc5fbb025a 113 //stamp = total_time.read_ms();
deldering95 7:d5e1c7c12a26 114 for (int i=0; i<4; i++) {
deldering95 8:00b7a8cbd6ef 115 read_all_adc_single_channel();
deldering95 9:ea6536825a29 116 wait_us(450);
deldering95 9:ea6536825a29 117 }
deldering95 9:ea6536825a29 118 accelero.initialize();
deldering95 9:ea6536825a29 119 accelero.getAccAllAxis(accelerometer_data);
deldering95 9:ea6536825a29 120 accelerometer_zaxis=int(accelerometer_data[2]*1000);
DEldering 1:a8e61f3910ad 121
timleferink 13:14f3b1f12aa2 122 pc.printf("%5d,%5d,%5d,%5d,", res[0], res[1], res[2], res[3]);
timleferink 13:14f3b1f12aa2 123 pc.printf("%5d,%5d,%5d,%5d,", res[4], res[5], res[6], res[7]);
deldering95 8:00b7a8cbd6ef 124 //pc.printf("%d,%d,%d,%d,", scaler_res[0], scaler_res[1], scaler_res[2], scaler_res[3]);
deldering95 8:00b7a8cbd6ef 125 //pc.printf("%d,%d,%d,%d,", scaler_res[4], scaler_res[5], scaler_res[6], scaler_res[7]);
timleferink 13:14f3b1f12aa2 126 pc.printf("%6d,%6d,%6d,", ele[0],ele[1],ele[2]);
timleferink 13:14f3b1f12aa2 127 pc.printf("%6d,%6d,%6d,", ele[3],ele[4],ele[5]);
deldering95 8:00b7a8cbd6ef 128 //pc.printf("%d,%d,%d,",scaler_ele[0],scaler_ele[1],scaler_ele[2]);
deldering95 8:00b7a8cbd6ef 129 //pc.printf("%d,%d,%d,",scaler_ele[3],scaler_ele[4],scaler_ele[5]);
deldering95 9:ea6536825a29 130 pc.printf("%3d,",accelerometer_zaxis);
deldering95 9:ea6536825a29 131 // pc.printf("%d,%d,",p,stamp);
deldering95 9:ea6536825a29 132 pc.printf("\r");
deldering95 9:ea6536825a29 133 pc.printf("\n");
RoelvdPlas 10:35dc5fbb025a 134
deldering95 9:ea6536825a29 135 while(times.read_us()<sample_period) {}
deldering95 7:d5e1c7c12a26 136 }
deldering95 9:ea6536825a29 137
deldering95 7:d5e1c7c12a26 138 void noise()
deldering95 7:d5e1c7c12a26 139 {
deldering95 9:ea6536825a29 140 uint8_t pga_gain=determineNextGain(ele[4]);
deldering95 9:ea6536825a29 141 scaler_ele[4]=16;
deldering95 9:ea6536825a29 142 for(uint8_t i=0; i<pga_gain; i++)scaler_ele[4]/=2;
deldering95 9:ea6536825a29 143 piezo_electric_adc2.setGain(pga_table[pga_gain]);
deldering95 9:ea6536825a29 144 ele[4]=piezo_electric_adc2.readADC_Differential(1)/scaler_ele[4];
deldering95 7:d5e1c7c12a26 145 pc.printf("%d\n",ele[4]);
DEldering 0:c0e44c46c573 146 }
deldering95 9:ea6536825a29 147
DEldering 0:c0e44c46c573 148 int main()
DEldering 0:c0e44c46c573 149 {
deldering95 9:ea6536825a29 150 sample_period=1000000/READOUT_FREQ;
deldering95 7:d5e1c7c12a26 151 i2c.frequency(400000);
deldering95 7:d5e1c7c12a26 152 pc.baud(SERIAL_BAUD_RATE);
RoelvdPlas 10:35dc5fbb025a 153 //sample.attach_us(&read_adc, sample_period);
deldering95 7:d5e1c7c12a26 154 //sample.attach_us(&noise, 500);
deldering95 9:ea6536825a29 155
RoelvdPlas 10:35dc5fbb025a 156 //total_time.start();
deldering95 9:ea6536825a29 157
DEldering 0:c0e44c46c573 158 while (1) {
RoelvdPlas 10:35dc5fbb025a 159 read_adc();
RoelvdPlas 10:35dc5fbb025a 160
DEldering 0:c0e44c46c573 161 }
DEldering 0:c0e44c46c573 162 }