Add CV mode calibration parameters and modify calibration functions.

This commit is contained in:
Benny Liu
2022-06-06 18:17:48 +08:00
parent d7c86b86a5
commit c688ee4fda
6 changed files with 94 additions and 64 deletions
@@ -119,19 +119,23 @@ static void setEIS_CV (void)
w32_REG(0x0000003E);
select_REG(LPTIASW0); //LPTIASW0
w32_REG(0x00008034); // SW2 | SW4 | SW5
select_REG(LPTIACON0); //LPTIACON0
w32_REG(0x00000038); //RF 0 | RTIA 200R | Rload 0 | High Current Mode
LPTIAGainCtrl(instru.LPTIAGainLv);
select_REG(LPDACCON0); //LPDACCON0
w32_REG(0x00000001);
//Configure ADC | ADCDAT (0x2074)
select_REG(ADCCON); //ADCCON
w32_REG(0x00011021); //PGA = 1.5 | VZERO | LPTIA_OUT
// w32_REG(0x00010617); //PGA = 1.5 | AIN2_Vbias_cap | VZERO // to monitor Vzero voltage fluctuation
select_REG(ADCFILTERCON); //ADCFILTERCON
w32_REG(0x00002011); // Sinc3 En | SINC3OSR2 | SINC2OSR22
select_REG(DFTCON); //DFTCON
w32_REG(0x00000001); // Sinc2 to DFT | DFTNUM4
// mean function for calibration
select_REG(REG_AFE_STATSCON); // don't use mean function
w32_REG(0x00000001); // dev | 128 samples | enable statistics
//AFE and PWMB
select_REG(AFECON); //AFECON
w32_REG(0x00098780); //ADC on //0b10011000011110000000
@@ -204,8 +204,8 @@ static void LPTIAGainCtrl(uint8_t LPTIALevel){
LPTIACON0[12:10] = RLOAD, set at 0R;
LPTIACON0[9:5] = RTIA;
LPTIACON0[4:3] = IBOOST, High current mode; */
uint32_t code;
uint8_t data;
uint32_t code = 0x00000038; // disconnect LPF | RL 0R | RTIA 200R | high I mode
uint8_t data = 1; // RTIA = 200R
if (LPTIALevel == LPRTIA_64K) {
data = 17; //64k
@@ -224,7 +224,6 @@ static void LPTIAGainCtrl(uint8_t LPTIALevel){
}
select_REG(LPTIACON0); //LPTIACON0
code = r32_REG();
code = (code & (~(31 << 5))) | (data << 5);
select_REG(LPTIACON0); //LPTIACON0
@@ -363,12 +362,12 @@ static int32_t ADCCode2Volt(uint32_t code) {
#define VIN_GAIN_MID1_BOUNDARY2 300000 // 300 mV = 300,000,000 nV
#define VIN_GAIN_LARGE_BOUNDARY 250000 // 250 mV = 250,000,000 nV
#define LPTIA_GAIN_SMALL_BOUNDARY 1500 // 1.5 uA = 1,500,000 pA
#define LPTIA_GAIN_MID1_BOUNDARY1 1000 // 1 uA = 1,000,000 pA
#define LPTIA_GAIN_SMALL_BOUNDARY 6000 // 6 uA = 1,500,000 pA
#define LPTIA_GAIN_MID1_BOUNDARY1 5000 // 5 uA = 1,000,000 pA
#define LPTIA_GAIN_MID1_BOUNDARY2 60000 // 60 uA = 60,000,000 pA
#define LPTIA_GAIN_MID2_BOUNDARY1 40000 // 40 uA = 40,000,000 pA
#define LPTIA_GAIN_MID2_BOUNDARY2 175000 // 175 uA = 175,000 nA
#define LPTIA_GAIN_LARGE_BOUNDARY 120000 // 120 uA = 120,000 nA
#define LPTIA_GAIN_MID2_BOUNDARY1 50000 // 50 uA = 40,000,000 pA
#define LPTIA_GAIN_MID2_BOUNDARY2 600000 // 600 uA = 175,000 nA
#define LPTIA_GAIN_LARGE_BOUNDARY 500000 // 500 uA = 120,000 nA
// Current Squared
/* old boundary */
@@ -685,7 +684,6 @@ static int32_t read_LPTIA_Iin(){
Iin = Cali_LPTIA(ADCraw, instru.ADCGainLv);
InputNotify(NOTIFY_CURRENT, Iin);
InputNotify(NOTIFY_VOLT, ADCraw);
InputNotify(NOTIFY_IMPEDANCE, instru.ADCGainLv);
return Iin;
}
@@ -79,8 +79,8 @@ static int32_t DAC_outputV(int32_t voltLVraw) { // LPDAC output, voltLV = Vbia
select_REG(LPDACDAT0);
w32_REG(DACOutCode);
ret = (int32_t)(v_bias - v_zero) / 200; //vscan
// InputNotify(NOTIFY_VOLT, ret/200);
ret = (int32_t)(v_bias - v_zero); //vscan
InputNotify(NOTIFY_VOLT, ret/200);
return ret;
}
@@ -108,7 +108,6 @@ static void SendCaliValue3(void) {
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][0].HSRTIA_c >> 16) & 0xFF;
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][0].HSRTIA_c >> 8) & 0xFF;
cali_buf[index++] = (uint8_t) CaliTable.Lv[0][0].HSRTIA_c & 0xFF;
cali_buf[index++] = (uint8_t) CaliTable.Lv[0][0].HSRTIA_d & 0xFF;
cali_buf[0] = index - 1;
@@ -134,7 +133,6 @@ static void SendCaliValue4(void) {
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][1].HSRTIA_c >> 16) & 0xFF;
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][1].HSRTIA_c >> 8) & 0xFF;
cali_buf[index++] = (uint8_t) CaliTable.Lv[0][1].HSRTIA_c & 0xFF;
cali_buf[index++] = (uint8_t) CaliTable.Lv[0][1].HSRTIA_d & 0xFF;
cali_buf[0] = index - 1;
@@ -160,7 +158,6 @@ static void SendCaliValue5(void) {
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][2].HSRTIA_c >> 16) & 0xFF;
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][2].HSRTIA_c >> 8) & 0xFF;
cali_buf[index++] = (uint8_t) CaliTable.Lv[0][2].HSRTIA_c & 0xFF;
cali_buf[index++] = (uint8_t) CaliTable.Lv[0][2].HSRTIA_d & 0xFF;
cali_buf[0] = index - 1;
@@ -186,10 +183,6 @@ static void SendCaliValue6(void) {
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][3].HSRTIA_c >> 16) & 0xFF;
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][3].HSRTIA_c >> 8) & 0xFF;
cali_buf[index++] = (uint8_t) CaliTable.Lv[0][3].HSRTIA_c & 0xFF;
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][3].HSRTIA_d >> 24)& 0xFF;
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][3].HSRTIA_d >> 16) & 0xFF;
cali_buf[index++] = (uint8_t) (CaliTable.Lv[0][3].HSRTIA_d >> 8) & 0xFF;
cali_buf[index++] = (uint8_t) CaliTable.Lv[0][3].HSRTIA_d & 0xFF;
cali_buf[0] = index - 1;
@@ -7,14 +7,19 @@ typedef struct _SingleFilterCali{
uint32_t PhaseParaA;
int32_t PhaseParaB;
}SingleFilterCali;
/* res = a*x^2 + b*x + c */
typedef struct _SingleGainLvCali{
int64_t HSRTIA_a;
int64_t HSRTIA_b;
int64_t HSRTIA_c;
int64_t HSRTIA_d;
}SingleGainLvCali;
typedef struct _LowPowerGainLvCali{
long long LPTIA_coeff_a;
long long LPTIA_coeff_b;
long long LPTIA_coeff_c;
}LowPowerGainLvCali;
struct _CaliTable{
//CIS to Controller
char DeviceName[25];
@@ -35,9 +40,7 @@ struct _CaliTable{
long long HSAMP_offset;
SingleGainLvCali Lv[4][4];
long long LPTIA_coeff_a;
long long LPTIA_coeff_b;
long long LPTIA_coeff_c;
LowPowerGainLvCali LP[4];
}CaliTable =
@@ -54,16 +57,15 @@ struct _CaliTable{
#ifdef BOARD_FIRST_STEP_CALI
{
.DeviceName = "BOARD_FIRST_STEP_CALI",
.CutoffFreq = 271200,
.OffsetZero = 0x6504,
/* HSTIA calibration data */
// hsrtia160k
.Lv[0][0].HSRTIA_a = 0, // 1e8
.Lv[0][0].HSRTIA_b = 5665868, // 1e8
.Lv[0][0].HSRTIA_c = 1612, // 1e4
.Lv[0][0].HSRTIA_d = 0, // 1e4
.Lv[1][0].HSRTIA_a = 0, // 1e8
.Lv[1][0].HSRTIA_b = 0, // 1e8
.Lv[1][0].HSRTIA_c = 0, // 1e4
@@ -78,7 +80,6 @@ struct _CaliTable{
.Lv[0][1].HSRTIA_a = 3, // 1e8
.Lv[0][1].HSRTIA_b = 44242940, // 1e8
.Lv[0][1].HSRTIA_c = 148206, // 1e4
.Lv[0][1].HSRTIA_d = 0, // 1e4
.Lv[1][1].HSRTIA_a = 0, // 1e8
.Lv[1][1].HSRTIA_b = 0, // 1e8
.Lv[1][1].HSRTIA_c = 0, // 1e4
@@ -93,7 +94,6 @@ struct _CaliTable{
.Lv[0][2].HSRTIA_a = 2, // 1e8
.Lv[0][2].HSRTIA_b = 178641591, // 1e8
.Lv[0][2].HSRTIA_c = 386005, // 1e4
.Lv[0][2].HSRTIA_d = 0, // 1e4
.Lv[1][2].HSRTIA_a = 0, // 1e8
.Lv[1][2].HSRTIA_b = 0, // 1e8
.Lv[1][2].HSRTIA_c = 0, // 1e4
@@ -108,7 +108,6 @@ struct _CaliTable{
.Lv[0][3].HSRTIA_a = 9404, // 1e8
.Lv[0][3].HSRTIA_b = 4309654444, // 1e8
.Lv[0][3].HSRTIA_c = 15315713, // 1e4
.Lv[0][3].HSRTIA_d = 0, // 1e4
.Lv[1][3].HSRTIA_a = 0, // 1e8
.Lv[1][3].HSRTIA_b = 0, // 1e8
.Lv[1][3].HSRTIA_c = 0, // 1e4
@@ -119,6 +118,7 @@ struct _CaliTable{
.Lv[3][3].HSRTIA_b = 0, // 1e8
.Lv[3][3].HSRTIA_c = 0, // 1e4
/* Phase calibration data */
.Ft[0][0].PhaseParaA = 148031,
.Ft[0][0].PhaseParaB = -89728680,
.Ft[0][1].PhaseParaA = 0,
@@ -155,16 +155,34 @@ struct _CaliTable{
.Ft[3][3].PhaseParaA = 0,
.Ft[3][3].PhaseParaB = 0,
//only for EIS 1e10
/* HSDAC calibration data */
//HSDAC_coeff_a = excel: DAC_AMP
.HSDAC_coeff_a = -166,
.HSDAC_coeff_b = 9781419,
.HSDAC_coeff_c = 181161946,
/* LPDAC calibration data */
//LPDAC_coeff_a = excel: DACoffset
.LPDAC_coeff_a = 8,
.LPDAC_coeff_b = 8360236,
.LPDAC_coeff_c = 131934447554,
/* LPTIA calibration data */
.LP[0].LPTIA_coeff_a = 0, // PGA = 1.5 | calibrated by ADCDAT
.LP[0].LPTIA_coeff_b = -54816709,
.LP[0].LPTIA_coeff_c = 179606310,
.LP[1].LPTIA_coeff_a = 2,
.LP[1].LPTIA_coeff_b = -434063200,
.LP[1].LPTIA_coeff_c = 1422073413,
.LP[2].LPTIA_coeff_a = -9,
.LP[2].LPTIA_coeff_b = -3163492996,
.LP[2].LPTIA_coeff_c = 10368161009,
.LP[3].LPTIA_coeff_a = -481,
.LP[3].LPTIA_coeff_b = -16202491299,
.LP[3].LPTIA_coeff_c = 53149447309,
};
#elif defined(BOARD_A4_DA_32_D4_E7_96)
@@ -177,7 +195,6 @@ struct _CaliTable{
.Lv[0][0].HSRTIA_a = 0, // 1e8
.Lv[0][0].HSRTIA_b = 5665868, // 1e8
.Lv[0][0].HSRTIA_c = 1612, // 1e4
.Lv[0][0].HSRTIA_d = 0, // 1e4
.Lv[1][0].HSRTIA_a = 0, // 1e8
.Lv[1][0].HSRTIA_b = 0, // 1e8
.Lv[1][0].HSRTIA_c = 0, // 1e4
@@ -192,7 +209,6 @@ struct _CaliTable{
.Lv[0][1].HSRTIA_a = 3, // 1e8
.Lv[0][1].HSRTIA_b = 44242940, // 1e8
.Lv[0][1].HSRTIA_c = 148206, // 1e4
.Lv[0][1].HSRTIA_d = 0, // 1e4
.Lv[1][1].HSRTIA_a = 0, // 1e8
.Lv[1][1].HSRTIA_b = 0, // 1e8
.Lv[1][1].HSRTIA_c = 0, // 1e4
@@ -207,7 +223,6 @@ struct _CaliTable{
.Lv[0][2].HSRTIA_a = 2, // 1e8
.Lv[0][2].HSRTIA_b = 178641591, // 1e8
.Lv[0][2].HSRTIA_c = 386005, // 1e4
.Lv[0][2].HSRTIA_d = 0, // 1e4
.Lv[1][2].HSRTIA_a = 0, // 1e8
.Lv[1][2].HSRTIA_b = 0, // 1e8
.Lv[1][2].HSRTIA_c = 0, // 1e4
@@ -222,7 +237,6 @@ struct _CaliTable{
.Lv[0][3].HSRTIA_a = 9404, // 1e8
.Lv[0][3].HSRTIA_b = 4309654444, // 1e8
.Lv[0][3].HSRTIA_c = 15315713, // 1e4
.Lv[0][3].HSRTIA_d = 0, // 1e4
.Lv[1][3].HSRTIA_a = 0, // 1e8
.Lv[1][3].HSRTIA_b = 0, // 1e8
.Lv[1][3].HSRTIA_c = 0, // 1e4
@@ -277,6 +291,22 @@ struct _CaliTable{
.LPDAC_coeff_a = 9,
.LPDAC_coeff_b = 8394985,
.LPDAC_coeff_c = 131178634002,
.LP[0].LPTIA_coeff_a = 0, // PGA = 1.5 | calibrated by ADCDAT
.LP[0].LPTIA_coeff_b = -54816709,
.LP[0].LPTIA_coeff_c = 179606310,
.LP[1].LPTIA_coeff_a = 2,
.LP[1].LPTIA_coeff_b = -434063200,
.LP[1].LPTIA_coeff_c = 1422073413,
.LP[2].LPTIA_coeff_a = -9,
.LP[2].LPTIA_coeff_b = -3163492996,
.LP[2].LPTIA_coeff_c = 10368161009,
.LP[3].LPTIA_coeff_a = -481,
.LP[3].LPTIA_coeff_b = -16202491299,
.LP[3].LPTIA_coeff_c = 53149447309,
};
#elif defined(BOARD_2)
@@ -289,7 +319,6 @@ struct _CaliTable{
.Lv[0][0].HSRTIA_a = 6, // 1e8
.Lv[0][0].HSRTIA_b = 5364069, // 1e8
.Lv[0][0].HSRTIA_c = 333966, // 1e4
.Lv[0][0].HSRTIA_d = 0, // 1e4
.Lv[1][0].HSRTIA_a = 0, // 1e8
.Lv[1][0].HSRTIA_b = 0, // 1e8
.Lv[1][0].HSRTIA_c = 0, // 1e4
@@ -304,7 +333,6 @@ struct _CaliTable{
.Lv[0][1].HSRTIA_a = -2, // 1e8
.Lv[0][1].HSRTIA_b = 44356135, // 1e8
.Lv[0][1].HSRTIA_c = -229167, // 1e4
.Lv[0][1].HSRTIA_d = 0, // 1e4
.Lv[1][1].HSRTIA_a = 0, // 1e8
.Lv[1][1].HSRTIA_b = 0, // 1e8
.Lv[1][1].HSRTIA_c = 0, // 1e4
@@ -319,7 +347,6 @@ struct _CaliTable{
.Lv[0][2].HSRTIA_a = -80, // 1e8
.Lv[0][2].HSRTIA_b = 182590228, // 1e8
.Lv[0][2].HSRTIA_c = -5912444, // 1e4
.Lv[0][2].HSRTIA_d = 0, // 1e4
.Lv[1][2].HSRTIA_a = 0, // 1e8
.Lv[1][2].HSRTIA_b = 0, // 1e8
.Lv[1][2].HSRTIA_c = 0, // 1e4
@@ -334,7 +361,6 @@ struct _CaliTable{
.Lv[0][3].HSRTIA_a = 8416, // 1e8
.Lv[0][3].HSRTIA_b = 4320620916, // 1e8
.Lv[0][3].HSRTIA_c = 21087122, // 1e4
.Lv[0][3].HSRTIA_d = 0, // 1e4
.Lv[1][3].HSRTIA_a = 0, // 1e8
.Lv[1][3].HSRTIA_b = 0, // 1e8
.Lv[1][3].HSRTIA_c = 0, // 1e4
@@ -390,9 +416,21 @@ struct _CaliTable{
.LPDAC_coeff_b = 8381700,
.LPDAC_coeff_c = 131921128904,
.LPTIA_coeff_a = 0,
.LPTIA_coeff_b = 1e8,
.LPTIA_coeff_c = 0,
.LP[0].LPTIA_coeff_a = 0, // PGA = 1.5 | calibrated by ADCDAT
.LP[0].LPTIA_coeff_b = -54816709,
.LP[0].LPTIA_coeff_c = 179606310,
.LP[1].LPTIA_coeff_a = 2,
.LP[1].LPTIA_coeff_b = -434063200,
.LP[1].LPTIA_coeff_c = 1422073413,
.LP[2].LPTIA_coeff_a = -9,
.LP[2].LPTIA_coeff_b = -3163492996,
.LP[2].LPTIA_coeff_c = 10368161009,
.LP[3].LPTIA_coeff_a = -481,
.LP[3].LPTIA_coeff_b = -16202491299,
.LP[3].LPTIA_coeff_c = 53149447309,
};
#endif
@@ -436,20 +474,20 @@ static int64_t Cali_HSTIA (uint64_t value, uint8_t gain_level) {
static int64_t Cali_LPTIA (uint32_t value, uint8_t gain_level) {
/* res = a*x^2 + b*x + c */
int64_t res;
// res = (((int64_t)CaliTable.LPTIA_coeff_a * value * value +
// (int64_t)CaliTable.LPTIA_coeff_b * value +
// (int64_t)CaliTable.LPTIA_coeff_c * 1e4) / 1e8);
if (gain_level == LPRTIA_200R) {
res = ((int64_t)value * (-161182431) + 5283011111479) / 1e6;
} else if (gain_level == LPRTIA_1K) {
res = ((int64_t)value * (-31279533) + 1025255598163) / 1e6;
} else if (gain_level == LPRTIA_8K) {
res = ((int64_t)value * (-4266773) + 139847876228) / 1e6;
} else if (gain_level == LPRTIA_64K) {
res = ((int64_t)value * (-533907) + 17499366771) / 1e6;
}
res = (((int64_t)CaliTable.LP[gain_level].LPTIA_coeff_a * value * value +
(int64_t)CaliTable.LP[gain_level].LPTIA_coeff_b * value +
(int64_t)CaliTable.LP[gain_level].LPTIA_coeff_c * 1e4) / 1e8);
// if (gain_level == LPRTIA_200R) {
// res = ((int64_t)value * (-161182431) + 5283011111479) / 1e6;
// } else if (gain_level == LPRTIA_1K) {
// res = ((int64_t)value * (-31279533) + 1025255598163) / 1e6;
// } else if (gain_level == LPRTIA_8K) {
// res = ((int64_t)value * (-4266773) + 139847876228) / 1e6;
// } else if (gain_level == LPRTIA_64K) {
// res = ((int64_t)value * (-533907) + 17499366771) / 1e6;
// }
return (int32_t)res;
}
@@ -1085,23 +1085,20 @@ static void update_ZM_instruction(uint8 *ins) {
}
case cali_CVbias: { // 0x69
static int32_t LPvolt = 0;
LPvolt = ((int32_t)(ins[4]) << 8) | (int32_t)(ins[5]);
static uint16_t user_volt = 0;
user_volt = ((uint16_t)(ins[4]) << 8) | (uint16_t)(ins[5]);
int32_t LPvolt = (user_volt - 25000) * 4 * 4000; //[5nV]
setEIS_CV();
DAC_outputV(LPvolt);
LED_color(DARKLED, 0x80, 0x80, 0x00);
// LED_color(DARKLED, 0x80, 0x80, 0x00);
break;
}
case cali_CV_gainCtrl: {// 0x59
instru.LPTIAGainLv = ins[4];
if (instru.LPTIAGainLv != LPRTIA_GAIN_AUTO) {
instru.LPTIAAutoGainEnable = 0;
} else {
instru.LPTIAAutoGainEnable = 1;
instru.LPTIAGainLv = LPRTIA_200R;
}
LPTIAGainCtrl(instru.LPTIAGainLv);
break;
}
case 0x22: { //for Roy