矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: washu

数字闭环自校准的 6 位半电压源 Voltgen V1 版终结贴

[复制链接]
     
 楼主| 发表于 2023-12-12 15:00:46 | 显示全部楼层
jforu 发表于 2023-12-10 10:49
如果你用FOD8012,至少要用6个,少于这个说明其中有几路不完全隔离。因为一个FOD8012是1IN 1OUT.

5 个,ADC 这边 DAT、CLK,其余是一串,DAT、CLK、STB 所以当初光耦是 2631x2+6n137

回复 支持 反对

使用道具 举报

发表于 2023-12-12 16:29:08 | 显示全部楼层
本帖最后由 duke83 于 2023-12-12 17:21 编辑
washu 发表于 2023-12-12 14:58
应该是一致的,反而是 PCB 画错过  您是哪地方对应不上?


看图说:
aa.jpg

磁耦 ADUM1411 的 pin 6 与 Pin 11 改光耦是不是不要管它?
可能会装一块 FOD8012A x 4 的小板再叠上去。
ADCCLK 与 ADCDATA 共用一个 FOD8012A(双向),其余的 REGCLK, REGDATA, REGSTB 各用一个 FOD8012A。
找不到这种输出入是逻辑闸的同包装有两组以上高速光耦合。

这就是我几年前初试 Voltgen 卡关没有再玩下去的地方。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-12 17:58:34 | 显示全部楼层

是的不去管它,并没有被使用
回复 支持 反对

使用道具 举报

     
发表于 2023-12-12 22:12:48 来自手机 | 显示全部楼层
我请教一下:为啥采用 二次三项式非线性校准 方式? 是不是 四次 五次也行? 这个怎么考虑的?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-12 22:34:31 | 显示全部楼层
VGCalibration 源码,需安捷伦 VISA 库,支持安捷伦 82350、82357、E5810(网关)接口,支持安捷伦 3458、Advantest 6581 万用表

VGCalibration.zip (515.85 KB, 下载次数: 25)
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-12 22:34:51 | 显示全部楼层
5free 发表于 2023-12-12 22:12
我请教一下:为啥采用 二次三项式非线性校准 方式? 是不是 四次 五次也行? 这个怎么考虑的?

可以但二次多项式比较简单
回复 支持 反对

使用道具 举报

     
发表于 2023-12-13 09:28:42 | 显示全部楼层
5free 发表于 2023-12-12 22:12
我请教一下:为啥采用 二次三项式非线性校准 方式? 是不是 四次 五次也行? 这个怎么考虑的?



理论上非线性方程通过泰勒级数展开后,多项式的项可以达到无穷个之多,但是大多数项的系数很小,所以近似的情况下只取几个主项就可以了,否则无法进行工程计算,具体取几次,取决于曲线的形态,如果曲线具有两个单调区间(即U型曲线),那么其展开多项式中,以二次和一次为主,其他更高次的系数都比较小,适合用二次多项式近似,如果曲线具有三个单调区间(即S型曲线),则三次系数也会比较大,适合三次多项式近似,至于更复杂的曲线,会用到更高次,但更高次一来计算复杂度,二来做修正算法运算量会几何倍增长,所以一般会把它进行分段,然后使每段符合U型或S型,实际上S型也可以分段成几个U型,因此曲线拟合方程大多使用二次多项式,少数会使用三次多项式。

LT2400的INL曲线,基本上是一个U型曲线,所以用二次多项式即可,个别器件差异导致U型不理想时,可以加入三次项,再多就没必要了,因为INL曲线本身也是温度相关的,手册给出的曲线,是25度时的样子,温度变化后曲线会不同,甚至变化很大(可以参考其他24位ADC的手册,基本都会给出不同温度下的INL曲线),所以这个非线性校准的目的只是把非线性误差尽可能降低(在校准温度下降低最多,能超过一个数量级),而不是完全消除,所以没必要搞得太复杂。

评分

1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

     
发表于 2023-12-15 20:22:36 来自手机 | 显示全部楼层
瓦叔威武,感谢开源
回复 支持 反对

使用道具 举报

     
发表于 2023-12-15 22:27:15 | 显示全部楼层
我以为瓦叔真是叔呢,原来才有小孩。看来比我年龄小。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-15 22:54:12 | 显示全部楼层
lg676041036 发表于 2023-12-15 22:27
我以为瓦叔真是叔呢,原来才有小孩。看来比我年龄小。

不是才...这个就不便多言了
回复 支持 反对

使用道具 举报

发表于 2023-12-17 02:35:38 | 显示全部楼层
问个使用操作的问题:要如何将此机当电压表使用,就是打开 Vin 的输入端,在上位机软件中没看到此选项。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-17 20:52:33 | 显示全部楼层
duke83 发表于 2023-12-17 02:35
问个使用操作的问题:要如何将此机当电压表使用,就是打开 Vin 的输入端,在上位机软件中没看到此选项。

由于 M32 ROM 空间不够,后期固件已移除此部分
回复 支持 反对

使用道具 举报

     
发表于 2023-12-17 23:34:13 | 显示全部楼层
washu 发表于 2023-12-17 20:52
由于 M32 ROM 空间不够,后期固件已移除此部分

washu请教个问题,在M32的代码中有一个地方没看太明白,请你回忆一下当年写代码的时候的思路

在主loop中有一句 fTrn = Readback(),这里面fTrn定义的是一个浮点数,而Readback()是一个不带返回参数的子程序,奇怪的是这条语句编译器也没报错。问题来了,那这条语句真正要做的操作是什么呢,是不是只是想运行一下Readback()这个子程序呢?

10.jpg 11.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-18 00:02:14 | 显示全部楼层
zhengrob 发表于 2023-12-17 23:34
washu请教个问题,在M32的代码中有一个地方没看太明白,请你回忆一下当年写代码的时候的思路 :

...

这是一个非常令人难以启齿的编译器问题,简而言之就是这个编译器有很多 Bug,其中一些 Bug 在代码数量较少的时候无法发现,等我的代码积累到很多之后 编译器就 Bug 频出,而由于各种原因不得不继续维护这些代码使得一些写法非常别扭,你看到的这部分其实就是编译器 Bug 的一部分:原来 Readback() 部分代码直接就在主循环 Readback() 一行的位置,但如果它在这个位置编译器就会出错,我不得不从主循环中移除并以函数或子过程的方式调用。

最初移除的只有
fCalfSynth = (fSynthesis - fGndOffset) / ((fReference - fGndOffset) / fCalsacles)

所以最初 Readback() 是一个函数,因此遗留下了
fTrn = Readback()

这句代码,但后来发现必须把
If bINLCorrect = 1 Then
        fCalfSynth = fCalfSynth + Getinlerr(fCalfSynth)/ 1000000
ElseIf bINLCorrect = 2 Then
        fCalfSynth = fCalfSynth + GetMultinlerr(fCalfSynth)/ 1000000
Else
       
End If
fError = fSetting - fCalfSynth * 1000000
iError = fError
wError = Abs(iError)

都从主循环移走,编译器才不会报错,所以这就写成了一个子过程,但在你看到的位置就没有正确写成子过程调用而是原来(函数)的样子

所以说,这是一个典型的屎山


回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-18 00:06:47 | 显示全部楼层
duke83 发表于 2023-12-17 02:35
问个使用操作的问题:要如何将此机当电压表使用,就是打开 Vin 的输入端,在上位机软件中没看到此选项。

补充:Voltgen V1 版无法继续维护的原因就是 M32 爆掉了,不得不将很多代码移除最后变成现在看到的样子

而实际上这个项目最初是用的 M16,我那时候对这样的项目的大小一无所知
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-4 00:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表