Files
TX/source/adc.h
2025-06-11 10:55:00 -05:00

142 lines
4.1 KiB
C

/*
* 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_ */