数字闭环自校准的 6 位半电压源 Voltgen V1 版终结贴
本帖最后由 washu 于 2023-12-1 19:51 编辑由于家庭原因(要照顾小孩),我的 数字闭环自校准电压源 新版始终难产,不少坛友还希望玩一下这个电压源,所以再开一贴,汇总一些资料并在有空的时候答复坛友们的相关问题。
使用说明:
上电后,电压源将检查硬件(ADC、基准电压、DAC),然后读取 EEPROM 中的校准数据,并将输出设置为 10.00000V
若需更改输出电压,按 Set 键,用数字键输入电压值和小数点,然后按 V/mV/uV 按钮设置电压,提供三个倍率选项是为了方便,比如要设置输出 40uV 不需要输入 0.00004,而只需要输入 40 然后按 uV 即可。
更改设置电压后,程序会在数秒钟时间里将输出值逼近设置值到数百 uV 误差级别,然后需要多个周期将其尽可能校准到 10~20uV 误差级别。可接受的设置和灰度值是 7 位半(以 10V 计),范围是 0~11.999999V,但设计的指标是 6 位半,多出来的位数属于内部设计。
关于电压源的指标、测试和相关电路、原理的讨论可看以前的帖子:
http://www.crystalradio.cn/forum.php?mod=viewthread&tid=367703&extra=
不再赘述,本贴主要汇总最终版的有关资料,包括硬件(电路、PCB)、软件(单片机固件、上位机、校准程序)等。
本设计尤其是单片机部分是十几年前开始的项目,当时我还在用一个很老的编译器,如今这个编译器已不合时宜(主要是显示器问题),用流行的编译器比如 GCC 重写又显得多余,所以我不会再更新这个设计。V2 版至少也要等小孩大了有空才有下一步的计划,也就不要问了 :dizzy:
5free 发表于 2023-12-12 22:12
我请教一下:为啥采用 二次三项式非线性校准 方式? 是不是 四次 五次也行? 这个怎么考虑的?
理论上非线性方程通过泰勒级数展开后,多项式的项可以达到无穷个之多,但是大多数项的系数很小,所以近似的情况下只取几个主项就可以了,否则无法进行工程计算,具体取几次,取决于曲线的形态,如果曲线具有两个单调区间(即U型曲线),那么其展开多项式中,以二次和一次为主,其他更高次的系数都比较小,适合用二次多项式近似,如果曲线具有三个单调区间(即S型曲线),则三次系数也会比较大,适合三次多项式近似,至于更复杂的曲线,会用到更高次,但更高次一来计算复杂度,二来做修正算法运算量会几何倍增长,所以一般会把它进行分段,然后使每段符合U型或S型,实际上S型也可以分段成几个U型,因此曲线拟合方程大多使用二次多项式,少数会使用三次多项式。
LT2400的INL曲线,基本上是一个U型曲线,所以用二次多项式即可,个别器件差异导致U型不理想时,可以加入三次项,再多就没必要了,因为INL曲线本身也是温度相关的,手册给出的曲线,是25度时的样子,温度变化后曲线会不同,甚至变化很大(可以参考其他24位ADC的手册,基本都会给出不同温度下的INL曲线),所以这个非线性校准的目的只是把非线性误差尽可能降低(在校准温度下降低最多,能超过一个数量级),而不是完全消除,所以没必要搞得太复杂。 本帖最后由 washu 于 2023-12-1 19:32 编辑
2、主板固件(含源代码)
其中,
vg_cd2400fb3 是液晶显示屏的固件和源代码
vg_cd24fb3_oled 是 OLED 屏的固件和源代码
前面板固件(含源代码)
程序是用 FastAVR(一个 Basic 语言的编译器)写的,该编译器早已停止支持,只能用于 XP 环境,现提供该编译器,若坛友有自己的想法和察觉有错误以及不足之处,可自行修改,无须经过我同意。
河蟹器,不解释 :D
3、有关说明
3.1、主板和前面板连接参考
MB FB
1 GND 1 GND
2 PB5 | MOSI >to3> 2 PD2 | INT0
3 PD2 | INT0 >to2> 3 PB3 | MOSI
4 PB7 | SCK >to5> 4 PB4 | MISO
5 PB6 | MISO >to4> 5 PB5 | SCK
6 VCC 6 VCC
MB FB
PD2 PD2
PB5 PB3
PB6 PB4
PB7 PB5
$Def IO_KEY_INT = PORTD.2
$Def IO_KEY_CST = PINB.3
$Def IO_KEY_CLK = PINB.5
$Def IO_KEY_DAT = PORTB.4
$Def DR_KEY_DAT = DDRB.4
now 2020-04-12
3.2 EEPROM 说明
地址 功能
Address(byte)
0 3 主校准值(7V)
4 7 主电压(10V)
8 11 DAC 增益(输出放大器。通常,主电压 10V 时该放大器增益 1.25,使得满度电压能达到 12.5V,校准后能达到 12V 设计值)
12 15 主和成电阻值(默认 249 欧姆)
16 19 副合成电阻值(默认 1 兆欧姆)
20 23 二次三项式非线性校准的二次项
24 27 二次三项式非线性校准的一次项
28 31 二次三项式非线性校准的常数项
32 35 默认输出电压值
36 37 36:滤波器长度(0~64);37:调整设置,最高二位调整方式(00),其余位调整阈值(0~63)
38 39 保留
40 60 多点校准数据
3.3 上位机指令
STV 设置输出的电压值
STV;10,000,000;0
10 表示电压值的伏特位,最大值为 10
000 毫伏位,当伏特位 <10 时为 000-999,当伏特位 =10 时为 000-009
000 微伏位,000-999
STS 设置状态 Setting Status
STS;0,00,00,00,0;0
最后一个 n 表示(ADC)运行状态,0 停止,1 运行(默认)
第一个 n=环路状态,1 闭环(默认),0 开环
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
history
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CAL068807650 <--废弃?
CAL068807310
7033075
STV100000000
STV065432190
STS100000000
STR00,000000
CAL 设置校准值 <--废弃?
CAL;06,880,765;2
最后一个 n 表示校准值类型,0=ADC失调,1=DAC失调,2=内部参考(ADC 满度校准),3=DAC 增益,4-6=非线性校准值的三个项系数(y=ax^2+bx+c)
STV 设置输出的电压值
STV;10,000,000;0
10 表示电压值的伏特位,最大值为 10
000 毫伏位,当伏特位 <10 时为 000-999,当伏特位 =10 时为 000-009
000 微伏位,000-999
0 状态位,暂定为量程(10mV-10KV?)
STS 设置状态 Setting Status
STS;0,00,00,00,0;0
最后一个 n 表示(ADC)运行状态,0 停止,1 运行(默认)
第一个 n=环路状态,1 闭环(默认),0 开环
第二三个 n=输入滤波设置,最小为 08 最大为 64
第四五个 n=输出滤波设置,最小为 00(无滤波直接输出)最大 64
第六七个 n=调整阈值,单位为 uV,最小 0 即不对比即调整,最大 99uV
本帖最后由 washu 于 2023-12-1 19:55 编辑
1、硬件电路
这是主机电路,有关信息可参考以前的帖子,这里只是作为汇总资料
电路图
前面板
前面板电路图
补充内容 (2023-12-1 21:16):
主电路图部分器件和最终版有所差异,稍后就此问题在“器件选择”章节说明并给出电路图 本帖最后由 老郑小烧 于 2023-12-1 19:06 编辑
总结得好!与人方便,于己方便:lol。 有些原件不好找,价格也高。学习下思路还是很好的。:victory: 4、上位机
上位机程序包括
4.1 操纵程序,设置电压值、滤波器长度、数字闭环状态等
源代码,使用 Visual Studio 2010(VB)编写
若不需要源代码,可单独下载程序
说明:
将 Voltgen 连接到电脑,安装好驱动(如果需要)后,看设备管理器里新增的串口号,连接到该串口。
连接后,可用 “设置”按钮将电压设置到 Voltgen 的输出
setting 按钮可设置滤波器长度(更短的滤波器可加快闭环时间但会相对不稳定)或者自校准状态:开环时将不校准输出电压
Stop 按钮可关闭数字电路
2、EEPROM 管理器
源代码,使用 Visual Studio 2013(VB)编写
若不需要源代码,可单独下载程序
前略,可用“Read from EEPROM” 从 Voltgen 中读取 EEPROM 里存储的校准值,用 Save to EEPROM 保存到单片机中,如果没有自动校准的条件,可用此程序实现手动校准。
校准值包括主鸡肫电压值(可用校准助手通过观察外接标准表写入此校准值),DAC 基准电压(可不用,但正确写入该值可增加开环时的准确性和加快闭环速度)、DAC 缓冲增益等几个硬件配置(如果改动有关硬件设计,需要填写正确的数值)。
非线性校准如果用二次拟合可填写二次项、一次项和常数三个参数;或者使用多点拟合,需要填写 0 到 11V 的 12 个校准点。
主校准值和多点校准值是分开读写到单片机的。但如果需要保存到电脑,可用 Save as file 或 Load form file,全部保存。
3、全自动校准程序
Voltgen 的校准过程比较复杂,手动校准一次耗时耗精力,所以我编写了全自动校准程序
可实现电压源的一键全自动校准,支持常见的 8 位半万用表 惠普(安捷伦、是德)3458A 和 Advantest 6581,支持安捷伦标准 VISA 库(其它 VISA 库未测试)。
本帖最后由 zhengrob 于 2023-12-1 22:04 编辑
washu 发表于 2023-12-1 19:24
4、上位机
很好的总结,多谢washu!更重要的是,这么一个庞大的项目(硬件,固件,上位机)能够以开源的形式发出来,令人尤其赞叹!
感谢腿软(TalenChow)提供PCB设计,目前10组PCB在制备中,预计下周会生产完成。可以分给有兴趣并且有信心完成组装的坛友。
就像有网友讲的,攒齐PCB板上的元件不是一件容易的事情,首当其冲的就是LTC2400的拆机件基本上已经找不到货源,目录商报价的新片是一百多元一片。再加上多颗高精度低温度系数的金属箔电阻等,完成这个项目的成本是不会太低的。除此之外,一定水准的焊接和测试能力也是必要的,这个我就不必多讲了。
本帖最后由 chenchg 于 2023-12-1 22:01 编辑
我想要一套PCB。
我有一块最初的版本,LTC2400+AD5541+MAX515+6N137的版本。
找了找,竟然还有一片当初屯的2400。
润吉地 发表于 2023-12-1 19:12
谢谢! 希望能有朋友主持套件,可以多人协作,有力的出力,有时间的作分选,有钱的做些前期采购资 ...
套件很难,我 2014 年做过一次,消耗了非常多的时间精力(和部分器件特殊性有关,稍后在器件选择章节会说明)
后来的数次发行都只发行 PCB,实在是没时间精力去弄这个 :dizzy:
开这个贴也是因为有坛友愿意主持一次 PCB 发行,套件就别想了,器件是大问题
本帖最后由 washu 于 2023-12-1 21:47 编辑
zhengrob 发表于 2023-12-1 20:41
...攒齐PCB板上的元件不是一件容易的事情,首当其冲的就是LTC2400的拆机件基本上已经找不到货源,目录商报价的新片是一百多元一片。再加上多颗高精度低温度系数的金属箔电阻等,完成这个项目的成本是不会太低的。
PCB 发行(预定坛友征集)最好不要在本区而是去交易区,这个以前有斑竹提醒过,所以之前发行我都是在隔壁弄的 :D
器件先简单说下,等下要照顾小孩睡觉
ADC 是个大难题,我发行套件之前苦于没有(廉价)货源,于是另外开了个用 ADS1232 的 Costdown 工程,不过固件没有更新到目前的最终版,源代码可以给你(其实以前也在隔壁发过但隔壁论坛挂了),你有空可以整合一下(如果有这个计划)。
ADS1232 有非常廉价的货源,当时的设计是用一片 PCB 通过预留的插针焊在主板上
不过这是不得已的办法,ADS1232 远远不能满足本设计需求,只是“凑合能用”而已。ADS1232 固件没有 7 位半,就只给 6 位半(实际上 6 位半也是勉强)
金属箔电阻不是必须,但如果有可以更好,没有也无伤大雅,本身这个设计就是“自校准”的,但替换的电阻宜低温度系数为好,建议考虑 10ppm 贴片电阻,我看目录商上价格较低(几毛钱)。上面的荔枝 PCB,电阻是 RNC55 金属膜电阻,50ppm 的温度系数(因当时 10ppm 电阻还不是很容易买到),效果也不错,10ppm 显然会更好。
washu 发表于 2023-12-1 21:43
PCB 发行(预定坛友征集)最好不要在本区而是去交易区,这个以前有斑竹提醒过,所以之前发行我都是在隔 ...
多谢washu提醒,上边帖子做了修改。
ADS1232可能稍微要差些,但肯定比搞不到2400强啊。
关于电阻选取,是不是LM399电路的几颗分压电阻至少要10ppm? 如果这样的电阻可以,采购就很方便了:
zhengrob 发表于 2023-12-1 22:10
多谢washu提醒,上边帖子做了修改。
ADS1232可能稍微要差些,但肯定比搞不到2400强啊。
10ppm 已经很好,我发行的套件是 50ppm 的 :D 感谢分享经验和资料,楼主高手!