Treehouse Mbed Team / Mbed 2 deprecated APS_DCM1SL2

Dependencies:   mbed

Committer:
Slord2142
Date:
Thu Aug 22 15:38:50 2019 +0000
Revision:
33:6c7364ea360f
Parent:
30:d8721a46ee03
Child:
54:660af33fa930
Newest edition. Many changes since last time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mfwic 0:44a3005d4f20 1 //-------------------------------------------------------------------------------
mfwic 0:44a3005d4f20 2 //
mfwic 0:44a3005d4f20 3 // Treehouse Designs Inc.
mfwic 0:44a3005d4f20 4 // Colorado Springs, Colorado
mfwic 0:44a3005d4f20 5 //
mfwic 0:44a3005d4f20 6 // Copyright (c) 2016 by Treehouse Designs Inc.
mfwic 0:44a3005d4f20 7 // Copyright (c) 2018 by Agility Power Systems Inc.
mfwic 0:44a3005d4f20 8 //
mfwic 0:44a3005d4f20 9 // This code is the property of Treehouse Designs, Inc. (Treehouse) and
mfwic 0:44a3005d4f20 10 // Agility Power Systems Inc. (Agility) and may not be redistributed
mfwic 0:44a3005d4f20 11 // in any form without prior written permission from
mfwic 0:44a3005d4f20 12 // both copyright holders, Treehouse and Agility.
mfwic 0:44a3005d4f20 13 //
mfwic 0:44a3005d4f20 14 // The above copyright notice and this permission notice shall be included in
mfwic 0:44a3005d4f20 15 // all copies or substantial portions of the Software.
mfwic 0:44a3005d4f20 16 //
mfwic 0:44a3005d4f20 17 //
mfwic 0:44a3005d4f20 18 //-------------------------------------------------------------------------------
mfwic 0:44a3005d4f20 19 //
mfwic 0:44a3005d4f20 20 // REVISION HISTORY:
mfwic 0:44a3005d4f20 21 //
mfwic 0:44a3005d4f20 22 // $Author: $
mfwic 0:44a3005d4f20 23 // $Rev: $
mfwic 0:44a3005d4f20 24 // $Date: $
mfwic 0:44a3005d4f20 25 // $URL: $
mfwic 0:44a3005d4f20 26 //
mfwic 0:44a3005d4f20 27 //-------------------------------------------------------------------------------
mfwic 0:44a3005d4f20 28
mfwic 0:44a3005d4f20 29 #include "mbed.h"
mfwic 11:01dcfb29fbc4 30 #include "adc_defs.h"
mfwic 0:44a3005d4f20 31 #include "adc.h"
mfwic 1:9f8583ba2431 32 #include "all_io.h"
mfwic 0:44a3005d4f20 33
mfwic 0:44a3005d4f20 34 void initADC(void){
mfwic 0:44a3005d4f20 35
mfwic 18:78e982f31c6b 36 //Auto-zero current values
mfwic 17:454afe56eedb 37 struct adcValues adcVals = getADCresults();
mfwic 17:454afe56eedb 38
mfwic 17:454afe56eedb 39 CURRENT_48_OFFSET = adcVals.i48;
mfwic 17:454afe56eedb 40 CURRENT_24_OFFSET = adcVals.i24;
mfwic 17:454afe56eedb 41 CURRENT_12_OFFSET = adcVals.i12;
mfwic 17:454afe56eedb 42
mfwic 0:44a3005d4f20 43 }
mfwic 0:44a3005d4f20 44
mfwic 11:01dcfb29fbc4 45 /*******************************************************************************
mfwic 11:01dcfb29fbc4 46 getADCresults
mfwic 11:01dcfb29fbc4 47 *******************************************************************************/
mfwic 11:01dcfb29fbc4 48 struct adcValues getADCresults(void){
mfwic 8:d3d7dca419b3 49
mfwic 8:d3d7dca419b3 50 unsigned int v48x = 0;
mfwic 8:d3d7dca419b3 51 unsigned int v24x = 0;
mfwic 8:d3d7dca419b3 52 unsigned int v12x = 0;
mfwic 8:d3d7dca419b3 53 unsigned int i48x = 0;
mfwic 8:d3d7dca419b3 54 unsigned int i24x = 0;
mfwic 8:d3d7dca419b3 55 unsigned int i12x = 0;
mfwic 8:d3d7dca419b3 56
mfwic 11:01dcfb29fbc4 57 struct adcValues avals;
mfwic 9:816b9a4e4f21 58 unsigned int loopCounter = LOOP_COUNTER;
mfwic 9:816b9a4e4f21 59
mfwic 9:816b9a4e4f21 60 for(unsigned int i=0;i<loopCounter;i++){
mfwic 8:d3d7dca419b3 61 v48x = v48x + VIN48.read_u16();
mfwic 12:fd1fd1857628 62 i48x = i48x + IIN48.read_u16();
mfwic 8:d3d7dca419b3 63 v24x = v24x + VIN24.read_u16();
mfwic 12:fd1fd1857628 64 i24x = i24x + IIN24.read_u16();
mfwic 8:d3d7dca419b3 65 v12x = v12x + VIN12.read_u16();
mfwic 8:d3d7dca419b3 66 i12x = i12x + IIN12.read_u16();
mfwic 8:d3d7dca419b3 67 }
mfwic 11:01dcfb29fbc4 68 avals.v48 = v48x/loopCounter;
mfwic 11:01dcfb29fbc4 69 avals.v24 = v24x/loopCounter;
mfwic 11:01dcfb29fbc4 70 avals.v12 = v12x/loopCounter;
mfwic 11:01dcfb29fbc4 71 avals.i48 = i48x/loopCounter;
mfwic 11:01dcfb29fbc4 72 avals.i24 = i24x/loopCounter;
mfwic 11:01dcfb29fbc4 73 avals.i12 = i12x/loopCounter;
mfwic 11:01dcfb29fbc4 74
mfwic 11:01dcfb29fbc4 75 return avals;
mfwic 8:d3d7dca419b3 76 }
mfwic 8:d3d7dca419b3 77
mfwic 11:01dcfb29fbc4 78 /*******************************************************************************
mfwic 11:01dcfb29fbc4 79 getADCvolts
mfwic 11:01dcfb29fbc4 80 *******************************************************************************/
mfwic 11:01dcfb29fbc4 81 struct adcValues getADCvolts(void){
mfwic 8:d3d7dca419b3 82
mfwic 8:d3d7dca419b3 83 unsigned int v48x = 0;
mfwic 8:d3d7dca419b3 84 unsigned int v24x = 0;
mfwic 8:d3d7dca419b3 85 unsigned int v12x = 0;
mfwic 8:d3d7dca419b3 86
mfwic 11:01dcfb29fbc4 87 struct adcValues avals;
mfwic 11:01dcfb29fbc4 88
mfwic 8:d3d7dca419b3 89 for(unsigned int i=0;i<100;i++){
mfwic 8:d3d7dca419b3 90 v48x = v48x + VIN48.read_u16();
mfwic 8:d3d7dca419b3 91 v24x = v24x + VIN24.read_u16();
mfwic 8:d3d7dca419b3 92 v12x = v12x + VIN12.read_u16();
mfwic 8:d3d7dca419b3 93 }
mfwic 11:01dcfb29fbc4 94 avals.v48 = v48x/100;
mfwic 11:01dcfb29fbc4 95 avals.v24 = v24x/100;
mfwic 11:01dcfb29fbc4 96 avals.v12 = v12x/100;
mfwic 11:01dcfb29fbc4 97
mfwic 11:01dcfb29fbc4 98 return avals;
mfwic 0:44a3005d4f20 99 }
mfwic 0:44a3005d4f20 100
mfwic 11:01dcfb29fbc4 101 /*******************************************************************************
mfwic 11:01dcfb29fbc4 102 getADCamps
mfwic 11:01dcfb29fbc4 103 *******************************************************************************/
mfwic 11:01dcfb29fbc4 104 struct adcValues getADCamps(void){
mfwic 8:d3d7dca419b3 105
mfwic 8:d3d7dca419b3 106 unsigned int i48x = 0;
mfwic 8:d3d7dca419b3 107 unsigned int i24x = 0;
mfwic 8:d3d7dca419b3 108 unsigned int i12x = 0;
mfwic 8:d3d7dca419b3 109
mfwic 11:01dcfb29fbc4 110 struct adcValues avals;
mfwic 11:01dcfb29fbc4 111
mfwic 8:d3d7dca419b3 112 for(unsigned int i=0;i<100;i++){
mfwic 8:d3d7dca419b3 113 i48x = i48x + IIN48.read_u16();
mfwic 8:d3d7dca419b3 114 i24x = i24x + IIN24.read_u16();
mfwic 22:2c37ac12746e 115 i12x = i12x + IIN12.read_u16();
mfwic 8:d3d7dca419b3 116 }
mfwic 11:01dcfb29fbc4 117 avals.i48 = i48x/100;
mfwic 11:01dcfb29fbc4 118 avals.i24 = i24x/100;
mfwic 11:01dcfb29fbc4 119 avals.i12 = i12x/100;
mfwic 11:01dcfb29fbc4 120
mfwic 11:01dcfb29fbc4 121 return avals;
mfwic 11:01dcfb29fbc4 122 }
mfwic 11:01dcfb29fbc4 123
mfwic 11:01dcfb29fbc4 124 /*******************************************************************************
mfwic 11:01dcfb29fbc4 125 calcDisplayValues
mfwic 11:01dcfb29fbc4 126 *******************************************************************************/
mfwic 11:01dcfb29fbc4 127 struct displayValues calcDisplayValues(struct adcValues avals){
mfwic 11:01dcfb29fbc4 128
mfwic 11:01dcfb29fbc4 129 struct displayValues dvals;
mfwic 11:01dcfb29fbc4 130
mfwic 11:01dcfb29fbc4 131 if(!raw){
Slord2142 33:6c7364ea360f 132 double VOLTAGE_48_CORRECTION = VOLTAGE_TARG_VALUE/VOLTAGE_48_ACTUAL_VALUE/ADC_SCALE_FACTOR;
Slord2142 33:6c7364ea360f 133 double VOLTAGE_24_CORRECTION = VOLTAGE_TARG_VALUE/VOLTAGE_24_ACTUAL_VALUE/ADC_SCALE_FACTOR;
Slord2142 33:6c7364ea360f 134 double VOLTAGE_12_CORRECTION = VOLTAGE_TARG_VALUE/VOLTAGE_12_ACTUAL_VALUE/ADC_SCALE_FACTOR;
Slord2142 33:6c7364ea360f 135 double VOLTAGE_48_FACTOR = 48.0*VOLTAGE_48_CORRECTION;
Slord2142 33:6c7364ea360f 136 double VOLTAGE_24_FACTOR = 24.0*VOLTAGE_24_CORRECTION;
Slord2142 33:6c7364ea360f 137 double VOLTAGE_12_FACTOR = 12.0*VOLTAGE_12_CORRECTION;
Slord2142 33:6c7364ea360f 138 dvals.v48f = (VOLTAGE_48_FACTOR*avals.v48) - VOLTAGE_48_OFFSET;
Slord2142 33:6c7364ea360f 139 dvals.v24f = (VOLTAGE_24_FACTOR*avals.v24) - VOLTAGE_24_OFFSET;
Slord2142 33:6c7364ea360f 140 dvals.v12f = (VOLTAGE_12_FACTOR*avals.v12) - VOLTAGE_12_OFFSET;
mfwic 25:8bcc8bea0e31 141
mfwic 25:8bcc8bea0e31 142 // The adc results are linear above CURRENT_48_DIV_THRESH5. Only apply a linear correction to it above that threshold.
mfwic 25:8bcc8bea0e31 143 // The multiple correction factors below CURRENT_48_DIV_THRESH5 linearize the curve below CURRENT_48_DIV_THRESH5.
mfwic 25:8bcc8bea0e31 144 if(abs((avals.i48-CURRENT_48_OFFSET)) > CURRENT_48_DIV_THRESH5){
mfwic 25:8bcc8bea0e31 145 dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR5;
mfwic 25:8bcc8bea0e31 146 }else if(abs((avals.i48-CURRENT_48_OFFSET)) > CURRENT_48_DIV_THRESH4){
mfwic 25:8bcc8bea0e31 147 dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR4;
mfwic 25:8bcc8bea0e31 148 }else if(abs((avals.i48-CURRENT_48_OFFSET)) > CURRENT_48_DIV_THRESH3){
mfwic 25:8bcc8bea0e31 149 dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR3;
mfwic 25:8bcc8bea0e31 150 }else if(abs((avals.i48-CURRENT_48_OFFSET)) > CURRENT_48_DIV_THRESH2){
mfwic 25:8bcc8bea0e31 151 dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR2;
mfwic 25:8bcc8bea0e31 152 }else if(abs((avals.i48-CURRENT_48_OFFSET)) > CURRENT_48_DIV_THRESH1){
mfwic 25:8bcc8bea0e31 153 dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR1;
mfwic 25:8bcc8bea0e31 154 }else{
mfwic 25:8bcc8bea0e31 155 dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR0;
mfwic 25:8bcc8bea0e31 156 }
mfwic 25:8bcc8bea0e31 157
mfwic 11:01dcfb29fbc4 158 dvals.i24f = (avals.i24-CURRENT_24_OFFSET)/CURRENT_24_DIV_FACTOR;
mfwic 25:8bcc8bea0e31 159
mfwic 25:8bcc8bea0e31 160 // The adc results are linear above CURRENT_12_DIV_THRESH5. Only apply a linear correction to it above that threshold.
mfwic 25:8bcc8bea0e31 161 // The multiple correction factors below CURRENT_12_DIV_THRESH5 linearize the curve below CURRENT_12_DIV_THRESH5.
mfwic 25:8bcc8bea0e31 162 if(abs((avals.i12-CURRENT_12_OFFSET)) > CURRENT_12_DIV_THRESH5){
Slord2142 33:6c7364ea360f 163 dvals.i12f = ((avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR5)-CURRENT_12_CORRECTION5;
mfwic 25:8bcc8bea0e31 164 }else if(abs((avals.i12-CURRENT_12_OFFSET)) > CURRENT_12_DIV_THRESH4){
Slord2142 33:6c7364ea360f 165 dvals.i12f = ((avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR4)-CURRENT_12_CORRECTION4;
mfwic 25:8bcc8bea0e31 166 }else if(abs((avals.i12-CURRENT_12_OFFSET)) > CURRENT_12_DIV_THRESH3){
Slord2142 33:6c7364ea360f 167 dvals.i12f = ((avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR3)-CURRENT_12_CORRECTION3;
mfwic 25:8bcc8bea0e31 168 }else if(abs((avals.i12-CURRENT_12_OFFSET)) > CURRENT_12_DIV_THRESH2){
Slord2142 33:6c7364ea360f 169 dvals.i12f = ((avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR2)-CURRENT_12_CORRECTION2;
mfwic 25:8bcc8bea0e31 170 }else if(abs((avals.i12-CURRENT_12_OFFSET)) > CURRENT_12_DIV_THRESH1){
Slord2142 33:6c7364ea360f 171 dvals.i12f = ((avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR1)-CURRENT_12_CORRECTION1;
mfwic 25:8bcc8bea0e31 172 }else{
Slord2142 33:6c7364ea360f 173 dvals.i12f = ((avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR0)-CURRENT_12_CORRECTION0;
mfwic 25:8bcc8bea0e31 174 }
mfwic 11:01dcfb29fbc4 175 }else{
mfwic 18:78e982f31c6b 176 dvals.v48f = 1.0*avals.v48;
mfwic 11:01dcfb29fbc4 177 dvals.v24f = 1.0*avals.v24;
mfwic 11:01dcfb29fbc4 178 dvals.v12f = 1.0*avals.v12;
mfwic 11:01dcfb29fbc4 179 dvals.i48f = 1.0*avals.i48;
mfwic 11:01dcfb29fbc4 180 dvals.i24f = 1.0*avals.i24;
mfwic 11:01dcfb29fbc4 181 dvals.i12f = 1.0*avals.i12;
mfwic 11:01dcfb29fbc4 182 }
mfwic 11:01dcfb29fbc4 183 return dvals;
mfwic 0:44a3005d4f20 184 }