Treehouse Mbed Team / Mbed 2 deprecated 1U5_proto_X

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers adc.cpp Source File

adc.cpp

00001 //-------------------------------------------------------------------------------
00002 // 
00003 //  Treehouse Designs Inc.
00004 //  Colorado Springs, Colorado
00005 // 
00006 //  Copyright (c) 2016 by Treehouse Designs Inc. 
00007 //  Copyright (c) 2018 by Agility Power Systems Inc. 
00008 // 
00009 //  This code is the property of Treehouse Designs, Inc. (Treehouse) and
00010 //  Agility Power Systems Inc. (Agility) and may not be redistributed
00011 //  in any form without prior written permission from 
00012 //  both copyright holders, Treehouse and Agility.
00013 //
00014 //  The above copyright notice and this permission notice shall be included in
00015 //  all copies or substantial portions of the Software.
00016 // 
00017 //   
00018 //-------------------------------------------------------------------------------
00019 // 
00020 //  REVISION HISTORY:
00021 //  
00022 //   $Author: $
00023 //   $Rev: $
00024 //   $Date: $
00025 //   $URL: $
00026 // 
00027 //-------------------------------------------------------------------------------
00028 
00029 #include "mbed.h"
00030 #include "adc_defs.h"
00031 #include "adc.h"
00032 #include "all_io.h"
00033 
00034 void initADC(void){
00035     
00036     //Auto-zero current values
00037     struct adcValues adcVals = getADCresults();
00038     
00039     CURRENT_12_OFFSET = adcVals.i12;
00040     
00041 }
00042 
00043 /*******************************************************************************
00044  getADCresults
00045 *******************************************************************************/
00046 struct adcValues getADCresults(void){
00047     
00048     double v48x = 0; 
00049     double v12x = 0;
00050     double i12x = 0;
00051     double test_vx = 0;
00052     
00053     struct adcValues avals;
00054     unsigned int loopCounter = LOOP_COUNTER;
00055     
00056     for(unsigned int i=0;i<loopCounter;i++){
00057         v48x = v48x + VIN48.read_u16();
00058         v12x = v12x + VIN12.read_u16();
00059         i12x = i12x + IIN12.read_u16();
00060         test_vx = test_vx + TESTERPIN.read_u16();
00061     }
00062     avals.test_v = test_vx/loopCounter;
00063     avals.v48 = v48x/loopCounter; 
00064     avals.v12 = v12x/loopCounter;
00065     avals.i12 = i12x/loopCounter;
00066     
00067     return avals;
00068 }
00069 
00070 /*******************************************************************************
00071  getADCvolts
00072 *******************************************************************************/
00073 struct adcValues getADCvolts(void){
00074     
00075     unsigned int v48x = 0; 
00076     unsigned int v12x = 0;
00077     unsigned int test_vx = 0;
00078     
00079     struct adcValues avals;
00080     
00081     for(unsigned int i=0;i<100;i++){
00082         v48x = v48x + VIN48.read_u16();
00083         v12x = v12x + VIN12.read_u16();
00084         test_vx = test_vx + TESTERPIN.read_u16();
00085     }
00086     avals.test_v = test_vx/100;
00087     avals.v48 = v48x/100; 
00088     avals.v12 = v12x/100;
00089     
00090     return avals;
00091 }
00092 
00093 /*******************************************************************************
00094  getADCamps
00095 *******************************************************************************/
00096 struct adcValues getADCamps(void){
00097     
00098     unsigned int i12x = 0;
00099     
00100     struct adcValues avals;
00101     
00102     for(unsigned int i=0;i<100;i++){
00103         i12x = i12x + IIN12.read_u16();
00104     }
00105     avals.i12 = i12x/100;
00106     
00107     return avals;
00108 }
00109 
00110 /*******************************************************************************
00111  calcDisplayValues
00112 *******************************************************************************/
00113 struct displayValues calcDisplayValues(struct adcValues avals){
00114     
00115     struct displayValues dvals;
00116     
00117     if(!raw){
00118         dvals.v48f = VOLTAGE_48_FACTOR*avals.v48;
00119         dvals.v12f = VOLTAGE_12_FACTOR*avals.v12;
00120         //dvals.i48f = ((avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR)-CURRENT_CONTROL_OFFSET;
00121         
00122         // The adc results are linear above CURRENT_48_DIV_THRESH5. Only apply a linear correction to it above that threshold.
00123         // The multiple correction factors below CURRENT_48_DIV_THRESH5 linearize the curve below CURRENT_48_DIV_THRESH5.
00124         /*if(abs((avals.i48-CURRENT_48_OFFSET)) > CURRENT_48_DIV_THRESH5){
00125             dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR5;
00126         }else if(abs((avals.i48-CURRENT_48_OFFSET)) > CURRENT_48_DIV_THRESH4){
00127             dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR4;
00128         }else if(abs((avals.i48-CURRENT_48_OFFSET)) > CURRENT_48_DIV_THRESH3){
00129             dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR3;
00130         }else if(abs((avals.i48-CURRENT_48_OFFSET)) > CURRENT_48_DIV_THRESH2){
00131             dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR2;
00132         }else if(abs((avals.i48-CURRENT_48_OFFSET)) > CURRENT_48_DIV_THRESH1){
00133             dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR1;
00134         }else{
00135             dvals.i48f = (avals.i48-CURRENT_48_OFFSET)/CURRENT_48_DIV_FACTOR0;
00136         }
00137         
00138         dvals.i24f = (avals.i24-CURRENT_24_OFFSET)/CURRENT_24_DIV_FACTOR;
00139         */
00140         // The adc results are linear above CURRENT_12_DIV_THRESH5. Only apply a linear correction to it above that threshold.
00141         // The multiple correction factors below CURRENT_12_DIV_THRESH5 linearize the curve below CURRENT_12_DIV_THRESH5.
00142         if(abs((avals.i12-CURRENT_12_OFFSET)) > CURRENT_12_DIV_THRESH5){
00143             dvals.i12f = (avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR5;
00144         }else if(abs((avals.i12-CURRENT_12_OFFSET)) > CURRENT_12_DIV_THRESH4){
00145             dvals.i12f = (avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR4;
00146         }else if(abs((avals.i12-CURRENT_12_OFFSET)) > CURRENT_12_DIV_THRESH3){
00147             dvals.i12f = (avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR3;
00148         }else if(abs((avals.i12-CURRENT_12_OFFSET)) > CURRENT_12_DIV_THRESH2){
00149             dvals.i12f = (avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR2;
00150         }else if(abs((avals.i12-CURRENT_12_OFFSET)) > CURRENT_12_DIV_THRESH1){
00151             dvals.i12f = (avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR1;
00152         }else{
00153             dvals.i12f = (avals.i12-CURRENT_12_OFFSET)/CURRENT_12_DIV_FACTOR0;
00154         }
00155         dvals.test_v = VOLTAGE_12_FACTOR*avals.test_v;
00156     }else{
00157         //dvals.v48f = 1.0*avals.v48-CURRENT_CONTROL_OFFSET;
00158         dvals.v48f = 1.0*avals.v48;
00159         dvals.v12f = 1.0*avals.v12;
00160         dvals.i12f = 1.0*avals.i12;
00161         dvals.test_v = 1.0*avals.test_v;
00162     }
00163     return dvals;
00164 }