zhengrob
发表于 2023-9-20 15:54:05
本帖最后由 zhengrob 于 2023-9-20 15:55 编辑
网上能找到的用AD5941做LCR的也就这么一个,其实这也就算是一个验证方案,就一个1K的档位电阻,不算是完整的方案。以AD5941内置的这些模块,高达200KHz的DDS,16bit的ADC,DFT_DSP计算单元和一系列的PGA和filter,应该是可以做出一个较高性能的LCR的. 但做出来是不容易的,因为这个芯片上的模块太多了,消化起来并不容易。
CN0510的板子焊出来了,程序也能跑起来,但是测不出准确的电池内阻。单独测试ADC,正弦波都算正常,但就是AD5940-BATImpedance这个程序跑不出想要的结果,这个程序写得也太复杂,暂时没有太多时间去调试了。
abbey_tom
发表于 2023-9-20 16:10:22
这个是自己制板的么?
您可真的是很厉害呀,
搞得和1500大元的原版差不多了。
我这一段时间基本把主要的模块消化得差不多了,
我没有试这个测电池内阻的,
因为好像牵涉到外扩其它的芯片。
建议先从不需要外围的例程开始测试起,
比如AD5940_Temperature、AD5940_Impedance、
AD5940_BIOZ-2Wire、AD5940_BIA等,
这些我都测试过了。
zhengrob
发表于 2023-9-20 17:12:00
本帖最后由 zhengrob 于 2023-9-20 17:13 编辑
abbey_tom 发表于 2023-9-20 16:10
这个是自己制板的么?
您可真的是很厉害呀,
搞得和1500大元的原版差不多了。
这块板子就是用的官方gerber在立创打的板子,回来自己手焊的元件。
唯一的不同是板子上的5V转3V3的LDO我找不到原设计的那个型号,直接搭棚焊了一颗HT7533,实测这个电压是没有问题的。这板上外接芯片只有2颗,1颗是单刀双掷开关ADG636,其实用HC4052或者2G3157替代是完全没啥问题的(这块板上是不行的,引脚不兼容)。这颗的作用是切换测量信号,先测标准电阻的电压信号再切换到电池两端的信号,这样做的好处是被测电阻两端电压和标准电阻2端电压都由同一个测量通道来做,消除了测量通道寄生参数带来的的增益和相位误差。第2颗芯片是就是一颗4运放,把测量信号放大以后再送入AIN2和AIN3做差分ADC测量。
本来是一个很简单的电路,但ADI的参考例程搞得超级复杂,设计了一个sequencer加入了一堆状态机。还没找到调试的头绪。
其实这个测电池内阻的硬件框架最接近LCR的方案,标准电阻换成可切换的档位电阻就行了。信号激励由电池电压驱动改成外部电压驱动即可。
wang8472493
发表于 2023-9-20 17:13:06
abbey_tom 发表于 2023-9-20 16:10
这个是自己制板的么?
您可真的是很厉害呀,
搞得和1500大元的原版差不多了。
你好,你的合作设计LCR表项目还在继续吗。
abbey_tom
发表于 2023-9-20 17:30:36
本帖最后由 abbey_tom 于 2023-9-20 17:37 编辑
zhengrob 发表于 2023-9-20 17:12
这块板子就是用的官方gerber在立创打的板子,回来自己手焊的元件。
唯一的不同是板子上的5V转3V3的LDO ...
看起来您的模电基础比我扎实。
如果有立创免费打板文件可以发给我一份。
不过,
我这一段时间研究ADI的例程还是有些心得,
其实搞清楚了还是很清晰的。
所有的例程架构都是一样的,
并没有什么状态机,
说白了就是使用片内的序列器,
一般生成两个序列,
一个是初始化序列,
一个是测量序列,
初始化序列只执行一次,
后面都是启动测量序列
一轮测量执行完成后产生中断(一般是DFT阀值中断)令GPIO翻转,
这个GPIO触发MCU外部线中断,
MCU的中断服务则读取DFT结果并显示
下面是我第一次分析阻抗测试AD5940_Impedance例程时,
梳理的流程,后来发现其它例程都类似,
您可以参考。
有兴趣,可以在这里讨论交流。
abbey_tom
发表于 2023-9-20 17:32:08
wang8472493 发表于 2023-9-20 17:13
你好,你的合作设计LCR表项目还在继续吗。
我画好了试验用的模拟电路板,
交给小鬼头老师在做试验。
zhengrob
发表于 2023-9-20 17:47:49
abbey_tom 发表于 2023-9-20 17:30
看起来您的模电基础比我扎实。
如果有立创免费打板文件可以发给我一份。
看来你研究ADI的例程还是很有心得!多谢分享,我慢慢学习一下。
如果你需要光板PCB就不用再去做了,ADI设计的时候长度是定的4英寸整,恰好超过了JLC的10cm限一点点,所以再去做这个板子并不合算。我做了5块,还剩下4块。我可以发给你1-2块都可以。可以私信给我收货地址。
abbey_tom
发表于 2023-9-20 17:52:19
zhengrob 发表于 2023-9-20 17:12
这块板子就是用的官方gerber在立创打的板子,回来自己手焊的元件。
唯一的不同是板子上的5V转3V3的LDO ...
另外,
序列器也相当简单而高效,
序列命令是顺序执行的,没有分支,
一般一个四线阻抗测量序列只占30多个字(设32位为一个字)
写入片内SRAM后启动睡眠唤醒定时器,
达到唤醒时间点就自行执行测量序列,
执行完毕就睡眠。
如此周而复始。
abbey_tom
发表于 2023-9-20 17:57:27
zhengrob 发表于 2023-9-20 17:47
看来你研究ADI的例程还是很有心得!多谢分享,我慢慢学习一下。
如果你需要光板PCB就不用再去做了,ADI ...
好的谢谢。
zhengrob
发表于 2023-9-26 16:46:51
终于在NUCLEO-F411上把BATimpedance跑起来了。跑1KHz定频和100Hz-10KHz扫频的结果截图, 锂电池的内阻用内阻仪测在26.5mΩ左右:
zhengrob
发表于 2023-9-26 16:54:52
吐槽一下,ADI的例程真的太不严谨了,在BATimpedance的官方例程中,measurement sequence中有严重的bug,根本就跑不通。上了ADI英文的论坛,一群人在问这个例程跑不通的问题,但ADI的工程师的回答语焉不详。这跟TI的论坛上TI的工程师的细致和迅速回复根本没法比。
这个程序花了我近一个星期才调通,看这个测量结果还算过得去吧。我再看一下还有没有可能降低采样速度再提高测量稳定性。
abbey_tom
发表于 2023-9-26 20:12:56
zhengrob 发表于 2023-9-26 16:46
终于在NUCLEO-F411上把BATimpedance跑起来了。跑1KHz定频和100Hz-10KHz扫频的结果截图, 锂电池的内阻用内 ...
恭喜,
看起来结果基本符合实际了。
这个BATimpedance我还没有试过,
您最后解决的BUG在哪里呢?
省得我后面再踩坑。
abbey_tom
发表于 2023-9-26 20:25:34
本帖最后由 abbey_tom 于 2023-9-26 20:29 编辑
zhengrob 发表于 2023-9-26 16:54
吐槽一下,ADI的例程真的太不严谨了,在BATimpedance的官方例程中,measurement sequence中有严重的bug,根 ...
按说这个measurement sequence很简单的呀,
只有区区6个指令:
1AD5940_SEQGenInsert(SEQ_WAIT(16*250));/* 等待250us(参考电压从休眠模式开始上电) */
2AD5940_AFECtrlS(AFECTRL_WG|AFECTRL_ADCPWR|AFECTRL_SINC2NOTCH, bTRUE);/* 打开波形发生器、ADC电源 */
3AD5940_SEQGenInsert(SEQ_WAIT(16*50)); /* 等待50us, ADC就绪. */
4AD5940_AFECtrlS(AFECTRL_ADCCNV|AFECTRL_DFT, bTRUE);/* 启动ADC转换、及 DFT */
5AD5940_SEQGenInsert(SEQ_WAIT(WaitClks));/* 等待DFT数据就绪 */
6AD5940_AFECtrlS(AFECTRL_ADCCNV|AFECTRL_DFT/*|AFECTRL_WG*/|AFECTRL_ADCPWR|AFECTRL_SINC2NOTCH, bFALSE);
/* 停止ADC转换、及DFT */
这能有什么BUG?
另外,
看例程好像采样率为800k
测量速度(ODR)为每秒20次
zhengrob
发表于 2023-9-26 20:47:17
abbey_tom 发表于 2023-9-26 20:25
按说这个measurement sequence很简单的呀,
只有区区6个指令:
1AD5940_SEQGenInsert(SEQ_WAIT(16* ...
你上边的代码肯定是跑不通的。
做如下调整:
... ...
AD5940_SEQGenInsert(SEQ_WAIT(16*250));/* wait 250us for reference power up from hibernate mode. */
AD5940_AFECtrlS(AFECTRL_HSTIAPWR|AFECTRL_INAMPPWR|AFECTRL_EXTBUFPWR|AFECTRL_DACREFPWR|AFECTRL_HSDACPWR,bTRUE);
AD5940_AFECtrlS(AFECTRL_WG|AFECTRL_ADCPWR|AFECTRL_SINC2NOTCH, bTRUE);
... ...
也就是在你的第一和第二句之间增加
AD5940_AFECtrlS(AFECTRL_HSTIAPWR|AFECTRL_INAMPPWR|AFECTRL_EXTBUFPWR|AFECTRL_DACREFPWR|AFECTRL_HSDACPWR,bTRUE);
就OK了。
abbey_tom
发表于 2023-9-26 21:49:10
zhengrob 发表于 2023-9-26 20:47
你上边的代码肯定是跑不通的。
做如下调整:
... ...
哦,那可能是某些相关模块的电源没有打开。
您上面说要减小采样率,
我看了一下,
目前ADC的原始采样率好像是800kSPS
这个好像变不了,只有800k和1.6M两档。
想要稳定的话,
可以试一下SINC2滤波器过采样的设置
设置SINC3=2,SINC2=1333
可将最终ADC送DFT的速率降低为300SPS
页:
1
2
[3]
4
5
6
7
8
9
10