Hi, How can ad5941 measure the open circuit potential(OCP) between RE and WE(or AINx) before EIS measurement?
AD5941
Recommended for New Designs
The AD5940 and AD5941 are high precision, low power analog front ends (AFEs) designed for portable applications that require high precision, electrochemical...
Datasheet
AD5941 on Analog.com
Hi, How can ad5941 measure the open circuit potential(OCP) between RE and WE(or AINx) before EIS measurement?
Hi,
You may change the ADC mux inputs as shown below and monitor the output keeping RE0 and SE0 Open circuited.
In AppIMPSeqCfgGen() function,
dsp_cfg.ADCBaseCfg.ADCMuxN = ADCMUXN_HSTIA_N; //Replace with ADCMUXN_AIN3. You may short RE0 to AIN3.
dsp_cfg.ADCBaseCfg.ADCMuxP = ADCMUXP_HSTIA_P; //Replace with ADCMUXP_VSE0
Thank you so much for your continued help. I'm using the AD5940_Impedance example measures 700 Ω pure resistance with Nucleo-f411, but the result is wrong when the measurement frequency is lower than 100Hz. I don't need to wait to get the result, even if the excitation frequency is 0.1Hz, of course, the result is wrong. I guess it's the sampling frequency, but compared with the AD5940_BATImpedance example I still can't find the solution.
...
Hi,
Below is the open circuit result obtained by measuring current input by running AD5940_BATImpedance example:
Hello AD5940-Build Time:00:28:16
i: 1 Freq: 1.00 RcalVolt:(-4.000000,5.000000)
i: 2 Freq: 1.44 RcalVolt:(0.000000,2.000000)
i: 3 Freq: 2.07 RcalVolt:(0.000000,-2.000000)
i: 4 Freq: 2.98 RcalVolt:(-2.000000,0.000000)
i: 5 Freq: 4.28 RcalVolt:(-3.000000,-1.000000)
i: 6 Freq: 6.16 RcalVolt:(2.000000,2.000000)
i: 7 Freq: 8.86 RcalVolt:(-1.000000,-1.000000)
i: 8 Freq: 12.74 RcalVolt:(2.000000,0.000000)
i: 9 Freq: 18.33 RcalVolt:(-1.000000,-1.000000)
i: 10 Freq: 26.37 RcalVolt:(1.000000,-2.000000)
i: 11 Freq: 37.93 RcalVolt:(0.000000,0.000000)
i: 12 Freq: 54.56 RcalVolt:(-1.000000,-1.000000)
i: 13 Freq: 78.48 RcalVolt:(-2.000000,1.000000)
i: 14 Freq: 112.88 RcalVolt:(0.000000,0.000000)
i: 15 Freq: 162.38 RcalVolt:(0.000000,0.000000)
i: 16 Freq: 233.57 RcalVolt:(0.000000,0.000000)
i: 17 Freq: 335.98 RcalVolt:(0.000000,-1.000000)
i: 18 Freq: 483.29 RcalVolt:(-5.000000,10.000000)
i: 19 Freq: 695.19 RcalVolt:(7.000000,3.000000)
i: 0 Freq: 1000.00 RcalVolt:(-1.000000,-4.000000)
In AD5940-Impedance example,
By setting
pImpedanceCfg->ADCSinc3Osr = ADCSINC3OSR_5;//ADCSINC3OSR_2; and
clk_cfg.HfOSC32MHzMode = bTRUE;//bFALSE;
The following results are obtained from 20HZ to 100HZ. (with 700 Ohm resistor)
Freq:19.05 RzMag: 692.232971 Ohm , RzPhase: 1.475751
Freq:19.95 RzMag: 692.799744 Ohm , RzPhase: -1.111682
Freq:20.89 RzMag: 680.045471 Ohm , RzPhase: -2.793056
Freq:21.88 RzMag: 661.422974 Ohm , RzPhase: -3.216097
Freq:22.91 RzMag: 645.959839 Ohm , RzPhase: -2.339729
Freq:23.99 RzMag: 641.814575 Ohm , RzPhase: -0.642113
Freq:25.12 RzMag: 651.756897 Ohm , RzPhase: 0.916017
Freq:26.30 RzMag: 668.785034 Ohm , RzPhase: 1.602847
Freq:27.54 RzMag: 685.240784 Ohm , RzPhase: 1.311895
Freq:28.84 RzMag: 694.221558 Ohm , RzPhase: 0.339761
Freq:30.20 RzMag: 692.621460 Ohm , RzPhase: -0.562610
Freq:31.62 RzMag: 684.737183 Ohm , RzPhase: -0.894352
Freq:33.11 RzMag: 678.146484 Ohm , RzPhase: -0.482382
Freq:34.67 RzMag: 679.080505 Ohm , RzPhase: 0.215308
Freq:36.31 RzMag: 686.552795 Ohm , RzPhase: 0.540739
Freq:38.02 RzMag: 693.679321 Ohm , RzPhase: 0.280782
Freq:39.81 RzMag: 694.289307 Ohm , RzPhase: -0.194708
Freq:41.69 RzMag: 689.622375 Ohm , RzPhase: -0.371795
Freq:43.65 RzMag: 687.199158 Ohm , RzPhase: -0.062749
Freq:45.71 RzMag: 689.923523 Ohm , RzPhase: 0.250347
Freq:47.86 RzMag: 694.028198 Ohm , RzPhase: 0.133161
Freq:50.12 RzMag: 693.865723 Ohm , RzPhase: -0.177879
Freq:52.48 RzMag: 691.126831 Ohm , RzPhase: -0.123374
Freq:54.95 RzMag: 691.421021 Ohm , RzPhase: 0.137232
Freq:57.54 RzMag: 693.953308 Ohm , RzPhase: 0.109119
Freq:60.26 RzMag: 693.897888 Ohm , RzPhase: -0.116462
Freq:63.10 RzMag: 692.540649 Ohm , RzPhase: -0.022710
Freq:66.07 RzMag: 693.953796 Ohm , RzPhase: 0.082037
Freq:69.18 RzMag: 694.391968 Ohm , RzPhase: -0.066963
Freq:72.44 RzMag: 693.000854 Ohm , RzPhase: -0.005307
Freq:75.86 RzMag: 693.917725 Ohm , RzPhase: 0.057995
Freq:79.43 RzMag: 694.427185 Ohm , RzPhase: -0.043611
Freq:83.18 RzMag: 693.465088 Ohm , RzPhase: -0.025996
Freq:87.10 RzMag: 694.454224 Ohm , RzPhase: 0.043604
Freq:91.20 RzMag: 693.962524 Ohm , RzPhase: -0.014548
Freq:95.50 RzMag: 694.495117 Ohm , RzPhase: 0.010484
Freq:100.00 RzMag: 694.465271 Ohm , RzPhase: -0.041118
You may add
AD5940_AFEPwrBW(AFEPWR_LP, AFEBW_50KHZ)
and Check for lower frequencies.
You may Update AFE in interrupt handler using function
AppAMPRegModify(pBuff, &FifoCnt);
as shown below:
int32_t AppIMPRegModify(int32_t * const pData, uint32_t *pDataCount)
{
HSLoopCfg_Type HsLoopCfg;
DSPCfg_Type dsp_cfg;
CLKCfg_Type clk_cfg;
float nextfreq;
uint32_t WaitClks;
ClksCalInfo_Type clks_cal;
FreqParams_Type freq_params;
uint32_t SeqCmdBuff[2];
uint32_t SRAMAddr = 0;;
if(AppIMPCfg.NumOfData > 0)
{
AppIMPCfg.FifoDataCount += *pDataCount/4;
if(AppIMPCfg.FifoDataCount >= AppIMPCfg.NumOfData)
{
AD5940_WUPTCtrl(bFALSE);
return AD5940ERR_OK;
}
}
if(AppIMPCfg.SweepCfg.SweepEn) /* Need to set new frequency and set power mode */
{
AD5940_WGFreqCtrlS(AppIMPCfg.SweepNextFreq, AppIMPCfg.SysClkFreq);
}
AppIMPCtrl(IMPCTRL_GETFREQ, &nextfreq);
freq_params = AD5940_GetFreqParameters(nextfreq);
if (nextfreq<0.11)
{
AppIMPCfg.PwrMod = AFEPWR_LP;
AD5940_AFEPwrBW(AppIMPCfg.PwrMod, AFEBW_250KHZ);
AppIMPCfg.HsDacUpdateRate = 27;
}
else if(nextfreq<0.51)
{
AppIMPCfg.PwrMod = AFEPWR_LP;
AD5940_AFEPwrBW(AppIMPCfg.PwrMod, AFEBW_250KHZ);
AppIMPCfg.HsDacUpdateRate = 27;
}
else if(nextfreq<20)
{
AppIMPCfg.PwrMod = AFEPWR_LP;
AD5940_AFEPwrBW(AppIMPCfg.PwrMod, AFEBW_50KHZ);
AppIMPCfg.HsDacUpdateRate = 27;
}
else if(nextfreq<450)
{
AppIMPCfg.PwrMod = AFEPWR_LP;
AD5940_AFEPwrBW(AppIMPCfg.PwrMod, AFEBW_250KHZ);
AppIMPCfg.HsDacUpdateRate = 27;
}
else if(nextfreq<80000)
{
AppIMPCfg.PwrMod = AFEPWR_LP;
AD5940_AFEPwrBW(AppIMPCfg.PwrMod, AFEBW_250KHZ);
AppIMPCfg.HsDacUpdateRate = 27;
}
else if(nextfreq<=200000)
{
AppIMPCfg.PwrMod = AFEPWR_HP;
AD5940_AFEPwrBW(AppIMPCfg.PwrMod, AFEBW_250KHZ);
//clk_cfg.SysClkDiv = SYSCLKDIV_2;
clk_cfg.HfOSC32MHzMode = bTRUE;
AppIMPCfg.HsDacUpdateRate = 7;
}
HsLoopCfg.HsDacCfg.HsDacUpdateRate = AppIMPCfg.HsDacUpdateRate;
dsp_cfg.ADCFilterCfg.ADCSinc2Osr = freq_params.ADCSinc2Osr;
dsp_cfg.ADCFilterCfg.ADCSinc3Osr = freq_params.ADCSinc3Osr;
dsp_cfg.DftCfg.DftNum =freq_params.DftNum;
dsp_cfg.DftCfg.DftSrc = freq_params.DftSrc;
AD5940_CLKCfg(&clk_cfg);
AD5940_HSLoopCfgS(&HsLoopCfg);
memset(&dsp_cfg.StatCfg, 0, sizeof(dsp_cfg.StatCfg));
AD5940_DSPCfgS(&dsp_cfg);
/* Step 3: Calculate clocks needed to get result to FIFO and update sequencer wait command */
clks_cal.DataType = DATATYPE_DFT;
clks_cal.DftSrc = freq_params.DftSrc;
clks_cal.DataCount = 1L<<(freq_params.DftNum+2); /* 2^(DFTNUMBER+2) */
clks_cal.ADCSinc2Osr = freq_params.ADCSinc2Osr;
clks_cal.ADCSinc3Osr = freq_params.ADCSinc3Osr;
clks_cal.ADCAvgNum = 0;
clks_cal.RatioSys2AdcClk = AppIMPCfg.SysClkFreq/AppIMPCfg.AdcClkFreq;
AD5940_ClksCalculate(&clks_cal, &WaitClks);
/* Maximum number of clocks is 0x3FFFFFFF. More are needed if the frequency is low */
if(WaitClks > 0x3FFFFFFF)
{
WaitClks /=2;
SRAMAddr = AppIMPCfg.MeasureSeqInfo.SeqRamAddr;
SeqCmdBuff[0] = SEQ_WAIT(WaitClks);
AD5940_SEQCmdWrite(SRAMAddr+11, SeqCmdBuff, 1);
AD5940_SEQCmdWrite(SRAMAddr+12, SeqCmdBuff, 1);
AD5940_SEQCmdWrite(SRAMAddr+18, SeqCmdBuff, 1);
AD5940_SEQCmdWrite(SRAMAddr+19, SeqCmdBuff, 1);
}
else
{
SRAMAddr = AppIMPCfg.MeasureSeqInfo.SeqRamAddr;
SeqCmdBuff[0] = SEQ_WAIT(WaitClks);
AD5940_SEQCmdWrite(SRAMAddr+11, SeqCmdBuff, 1);
AD5940_SEQCmdWrite(SRAMAddr+18, SeqCmdBuff, 1);
}
if(AppIMPCfg.StopRequired == bTRUE)
{
AD5940_WUPTCtrl(bFALSE);
return AD5940ERR_OK;
}
return AD5940ERR_OK;
}
You may refer to AppBIOZCheckFreq() in AD5940_BIOZ_2_Wire code
ad5940-examples/BIOZ-2Wire.c at master · analogdevicesinc/ad5940-examples · GitHub
Hi,
I am using CN0510 which includes AD5941BATZ and the battery we wan to test has no RE, is it still applied?
Hi,
Only the +ve and -ve terminals of the battery are required to be connected. No RE is required.
But is the code change would work with the BATZ EVAL board? As the BATZ board does not have any way of measuring the DC voltage over the battery. All ADC inputs are AC coupled. And RE is not connected.
Hi,
Apologies. I am not sure what your question is.
Below is the block diagram of AD5940BATZ board:
Do you want to measure voltage supplied by the battery?
If so, you may set in the code,
dsp_cfg.ADCBaseCfg.ADCMuxN = ADCMUXN_AIN3;
dsp_cfg.ADCBaseCfg.ADCMuxP =ADCMUXP_VCE0;
to measure the voltage.
Thanks for your reply. But no, it's the open circuit potential of battery I want to know