
Beunbox test code for gold SP
Dependencies: mbed ADS1015_fast KXTJ3
Sensorplate/main.cpp@13:14f3b1f12aa2, 2019-05-21 (annotated)
- 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?
User | Revision | Line number | New 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 | } |