Merge remote-tracking branch 'origin/elite/eis1.1' into eis_10test

This commit is contained in:
lai8928
2022-11-02 15:34:09 +08:00
10 changed files with 343 additions and 1300 deletions
@@ -337,7 +337,7 @@ static int32_t read_LPTIA_Iin(){
Iin = Cali_LPTIA(ADCraw, instru.gain_lv_lptia);
InputNotify(NOTIFY_CURRENT, Iin);
InputNotify(NOTIFY_IMPEDANCE, instru.gain_lv_lptia);
// InputNotify(NOTIFY_IMPEDANCE, instru.gain_lv_lptia);
return Iin;
}
@@ -70,6 +70,7 @@ static void WorkModeLED()
case CURVE_EIS_CV:
case CURVE_CA:
case CURVE_VT:
case CURVE_RT:
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_CYAN);
break;
@@ -330,7 +330,7 @@ static int __rt_create(void)
m->_measureBat = 0;
m->_VoViSwitch = instru.VoViSwitch;
p->_Vinit = (instru.Vinit - 25000) * 4 * 10000; //[5nV]
p->_Vinit = (instru.Vinit - 25000) * 4 * 4000; //[5nV]
p->_Vset = 0;
*wm = p;
@@ -576,6 +576,10 @@ int wm_init(void)
if (__vt_create()) return -2;
break;
case CURVE_RT:
if (__rt_create()) return -2;
break;
default:
// printf("DO NOT support!!");
return -3;
@@ -20,6 +20,7 @@ enum all_mode_e {
CURVE_EIS = 0xD1, //Should Change to 0xD1
CURVE_EIS_CV = 0xD2,
CURVE_CA = 0xD3,
CURVE_RT = 0x04,
CURVE_VT = 0x05,
// CURVE_CALI_ADC = 0xF1,
SET_SAMPLE_RATE = 0xE0,
@@ -27,6 +27,14 @@ static void vscan_volt_out(void)
void *wm = wm_get();
/* in [5nV] ver */
MEAS_VOUT(wm) = DAC_outputV(Vset);
InputNotify(NOTIFY_VOLT, Vset/200);
} else if (instru.eliteFxn == CURVE_RT) {
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
void *wm = wm_get();
/* in [5nV] ver */
MEAS_VOUT(wm) = DAC_outputV(Vset);
InputNotify(NOTIFY_VOLT, Vset/200);
@@ -36,28 +44,6 @@ static void vscan_volt_out(void)
return;
}
static void CalcuResistance()
{
/* Elite 100 = 100R
Elite 1000 = 1KR
Elite 10000 = 10KR
Elite 100000 = 100KR
Elite 1000000 = 1MR
*/
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
struct wm_meas_t *m = &rt->measure;
int64_t resist;
int64_t volt = (int64_t)(m->_measureVout) ;
int64_t current = (int64_t)(m->_measureCurrent);
resist = volt * 1000000 / current; //R = V / Iin; [mOhm]
InputNotify(NOTIFY_IMPEDANCE, resist);
return;
}
//////EIS PLOT RELATED FUNCTION START//////
static uint8_t CalcDecade(uint32_t f1, uint32_t f2)
{
@@ -216,6 +202,24 @@ static void VT_Plot(void)
return;
}
static void RT_Plot(void)
{
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
static uint8_t ADC_cnt = 0;
void *wm = wm_get();
if (ADC_cnt == 0) {
LPTIA_change_gain();
ADC_cnt++;
} else if (ADC_cnt == 1) {
read_LPTIA_Iin();
ADC_cnt = 0;
}
return;
}
static void EIS_Plot(void) //real and imag impedance plot
{
struct wm_eis_ctx_t *eis = (struct wm_eis_ctx_t *)wm_get();
@@ -4,9 +4,9 @@
#define VERSION_DATE_YEAR 22
#define VERSION_DATE_MONTH 10
#define VERSION_DATE_DAY 7
#define VERSION_DATE_HOUR 10
#define VERSION_DATE_MINUTE 49
#define VERSION_DATE_DAY 27
#define VERSION_DATE_HOUR 17
#define VERSION_DATE_MINUTE 8
// this is NOT the version hash !!
// it's the last version hash
@@ -119,6 +119,7 @@ static void EliteADCControl(void);
static void cv_vscan(void);
static void ca_vscan(void);
static void rt_vscan(void);
static void mode_done(void);
//mode (DAC)
@@ -172,114 +173,158 @@ static void step2VsetRate(uint32_t step){
}
}
// update instruction for Z meter
static void update_ZM_instruction(uint8 *ins) {
uint8_t ins_type = ins[0] & 0b11110000;
uint8_t chip_ID = ins[0] & 0b00001111;
uint8_t oper = ins[1] & 0xF0; // this is don't care in RISASD;//
instru.chip_id = chip_ID;
switch (ins_type) {
case INS_TYPE_RIS: {
switch (ins[2]) {
case CURVE_EIS: { //0xD1
if (ins[3] == PARA_1) { //3000D1 01
instru.f1 = (uint32_t)ins[4] << 24 | (uint32_t)ins[5] << 16 | (uint32_t)ins[6] << 8 | (uint32_t)ins[7]; //FREQ_START
instru.f2 = (uint32_t)ins[8] << 24 | (uint32_t)ins[9] << 16 | (uint32_t)ins[10] << 8 | (uint32_t)ins[11]; //FREQ_STOP
//instru.sampleRate = 15;//CalcDelayTime(User2Freq(instru.f1), true); //ms //read
instru.fmax = (uint32_t)VMAX(instru.f1, instru.f2);
instru.fmin = (uint32_t)VMIN(instru.f1, instru.f2);
instru.delay = (uint16_t)ins[12] << 8 | (uint16_t)ins[13]; //DELAY/10 how many periods
if (instru.f1 > instru.f2){
instru.directionInit = 0; //0:reverse 1:forward
} else if (instru.f1 <= instru.f2){
instru.directionInit = 1;
}
} else if (ins[3] == PARA_2) { //3000D1 02
instru.eliteFxn = CURVE_EIS;
instru.dcbias = (uint16_t)ins[4] << 8 | (uint16_t)ins[5];
instru.acamp = (uint16_t)ins[6] << 8 | (uint16_t)ins[7];
instru.avgnum = (uint8_t)ins[8];
instru.rtia = (uint8_t)ins[9];
instru.ppd = (uint16_t)ins[10] << 8 | (uint16_t)ins[11];
instru.scale = (uint8_t)ins[12];
instru.gain_lv_hstia = instru.rtia;
setEIS_EIS();
ModeLED(WORKING);
}
break;
static void decode_eis_mode(uint8 *ins)
{
if (ins[3] == PARA_1) { //3000D1 01
instru.f1 = (uint32_t)ins[4] << 24 | (uint32_t)ins[5] << 16 | (uint32_t)ins[6] << 8 | (uint32_t)ins[7]; //FREQ_START
instru.f2 = (uint32_t)ins[8] << 24 | (uint32_t)ins[9] << 16 | (uint32_t)ins[10] << 8 | (uint32_t)ins[11]; //FREQ_STOP
//instru.sampleRate = 15;//CalcDelayTime(User2Freq(instru.f1), true); //ms //read
instru.fmax = (uint32_t)VMAX(instru.f1, instru.f2);
instru.fmin = (uint32_t)VMIN(instru.f1, instru.f2);
instru.delay = (uint16_t)ins[12] << 8 | (uint16_t)ins[13]; //DELAY/10 how many periods
if (instru.f1 > instru.f2){
instru.directionInit = 0; //0:reverse 1:forward
} else if (instru.f1 <= instru.f2){
instru.directionInit = 1;
}
} else if (ins[3] == PARA_2) { //3000D1 02
instru.eliteFxn = CURVE_EIS;
instru.dcbias = (uint16_t)ins[4] << 8 | (uint16_t)ins[5];
instru.acamp = (uint16_t)ins[6] << 8 | (uint16_t)ins[7];
instru.avgnum = (uint8_t)ins[8];
instru.rtia = (uint8_t)ins[9];
instru.ppd = (uint16_t)ins[10] << 8 | (uint16_t)ins[11];
instru.scale = (uint8_t)ins[12];
case CURVE_EIS_CV: {
if (ins[3] == PARA_1) {
instru.Vinit = (int32_t)ins[4] << 8 | (int32_t)ins[5];
instru.Ve1 = (uint16_t)ins[6] << 8 | (uint16_t)ins[7];
instru.Ve2 = (uint16_t)ins[8] << 8 | (uint16_t)ins[9];
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
if (instru.Vinit > instru.Ve1 || instru.Vinit == instru.Vmax){
instru.directionInit = 0;//0:reverse 1:forward
} else if (instru.Vinit <= instru.Ve1 || instru.Vinit == instru.Vmin){
instru.directionInit = 1;
}
} else if (ins[3] == PARA_2) {
instru.eliteFxn = CURVE_EIS_CV;
instru.notifyRate = (uint32_t)ins[8] << 8 | (uint32_t)ins[9];
instru.notifyRate = 10000 / instru.notifyRate * 10;
//controller UI 0.01~1000mv send to Elite 1~100000
instru.step = (uint32_t)ins[4] << 24 | (uint32_t)ins[5] << 16 | (uint32_t)ins[6] << 8 | (uint32_t)ins[7];
STEP_TO_VSETRATE(instru.step); //step2VsetRate
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.cycleNumber = (uint16_t)ins[10] << 8 | (uint16_t)ins[11];
instru.gain_lv_hstia = instru.rtia;
setEIS_CV();
ModeLED(WORKING);
}
setEIS_EIS();
break;
ModeLED(WORKING);
}
return;
}
static void decode_cv_mode(uint8 *ins)
{
if (ins[3] == PARA_1) {
instru.Vinit = (int32_t)ins[4] << 8 | (int32_t)ins[5];
instru.Ve1 = (uint16_t)ins[6] << 8 | (uint16_t)ins[7];
instru.Ve2 = (uint16_t)ins[8] << 8 | (uint16_t)ins[9];
instru.Vmax = (int32_t)VMAX(instru.Ve1,instru.Ve2);
instru.Vmin = (int32_t)VMIN(instru.Ve1,instru.Ve2);
if (instru.Vinit > instru.Ve1 || instru.Vinit == instru.Vmax){
instru.directionInit = 0;//0:reverse 1:forward
} else if (instru.Vinit <= instru.Ve1 || instru.Vinit == instru.Vmin){
instru.directionInit = 1;
}
} else if (ins[3] == PARA_2) {
instru.eliteFxn = CURVE_EIS_CV;
instru.notifyRate = (uint32_t)ins[8] << 8 | (uint32_t)ins[9];
instru.notifyRate = 10000 / instru.notifyRate * 10;
//controller UI 0.01~1000mv send to Elite 1~100000
instru.step = (uint32_t)ins[4] << 24 | (uint32_t)ins[5] << 16 | (uint32_t)ins[6] << 8 | (uint32_t)ins[7];
STEP_TO_VSETRATE(instru.step); //step2VsetRate
instru.VsetRate = VsetRateTable[instru.VsetRateIndex];//N
instru.cycleNumber = (uint16_t)ins[10] << 8 | (uint16_t)ins[11];
case CURVE_CA: { //3707D3 927C432103E8 //"4XD3927C43;3X2103E8" 3407D3 927C 4321 03E8
instru.eliteFxn = CURVE_CA;
instru.Vinit = (int32_t)ins[3] << 8 | (int32_t)ins[4]; //37500
instru.notifyRate = (uint32_t)ins[7] << 8 | (uint32_t)ins[8]; //1000
instru.notifyRate = 10000 / instru.notifyRate * 10; //100
instru.VsetRate = VsetRateTable[0]; //2
//instru.hign_z_en = ins[6] & 0x0F;
setEIS_CV();
ModeLED(WORKING);
}
//instru.VoutGainLv = VOUT_GAIN_240K;
return;
}
setEIS_CV();
ModeLED(WORKING);
static void decode_ca_mode(uint8 *ins)
{
instru.eliteFxn = CURVE_CA;
instru.Vinit = (int32_t)ins[3] << 8 | (int32_t)ins[4]; //37500
instru.notifyRate = (uint32_t)ins[7] << 8 | (uint32_t)ins[8]; //1000
instru.notifyRate = 10000 / instru.notifyRate * 10; //100
instru.VsetRate = VsetRateTable[0]; //2
//instru.hign_z_en = ins[6] & 0x0F;
//instru.VoutGainLv = VOUT_GAIN_240K;
setEIS_CV();
ModeLED(WORKING);
return;
}
static void decode_vt_mode(uint8 *ins)
{
instru.eliteFxn = CURVE_VT;
instru.notifyRate = (uint32_t)ins[5] << 8 | (uint32_t)ins[6];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.measure_vin_range = ins[7];
setEIS_CV();
AD5940_SPIWriteReg(ADCCON, 0x0001080E); //PGA = 1.5 //VT
uint8_t z;
uint16_t b;
if (instru.measure_vin_range == 0) { //measure +volt
z = 0;
b = 0;
} else if (instru.measure_vin_range == 1) { //measure +-1V
z = 32;
b = 2048;
} else if (instru.measure_vin_range == 2) { //measure -volt
z = 62;
b = 3910;
}
set_lpdac_ce_1100mv(z, b);
disconnect_rtia();
ModeLED(WORKING);
return;
}
static void decode_rt_mode(uint8 *ins)
{
instru.eliteFxn = CURVE_RT;
instru.notifyRate = (uint32_t)ins[7] << 8 | (uint32_t)ins[8];
instru.notifyRate = 10000 / instru.notifyRate * 10;
// instru.notifyRate = 100;
// instru.measure_vin_range = ins[7];
// instru.measure_vin_range = 0;
setEIS_CV();
instru.Vinit = (uint32_t)ins[3] << 8 | (uint32_t)ins[4];
ModeLED(WORKING);
return;
}
static void decode_ris_ins(uint8 *ins)
{
switch (ins[2]) {
case CURVE_EIS:
decode_eis_mode(ins);
break;
}
case CURVE_VT: { //350605430103E800
instru.eliteFxn = CURVE_VT;
instru.notifyRate = (uint32_t)ins[5] << 8 | (uint32_t)ins[6];
instru.notifyRate = 10000 / instru.notifyRate * 10;
instru.measure_vin_range = ins[7];
setEIS_CV();
AD5940_SPIWriteReg(ADCCON, 0x0001080E); //PGA = 1.5 //VT
uint8_t z;
uint16_t b;
if (instru.measure_vin_range == 0) { //measure +volt
z = 0;
b = 0;
} else if (instru.measure_vin_range == 1) { //measure +-1V
z = 32;
b = 2048;
} else if (instru.measure_vin_range == 2) { //measure -volt
z = 62;
b = 3910;
}
set_lpdac_ce_1100mv(z, b);
disconnect_rtia();
ModeLED(WORKING);
case CURVE_EIS_CV:
decode_cv_mode(ins);
break;
case CURVE_CA:
decode_ca_mode(ins);
break;
case CURVE_VT:
decode_vt_mode(ins);
break;
case CURVE_RT:
decode_rt_mode(ins);
break;
case 0xE2:{ //SET_PARA: { 0xE2
int32_t volt;
volt = (int32_t)ins[4] << 8 | (int32_t)ins[5];
set_rt_volt(volt);
break;
}
@@ -419,9 +464,9 @@ static void update_ZM_instruction(uint8 *ins) {
case 0x03: { // ble write: 0x3000FF 03
if (ins[4] == 1) {
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_RED); //0301
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_RED);
} else if (ins[4] == 2){
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_ORANGE); //0302
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_ORANGE);
} else if (ins[4] == 3){
led_color_set(LED_NB_MAX, LED_BR_LV1, LED_CLR_YELLOW);
} else if (ins[4] == 4){
@@ -521,15 +566,14 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
default: {
/** **/
default:
break;
}
}
break;
}
}
case INS_TYPE_VIS: {
static void decode_vis_ins(uint8 *ins)
{
uint8_t oper = ins[1] & 0xF0; // this is don't care in RISASD;//
switch (oper) {
// reset all variables ( Ins = 0xC0F0)
case VIS_RST: {
@@ -584,10 +628,14 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
}
break;
}
case INS_TYPE_CIS: {
return;
}
static void decode_cis_ins(uint8 *ins)
{
uint8_t oper = ins[1] & 0xF0;
switch (oper) {
case CIS_VERSION: {
initCISBuf();
@@ -643,15 +691,28 @@ static void update_ZM_instruction(uint8 *ins) {
break;
}
}
break;
}
default: {
// unknown instruction
break;
}
}
// update instruction for Z meter
static void update_ZM_instruction(uint8 *ins) {
uint8_t ins_type = ins[0] & 0b11110000;
instru.chip_id = ins[0] & 0b00001111;
switch (ins_type) {
case INS_TYPE_RIS:
decode_ris_ins(ins);
break;
case INS_TYPE_VIS:
decode_vis_ins(ins);
break;
case INS_TYPE_CIS:
decode_cis_ins(ins);
break;
}
return;
}
static void ZM_instruction_update_handle(uint8_t characteristic) {
@@ -32,7 +32,8 @@ static void vscan_ctrl(void);
instru.eliteFxn == CURVE_EIS || \
instru.eliteFxn == CURVE_EIS_CV || \
instru.eliteFxn == CURVE_CA || \
instru.eliteFxn == CURVE_VT \
instru.eliteFxn == CURVE_VT || \
instru.eliteFxn == CURVE_RT \
)
#define Ve1MatchVe2Mode() ( \
@@ -234,7 +235,9 @@ static void EliteADCControl(void) //CURVE_IV => CC_Plot() | CURVE_CV => Iin_Vin_
VT_Plot();
break;
case CURVE_RT:
RT_Plot();
break;
// case CURVE_CALI_ADC:
// if (instru.AdcChannel == IIN_ADC) {
// cali_IT_plot();
@@ -269,6 +272,25 @@ static void mode_done(void) //finishMode = 1, SendNotify(), reset()
}
}
static void CalcuResistance()
{
/* Elite 100000 = 100R
Elite 1000000 = 1KR
Elite 10000000 = 10KR
Elite 100000000 = 100KR
Elite 1000000000 = 1MR
*/
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
struct wm_meas_t *m = &rt->measure;
int64_t resist;
int64_t volt = Vset / 200; // [uV]
int64_t current = (int64_t)(m->_measureCurrent);
resist = volt * 1000000 / current; //R = V / Iin; [mOhm]
InputNotify(NOTIFY_IMPEDANCE, resist);
}
static void vscan_ctrl(void)
{
switch (instru.eliteFxn) {
@@ -284,6 +306,11 @@ static void vscan_ctrl(void)
ca_vscan();
break;
case CURVE_RT:
CalcuResistance();
rt_vscan();
break;
default:{
break;
}
@@ -17,4 +17,32 @@ static void ca_vscan(void)
return;
}
static void rt_vscan(void)
{
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
if(vscanReset){
Vset = rt->_Vinit;
}
if(!vscanReset){
Vset = rt->_Vinit;
}
return;
}
static void set_rt_volt(int32_t volt)
{
struct wm_rt_ctx_t *rt = (struct wm_rt_ctx_t *)wm_get();
volt = (volt - 25000) * 4 * 4000;
rt->_Vinit = volt;
return;
}
#endif