EIS-BLE-S3/main/eis.h

80 lines
1.8 KiB
C

#ifndef EIS_H
#define EIS_H
#include "ad5940.h"
#define EIS_MAX_POINTS 100
typedef enum {
RTIA_200 = 0, RTIA_1K, RTIA_5K, RTIA_10K,
RTIA_20K, RTIA_40K, RTIA_80K, RTIA_160K,
RTIA_EXT_DE0,
RTIA_COUNT
} EISRtia;
typedef enum {
RCAL_200R = 0, /* RCAL0 ↔ RCAL1 */
RCAL_3K, /* RCAL0 ↔ AIN0 */
RCAL_COUNT
} EISRcal;
typedef enum {
ELEC_4WIRE = 0, /* AIN3 drive, AIN0 return, AIN2/AIN1 sense */
ELEC_3WIRE, /* CE0 drive, RE0 sense+, SE0 sense-/TIA */
ELEC_COUNT
} EISElectrode;
typedef struct {
float freq_start_hz;
float freq_stop_hz;
uint16_t points_per_decade;
EISRtia rtia;
EISRcal rcal;
EISElectrode electrode;
uint32_t pga;
uint32_t excit_amp;
} EISConfig;
typedef struct {
float freq_hz;
float mag_ohms;
float phase_deg;
float z_real;
float z_imag;
float rtia_mag_before;
float rtia_mag_after;
float rev_mag;
float rev_phase;
float pct_err;
} EISPoint;
typedef int (*eis_point_cb_t)(uint16_t idx, const EISPoint *pt);
void eis_default_config(EISConfig *cfg);
void eis_init(const EISConfig *cfg);
void eis_reconfigure(const EISConfig *cfg);
int eis_measure_point(float freq_hz, EISPoint *out);
int eis_sweep(EISPoint *out, uint32_t max_points, eis_point_cb_t cb);
uint32_t eis_calc_num_points(const EISConfig *cfg);
int eis_open_cal(EISPoint *buf, uint32_t max_points, eis_point_cb_t cb);
void eis_clear_open_cal(void);
int eis_has_open_cal(void);
void eis_load_open_cal(void);
void eis_set_cell_k(float k);
float eis_get_cell_k(void);
void eis_load_cell_k(void);
void eis_set_cl_factor(float f);
float eis_get_cl_factor(void);
void eis_load_cl_factor(void);
void eis_set_ph_cal(float slope, float offset);
float eis_get_ph_slope(void);
float eis_get_ph_offset(void);
void eis_load_ph_cal(void);
#endif