/* * adc.h * * Created on: Mar 31, 2023 * Author: Keith.Lloyd */ #ifndef ADC_H_ #define ADC_H_ #include "arm_math.h" #define ADC_NUM_AVERAGES 10 //number of samples averaged for measurements #define ADC_VREF 3.3 //3.23 //ADC reference voltage = 3v3 supply (Measured @ 3.23v) #define ADC_HALF_COUNTS 2048 //half of max ADC reading #define ADC_OFFSET_MAX_ERROR 30 //maximum allowed error for ADC offset measurement #define ADC_USE_NOISE_OFFSET 1 //Use a standard noise offset #define ADC_NOISE_OFFSET_COUNTS 13 //ADC offset due to precision rectifier noise conversion to DC #define ADC_CORRECT_FOR_CURRENT_NOISE 1 //Correct current measurement for noise from the precision rectifier #define ADC_USE_CURRENT_TABLE 1 //Use the current table to scale current measurements #define ADC_TABLE_COLUMNS 2 //number of columns for current and voltage tables #define ADC_TABLE_COLUMNS2 3 //number of columns for current and voltage tables with offset #define ADC_TABLE_FREQ 0 //frequency column in current and voltage tables #define ADC_TABLE_SCALE 1 //scale column in current and voltage tables #define ADC_TABLE_OFFSET 2 //offset column in current tables #define ADC_LOW_GAIN_CURR_CLIP_THRESH 1050 //LOW gain current measurement clipping threshold (in ADC counts) #define ADC_HIGH_GAIN_CURR_CLIP_THRESH 800 //HIGH gain current measurement clipping threshold (in ADC counts) #define ADC_LOW_GAIN_VOLT_CLIP_THRESH 1050 #define ADC_HIGH_GAIN_VOLT_CLIP_THRESH 800 #define ADC_MEASUREMENT_TEST 0 //Collect ADC data @ adc sampleRate when triggered. FOR TESTING #if ADC_MEASUREMENT_TEST #define ADC_NUM_TEST 40 //10mS samples #endif typedef struct { bool measure; //measure ADC values in timer ISR //current measurement offset bool iosOK; //current offset within limits, use it uint32_t I_OffsetAdc; //Current channel offset - measured @ startup uint32_t rawCurrent; //raw current measurement used for offset //Voltage measurement offset bool vosOK; //voltage offset error within limits, use it uint32_t V_OffsetAdc; //VOltage channel offset - measured @ startup uint32_t rawVoltage; //raw voltage measurement used for offset bool currentClipping; //Current measurement clip status (for LOW and HIGH gains) bool voltageClipping; //Voltage measurement clip status (for LOW and HIGH gains) //storage for raw ADC values (0 - 4096). Sum up samples uint32_t V_ID1_RAW; //ch5 Port A identifier. uint32_t V_ID2_RAW; //ch6 Port B identifier uint32_t V_CHK_RAW; //ch7 Incoming voltage eg. 110V uint32_t V_PSU_RAW; //ch3 Power supply monitor uint32_t V_TMP_RAW; //ch8 External temperature uint32_t I_OUT_RAW; // ch0 Current out uint32_t V_OUT_RAW; // ch1 Volts Out uint32_t V_BAT_RAW; //ch4 Battery Voltage uint32_t V_BID_RAW; //ch10 Battery ID //Storage for scaled value - float32_t float32_t V_ID1; float32_t V_ID2; float32_t V_CHK; float32_t V_BID; float32_t V_BAT; float32_t I_OUT; float32_t V_OUT; float32_t V_TMP; float32_t V_PSU; //Storage for filtered values - float32_t float32_t I_OUT_SlowFilt; float32_t V_OUT_SlowFilt; float32_t V_OUT_FastFilt; float32_t I_OUT_FastFilt; float32_t Ohms_slowfilt; // Delay Lines for filters float32_t V_OUT_Delay; float32_t I_OUT_Delay; float32_t V_OUT_FastDelay; float32_t I_OUT_FastDelay; float32_t Ohms_FastDelay; float32_t Ohms_SlowDelay; #if 1 //ADC raw current filtering - This is for testing float32_t IRaw; float32_t IRawFilt; float32_t IRawDelay; #endif #if 1 //ADC raw voltage filtering - This is for testing float32_t VRaw; float32_t VRawFilt; float32_t VRawDelay; #endif uint32_t diag_bat; // commented test value for battery diagnosis //TESTING - faster current measurement without averaging #if ADC_MEASUREMENT_TEST bool testCollectData; uint32_t testIndex; //storage for sampled data float32_t testData1[ADC_NUM_TEST]; float32_t testData2[ADC_NUM_TEST]; float32_t testIout; float32_t testIoutDelay; float32_t testVout; float32_t testVoutDelay; #endif }ADC_t; void ADC_SysInit(void); void ADC_MeasureCurrentOffset(void); void ADC_Update(void); float32_t FILT_ExpAvgF32(float32_t input, float32_t *temp, float32_t k); #endif /* ADC_H_ */