搜索
bottom↓
回复: 275
打印 上一主题 下一主题

也算是电源吧:自校准的 6 位半电(压)源

  [复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2012-6-24 17:50:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


设计理念:用 LTC2400 在一个闭环周期中测试一次“参考基准”,这里是 LM399,当然也可以是更加可靠的比如 LTZ1000,然后再测试一次 DAC 的输出,计算两者的比例差异并调整 DAC 使得两者保持一个恒定的比例,从而尽可能消除 DAC 的温度系数和老化的影响,将输出电压尽可能纠正到这个参考基准上。

设计目标:
1、6 位半的电压设定和回读分辨率 *
2、<10-25ppm 的年稳
3、曲线拟合纠正后 <10ppm 的线性误差

*实际上两个 DAC 各自具有 12bit 分辨率,合成步进可以达到 24bit(16,777,216)
* 实际上可以达到整 7 位,不过界面上只做了 6 位半

任意电压设定/非线性测试,非线性大概最大 1 个字

10V


9V


8V


7V


6V


5V


4V


3V


来一个有趣的,9.87654V

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

2
 楼主| 发表于 2012-6-24 17:52:49 | 只看该作者
强悍的温度自纠正能力

34 度时:



25 度时:



22 度时:



第二天重复测试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

3
 楼主| 发表于 2012-6-24 17:54:01 | 只看该作者
本帖最后由 lilith 于 2012-6-24 22:42 编辑

电路图

模拟输入前置,ADC 驱动


DAC 、电压合成和输出增益


电压基准


单片机和显示部分


上位机控制程序:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

4
 楼主| 发表于 2012-6-24 17:55:34 | 只看该作者
本帖最后由 lilith 于 2012-6-24 23:00 编辑

单片机上的源程序,加入了简要的注释,一些英文注释是我写程序的时候写给自己看的,语法什么的就不要深究了

读取和处理 ADC 部分代码,我去年发过的用 1602 LCD 做的 6.5 位表头中写有比较详细的注释就不重新写注释了,传送门:http://www.amobbs.com/thread-4899126-1-1.html


$Device= m16                        '声明使用的 IC
$Stack = 32                               
$Clock = 8                        '声明单片机的频率
$Timer2 = PWM, 8, Normal        '使用定时器 2 作为 PWM,这是为了给 12864 LCD 提供负压
$GLCD HD61202, Data=PORTC, Ctrl=PORTA, 128, 64, 3         '声明使用一个 12864 LCD,其驱动内置于编译器中
$Gctrl EN=0, WR=2, DI=1, CS1=5, CS2=4                         '声明显示器使用的 IO
$ShiftIn Data=PORTA.6, Clock=PORTA.7, Msb                 '声明一个软 SPI 输入端口,由编译器驱动
$ShiftOut Data=PORTB.0, Clock=PORTB.1, Msb                '声明一个软 SPI 输出端口,由编译器驱动
$LeadChar="0", Format(2,5)
$Baud = 1200,n,8,1                                        '声明硬件串口的设置

Const Reference = &b00000001                                   '声明模拟开关对应常量
Const ExternaIN = &b00000010
Const GndOffset = &b00000100
Const Synthesis = &b00001000

Dim F2HD As Flash Byte                                        '声明软字体,由编译器提供
Dim F0HD As Flash Byte

Declare Function Setdac(MastDAC As Word, SlavDAC As Word) As Byte        '声明用户函数 设置 DAC
Declare Function SetVoltage(fVoltage As Float) As Byte                        '声明用户函数 设置电压
Declare Function SetChannel(Channel As Byte) As Byte                        '声明用户函数 设置模拟开关通道
Declare Function Getinlerr(fVoltage As Float) As Word                        '声明用户函数 获得非线性误差
Declare Interrupt Urxc()                                                '声明使用串口破中断

Enable Interrupts
Enable Urxc

Dim i As Byte
Dim iSmsetp As Byte
Dim iBusystp As Byte
Dim iTrd As Byte
Dim iDraw As Word
Dim CurrentChannel As Byte
Dim itm As Byte
Dim baCalChannel As Bit
Dim bUartset As Bit

Dim tTxt As String *15
Dim tm As String *7
Dim tCmd As String *4

Dim iDa As Byte
Dim iDb As Byte
Dim iDc As Byte
Dim iDd As Byte

Dim iTa As Byte
Dim iTb As Byte
Dim iTc As Byte
Dim iTd As Byte

Dim bREGas(33) As Byte
Dim bREGbs(33) As Byte
Dim bREGcs(33) As Byte
Dim bREGds(33) As Byte

Dim bREGar(33) As Byte
Dim bREGbr(33) As Byte
Dim bREGcr(33) As Byte
Dim bREGdr(33) As Byte

Dim fTrn As Float
Dim fOut As Float
Dim fReference As Float
Dim fSynthesis As Float
Dim fCalsacles As Float
Dim fCalfSynth As Float

Dim fVoltage As Float
Dim fError As Float
Dim fVset As Float
Dim fVtrn As Float
Dim Vseth As Word
Dim Vsetl As Word

'Dim uVseth As Word
'Dim uVsetl As Word

Dim fSetting As Float
Dim fCurerr As Float
Dim fPreerr As Float
Dim fIerr As Float
Dim fDerr As Float
Dim iPv As Word
Dim iIv As Word
Dim iDv As Word

Dim wErr As Word

Pwm2 = 3
Set DDRD.7 'Setting the VLCD Pwm Output
Set DDRB.2 'Setting the CD4094 Strobe Output
Set DDRA.3 'Setting the LCD 12864 PowerUp Reset Pin
Start Timer2

PORTB.2 = 0   'Setting the CD4094 Strobe Basical Status

' Reset and Init. the Graph LCD
PORTA.3 = 0
WaitMs 200
PORTA.3 = 1
GLcdInit
Gcls

FontSet F2HD
GLcd(0, 0), "Program Init"
Wait 1
Gcls


fVoltage = 9900000
stt:                                                        '程序重新开始执行的断点,设置新的电压值后会转跳到此重新执行
Gcls
' ******************** Init Variable ********************

CurrentChannel = &b01101000
baCalChannel = 0

fReference = 0
fSynthesis = 0
fCalsacles = 6880731

iPv = 100000
iIv = 400
iDv = 10

fPreerr = 0
fError = 0
fIerr = 0

bUartset = 0

For i = 0 To 33
    bREGas(i) = 0
    bREGbs(i) = 0
    bREGcs(i) = 0
    bREGds(i) = 0
    bREGar(i) = 0
    bREGbr(i) = 0
    bREGcr(i) = 0
    bREGdr(i) = 0   
Next i

' ******************** Init Variable ********************

Vseth = ReadEE(0)                                        '读取 EEPROM 中的校准数据
Vsetl = ReadEE(10)
fCalsacles = Vseth * 10000 + Vsetl


FontSet F0HD
Format(Scientific,6)
GLcd(0, 7), fCalsacles                                        '这是为了方便调试加入的,将 EEPROM 中的校准数据显示在 LCD 上


SetVoltage(fVoltage)
WaitMs 500

FontSet F2HD
Format(2, 5)
GLcd(0, 0), "Set"; fVoltage / 1000000; "VDC"

itm = 0
iSmsetp = 0

Do                                               
   iSmsetp = iSmsetp + 1
   If iSmsetp > 67 Then iSmsetp = 67
   'GLcd(0, 7), "Smthsetp:"; iSmsetp                        '等待 ADC LTC2400 的忙碌信号,然后读取它
      
   iBusystp = 0
   Do
     iBusystp = iBusystp + 1
     WaitMs 1   
   Loop While PINA.6 = 1   
   'GLcd(0, 7), "iBusystp:"; iBusystp
   baCalChannel = Not baCalChannel
   If baCalChannel = 1 Then
      CurrentChannel = SetChannel(Synthesis)
   Else
      CurrentChannel = SetChannel(Reference)
   End If
   WaitMs 10

   iDa = ShiftIn
   iDb = ShiftIn
   iDc = ShiftIn
   iDd = ShiftIn   
     
   iDd = iDd And &b11110000
   iDd = Swap(iDd)
   iTrd = iDc And &b00001111
   iTrd = Swap(iTrd)
   iTd = iDd + iTrd
   
   iTrd = iDc And &b11110000
   iTc = Swap(iTrd)
   iTrd = iDb And &b00001111
   iTrd = Swap(iTrd)
   iTc = iTrd + iTc   
   
   iTrd = iDb And &b11110000
   iTb = Swap(iTrd)
   iTrd = iDa And &b00001111
   iTrd = Swap(iTrd)
   iTb = iTrd + iTb  

   iTrd = iDa And &b00110000
   iTa = Swap(iTrd)                                        ' 读取 LTC2400 的 32 个 bit 并处理成 24bit 格式
   

   fTrn = 5 * (16777216 * iTa + 65536 * iTb + 256 * iTc + iTd - 33554432) / 16777216
   'fTrn = fTrn * 2002676 / 1000000
   FontSet F0HD
   
   Format(Scientific,6)                                        ' 用两串数组先入先出存放转换的结果,这样做是因为编译器提供的支持有限,无法使用单精度浮点数组。
   If baCalChannel = 0 Then
      'GLcd(0, 2), "Syn:"; fTrn
      For i = 1 To 32
          bREGds(i) = bREGds(i + 1)
          bREGcs(i) = bREGcs(i + 1)
          bREGbs(i) = bREGbs(i + 1)
          bREGas(i) = bREGas(i + 1)                 
      Next i
      bREGds(32) = iTd
      bREGcs(32) = iTc
      bREGbs(32) = iTb
      bREGas(32) = iTa
      fTrn = 0
      fOut = 0
      For i = 1 To 32
          iTa = bREGas(i)
          iTb = bREGbs(i)
          iTc = bREGcs(i)
          iTd = bREGds(i)
          fTrn = 5 * (16777216 * iTa + 65536 * iTb + 256 * iTc + iTd - 33554432) / 16777216
          fOut = fOut + fTrn
      Next i
      fOut = fOut / 32
      fSynthesis = fOut
      'GLcd(0, 4), "sm_Syn:"; fSynthesis
   Else
      'GLcd(0, 3), "Ref:"; fTrn
      For i = 1 To 32
          bREGdr(i) = bREGdr(i + 1)
          bREGcr(i) = bREGcr(i + 1)
          bREGbr(i) = bREGbr(i + 1)
          bREGar(i) = bREGar(i + 1)                 
      Next i
      bREGdr(32) = iTd
      bREGcr(32) = iTc
      bREGbr(32) = iTb
      bREGar(32) = iTa
      fTrn = 0
      fOut = 0
      For i = 1 To 32
          iTa = bREGar(i)
          iTb = bREGbr(i)
          iTc = bREGcr(i)
          iTd = bREGdr(i)
          fTrn = 5 * (16777216 * iTa + 65536 * iTb + 256 * iTc + iTd - 33554432) / 16777216
          fOut = fOut + fTrn
      Next i
      fOut = fOut / 32
      fReference = fOut     
      'GLcd(0, 5), "sm_Ref:"; fReference        
   End If
   
   fCalfSynth = fSynthesis / (fReference / fCalsacles)                        '经过先入先出寄存器后的转换结果被平滑,然后根据校准数据和非线性校正数据计算得到正确的电压值
   fCalfSynth = fCalfSynth + Getinlerr(fCalfSynth/1000000)
   'GLcd(0, 7), Getinlerr(fCalfSynth/1000000)
   
   If iSmsetp > 66 Then                                                        '当寄存器满了才认为可以进行电压修正
      FontSet F2HD
      Format(2,5)
      GLcd(0, 2), "Red"; fCalfSynth / 1000000; "VDC"
      'fSetting = fVoltage
      fCalfSynth = fCalfSynth
      fError = fVoltage - fCalfSynth                                        '获得测量值和设置值的差
      FontSet F0HD
      Format(3,1)
      GLcd(0, 4), "Err:"; fError; " uV"
      
      fCurerr = fVoltage - fCalfSynth                                        '用这个差值作为 PID 算法的入口,得到校正值去重设 DAC
      fIerr = fIerr + fCurerr
      fDerr = fPreerr
      fError = iPv * fCurerr + iIv * fIerr + iDv * fDerr
      fPreerr = fCurerr
      Format(Scientific,6)
      'GLcd(0, 5), "PID:"; fError
      
      fError = fVoltage + fError / 10000
      GLcd(0, 5), "Adj:"; fError
      SetVoltage(fError)
   End If
   FontSet F0HD
   GLcd(96, 7), Hex(iSmsetp); "/43"
   'GLcd(0, 5), "USet: "; tTxt
   If bUartset = 1 Then

      'GLcd(0, 6), "Usetf:"; fSetting
      
      fVoltage = fSetting
      'SetVoltage(fVoltage)
      
      iSmsetp = 0
      bUartset = 0
      GoTo stt
   End If   
Loop


Function Setdac(MastDAC As Word, SlavDAC As Word) As Byte                '设置 DAC 的子函数,将入口值转换为 MAX515 适合的格式;MAX515 的 CS 接在移位寄存器 CD4094 上
Local bMastMSB As Byte
Local bMastLSB As Byte
Local bSlavMSB As Byte
Local bSlavLSB As Byte
Local Channelset As Byte

bMastMSB = Msb(MastDAC)
bMastLSB = MastDAC - bMastMSB * 256
bSlavMSB = Msb(SlavDAC)
bSlavLSB = SlavDAC - bSlavMSB * 256

Channelset = CurrentChannel And &b00001111
ShiftOut &b00000000; &b00000000; &b00000000; &b00000000; Channelset
PORTB.2 = 1 : WaitUs 100: PORTB.2 = 0
Channelset = &b01100000 + Channelset
ShiftOut bMastMSB; bMastLSB; bSlavMSB; bSlavLSB; Channelset
PORTB.2 = 1 : WaitUs 100: PORTB.2 = 0
Return 0
End Function



Function SetVoltage(fVoltage As Float) As Byte                                '设置电压的子函数,根据电压合成公式逆运算得到两个 DAC 应当的设置值
' the addsch VOut = Gain * (Vmast * R2 + Vslave * R1) / (R1+R2), Fullscale of the Vm and Vs all = 5V, R1 = 1K ohm, R2 = 1M ohm, Gain = 2.01509
fVtrn = fVoltage
fVset = fVtrn
' Get the MastDAC Voltage Setting Value
fVtrn = fVtrn / 2015090                        'the 2015090 is the Buffamp Gain( x2.01509)
fVtrn = fVtrn * 1001000 - 5000        'the 1001000 is the MastRes 1K and the SlaveRes 1M
fVtrn = fVtrn * 4095 / 4995005        'the 4095 is the 12bit DAC Full scale; 4995005 scale by addsch.(added the MastDAC Fullscale Voltage)
Vseth = fVtrn

fVtrn = Vseth * 5000000 / 4095
fVtrn = fVtrn / 1001000
fVtrn = fVset - fVtrn * 2015090
fVtrn = fVtrn * 1000000 / 2015090
fVtrn = fVtrn * 4095 / 5000
Vsetl = fVtrn

Setdac(Vseth,Vsetl)
Return 0
End Function

Function SetChannel(Channel As Byte) As Byte                                '设置模拟开关的子函数
Local Channelset As Byte
Channelset = &b01100000 + Channel
ShiftOut &b00000000; &b00000000; &b00000000; &b00000000; Channelset
PORTB.2 = 1 : WaitUs 100: PORTB.2 = 0
Return Channelset
End Function

Function Getinlerr(fVoltage As Float) As Word                                '获得非线性校正数据,它是通过测量和拟合得到的一个二次三项式,不过这没有经过深入的验证
Local bInlerr As Word

fVtrn = fVoltage
fVset = fVtrn

fVtrn = fVtrn * fVtrn * 7381
fVset = (fVset * 12381 + 645120)
fVset = (fVset - fVtrn) / 1000

bInlerr =  fVset
Return bInlerr
End Function

Interrupt Urxc(),Save 1
Local uVseth As Word
Local uVsetl As Word
Local uMSBh As Byte
Local uLSBh As Byte
Local uMSBl As Byte
Local uLSBl As Byte

InputBin tTxt

tCmd = Mid(tTxt, 1, 3)
If tCmd = "STV" Then
   tm = Mid(tTxt,4,4)
   uVseth = Val(tm)
   tm = Mid(tTxt,8,4)
   uVsetl = Val(tm)
   fSetting = uVseth
   fSetting = fSetting * 10000
   fSetting = fSetting + uVsetl
   bUartset = 1
End If

If tCmd = "CAL" Then
   tm = Mid(tTxt,4,4)
   uVseth = Val(tm)
   tm = Mid(tTxt,8,4)
   uVsetl = Val(tm)
   
   'uMSBh = Msb(uVseth)
   'uMSBl = Msb(uVsetl)
   'uLSBh = uVseth - uMSBh * 256
   'uLSBl = uVsetl - uMSBl * 256
   WriteEE (0,uVseth)
   WriteEE (10,uVsetl)

   bUartset = 1  
End If


Enable Interrupts
End Interrupt


$Include "..\Help\samples\F2HD.bas"                                '编译器提供的软字体
$Include "..\Help\samples\F0HD.bas"

出0入0汤圆

5
发表于 2012-6-24 18:01:40 | 只看该作者
万一火了呢?

出500入0汤圆

6
发表于 2012-6-24 18:12:27 | 只看该作者
一定会火,看到过楼主的这个帖子,高手啊!

出0入0汤圆

7
发表于 2012-6-24 18:16:32 | 只看该作者
见证酷帖!

出0入0汤圆

8
发表于 2012-6-24 18:24:04 | 只看该作者
普通测量射试验这个经度确实可以了。期待程控电流输出控制。

出0入300汤圆

9
发表于 2012-6-24 18:52:22 | 只看该作者
坚决要向楼主学习,我又找到了前进的目标,我想我要是能搞个5位半的就足够了.
正好有个8层板要画,一定要挤出一块地方做这个.

出0入0汤圆

10
发表于 2012-6-24 19:06:09 | 只看该作者
这种源程序,发了等于没发……b s !

出0入0汤圆

11
发表于 2012-6-24 19:43:13 | 只看该作者
楼主的程序是什么语言写的啊?

出0入0汤圆

12
发表于 2012-6-24 20:27:44 | 只看该作者
xld007 发表于 2012-6-24 19:06
这种源程序,发了等于没发……b s !

那您上传一个发了不等于没发的源程序呗?

出0入0汤圆

13
发表于 2012-6-24 20:31:35 | 只看该作者
楼主强人呀!小弟有几个问题问一下:(1)电源是不是按串联负反馈的形式来做的?(2)保证LTC2400读到的LM399的值和DAC的值为一恒定比例,这怎么实现?不太懂这的意思(3)两个12位的DAC合成分辨率能达到24位,这个听起来很玄乎呀?!这怎么实现呀?

出0入0汤圆

14
发表于 2012-6-24 20:32:56 | 只看该作者
希望楼主抽空略微解释一下,帮小弟扫扫盲!!!

出0入0汤圆

15
发表于 2012-6-24 20:39:06 | 只看该作者
xld007 发表于 2012-6-24 19:06
这种源程序,发了等于没发……b s !

你看不懂就等于没发? 这是BASAVR,  用basic 语言写的avr程序.

出0入0汤圆

16
发表于 2012-6-24 20:47:58 | 只看该作者
*实际上两个 DAC 各自具有 12bit 分辨率,合成步进可以达到 24bit(16,777,216)

MAX515 是10bit 的DAC , 两个(通过运放加法合成)最高也只能是20bit吧 ?

出130入129汤圆

17
发表于 2012-6-24 20:52:34 | 只看该作者
这精度真不错

出0入0汤圆

18
 楼主| 发表于 2012-6-24 22:16:06 | 只看该作者
shark 发表于 2012-6-24 20:47
MAX515 是10bit 的DAC , 两个(通过运放加法合成)最高也只能是20bit吧 ?

是的,手册上给出的是 10bit,两外两个低位 bit 说法是为了保持兼容,可是我使用的时候发现这两个 bit 是有效的,比如你写入 &b0000111111111100 那么它不能输出到满度(5V),而是 4.995V,这一点我也非常疑惑,甚至怀疑淘宝上的 JS 是不是用某个兼容的 12bit DAC 打磨给我了,如果谁能帮申请个样片来证实下就好了,所以,程序也按照 12bit+12bit 来写了

出0入0汤圆

19
 楼主| 发表于 2012-6-24 22:20:11 | 只看该作者
fanmingming 发表于 2012-6-24 20:31
楼主强人呀!小弟有几个问题问一下:(1)电源是不是按串联负反馈的形式来做的?(2)保证LTC2400读到的LM3 ...

(1)电源是不是按串联负反馈的形式来做的?(2)保证LTC2400读到的LM399的值和DAC的值为一恒定比例,这怎么实现?不太懂这的意思(3)两个12位的DAC合成分辨率能达到24位,这个听起来很玄乎呀?!这怎么实现呀?


1、是的,只不过用 ADC 作为负反馈的输入,比例微积分调整由算法进行,调整管变成了 DAC :)

2、就相当于运放保持同相输入端和反相输入端电压一直的意思 :)

3、不玄乎阿,你看两个 DAC 输出端是用两个电阻并联在一起的,那么并联端电压 Vo 就是 (Vdac1*R2 + Vdac2*R1) / (R1+R2),如果 R1:R2 是 1:4096(1K Ohm : 4.096M Ohm),那不就是啦?



出0入0汤圆

20
发表于 2012-6-24 22:29:04 | 只看该作者
肯定会火,哈哈

出0入4汤圆

21
发表于 2012-6-24 22:30:05 | 只看该作者
没看大懂哦,继续潜水了

出0入0汤圆

22
发表于 2012-6-24 22:30:13 来自手机 | 只看该作者
围观WASHU

出0入0汤圆

23
发表于 2012-6-24 22:34:54 | 只看该作者
先记着,回头学习下

出0入0汤圆

24
发表于 2012-6-24 22:41:01 | 只看该作者
恩,感觉和以前在坛里看到那个六位半的电压表有点相似

出0入0汤圆

25
发表于 2012-6-24 22:44:04 | 只看该作者
shark 发表于 2012-6-24 20:39
你看不懂就等于没发? 这是BASAVR,  用basic 语言写的avr程序.


我不说上一句,楼主会注释给你看吗?做梦!

没注释,你看的懂吗?

出0入0汤圆

26
 楼主| 发表于 2012-6-24 22:47:48 | 只看该作者
PCBBOY1991 发表于 2012-6-24 22:41
恩,感觉和以前在坛里看到那个六位半的电压表有点相似

这个?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

27
发表于 2012-6-24 22:48:07 | 只看该作者
楼主这种用法的是开创性的,用廉价DAC完成昂贵的高精度DAC的功能,精度达到6位半,确实很厉害,也谢谢楼主的无私分享。

出0入0汤圆

28
发表于 2012-6-24 22:48:36 | 只看该作者
xld007 发表于 2012-6-24 22:44
我不说上一句,楼主会注释给你看吗?做梦!

没注释,你看的懂吗?

人家又没有义务让你看得懂, 就是无注释的程序分享也已经很好了, 有什么可BS的 ?  

出0入0汤圆

29
 楼主| 发表于 2012-6-24 22:49:26 | 只看该作者
xld007 发表于 2012-6-24 22:44
我不说上一句,楼主会注释给你看吗?做梦!

没注释,你看的懂吗?

抱歉,因为我只是刚刚完成了总体的架构,未来还有很多细节需要完善,所以还没有开始写注释,我是想等到大体上代码确定下来了才开始写中文注释了

出0入0汤圆

30
发表于 2012-6-24 22:52:58 | 只看该作者
说真的,我崩溃了,难得有这么让我激动的帖子……

出0入0汤圆

31
发表于 2012-6-24 22:53:39 | 只看该作者
lilith 发表于 2012-6-24 22:47
这个?

对的,难道是你做的??

出0入0汤圆

32
发表于 2012-6-24 22:54:21 | 只看该作者
很喜欢这个显示屏的字体

出0入0汤圆

33
 楼主| 发表于 2012-6-24 22:58:35 | 只看该作者
PCBBOY1991 发表于 2012-6-24 22:53
对的,难道是你做的??

一看就知道了阿   当然是我做的,还有做模拟条图哟

大致上源程序和上面的读取部分类似,而且我去年发过一个用 1602 LCD 做的 6.5 表头,那个源程序我写的注释比较详细:
http://www.amobbs.com/thread-4899126-1-1.html

里面还有非线性数据测试和测试视频,然后我在其基础上使用点阵 LCD,做了这个表头,模拟条图部分很也难怪简单,用编译器提供的绘制直线函数绘制而已

这两个表头都是为了这个电压发生器(电压源)投石问路而做的,在其中还有一个东西

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

34
发表于 2012-6-24 23:24:12 | 只看该作者
lz这UI做得挺漂亮的!
很有美感!

出0入0汤圆

35
发表于 2012-6-24 23:29:53 | 只看该作者
谢谢楼主分享...灰常不错...

出0入0汤圆

36
 楼主| 发表于 2012-6-24 23:32:37 | 只看该作者
kdtcf 发表于 2012-6-24 22:48
楼主这种用法的是开创性的,用廉价DAC完成昂贵的高精度DAC的功能,精度达到6位半,确实很厉害,也谢谢楼主 ...

这个想法来自于我试图用电桥平衡法用哈蒙量具从单一基准中获得其它电压值,最初的计划是用一台外置的高位表(H 3457/34401)和若干继电器、高精度电阻完成:
http://www.amobbs.com/thread-3641058-1-1.html

但这个计划终于没有实行,因为需要动用的资源实在是太多了   另外我在寻找合适的 ADC 的时候发现 Linear 的官方应用笔记 An86 和我的想法不谋而合:
AN86 - A Standards Lab Grade 20-Bit DAC with 0.1ppm/° Drift: The Dedicated Art of Digitizing One Part Per Million
http://cds.linear.com/docs/Application%20Note/an86f.pdf


这加深了我的信心,在我的方案中还有一个内部参考的自我校准过程,所以就索性一起综合了,首先我试验了 LTC2400,去年发了一个帖子的:
http://www.amobbs.com/thread-4899126-1-1.html


然后我进一步将自校准的部分加入表头中,这个部分的成败决定了今天这个方案是否能进行,幸运的是测试非常成功,这一部分是去年底到今年初这个比较冷的时段进行的,这样可以较好测试温度系数



我的方案的初衷,就是尽可能降低对价格昂贵的特殊高稳定电阻的需要,简化硬件电路的设计和成本,降低硬件电路的调试精力,将能用软件做的事情丢给软件做,很多人都对电压基准有兴趣,但是制作高稳定电压基准需要使用数量较多,阻值特定的高稳定电阻,这些电阻价格昂贵、不易购买,并且一些方案还需要将电路恒温以保证温度特性,虽然这种纯靠硬件保证性能的做法可以实现很高的稳定度,但这是靠元器件的高指标达到的,存在 DIY 难度大、成本高的缺点,我就是想试图降低 DIY 这个东西的难度和成本   当然了,同时带来的还有可以获得任意电压的便利性,而传统做法只能得到单一电压。

不过必须指出的是,这个方案存在天然的缺点,在极高的要求上,它还是不能和传统的电阻法制作的电压基准相比的,传统电阻法制作的电压基准,可以做到极高的稳定性和较小的温度系数(如果整体恒温则可以得到极好的温度特性),同时最重要的是噪声也很低,在 7 位半甚至 8 位半万用表的对比和校准中也能发挥作用,而我的方案存在两个天然问题

1、整体上的性能其实受限于 ADC,这里是 LTC2400。虽然可以通过对 0 点、增益进行校准的方式修正误差,但非线性误差它是存在的,即使我设计了非线性误差修正,但是这个非线性误差修正是根据较少的测试数据总结的规律进行的,没有进一步数据显示这个纠正是普适而且长期有效的纠正。也就是说,如果 ADC 的非线性随着时间而变化了的话,那么自校准的结果将不再可靠。

这一点,需要大量的成品,进行大量而长期的实测才能得到是或者否的证实,目前只能说“尚未明确”。


2、噪声,噪声有两个来源,一个是 DAC 和电压合成、增益缓冲电路产生的,它可以通过选择低噪声 DAC 和低噪声运放做得更好,但终究经过了较为复杂的 DAC 还是很难和传统的电阻法相比;第二个是 PID 程序的微调过程,它会产生大约 6-7HZ 的低频噪声,同时还有大约 0.1HZ 的超低频噪声(64x167ms),这是 ADC 的速度和程序原理决定的,当然可以通过暂时关闭数字闭环调整来消除这个噪声,不过此时输出的电压将不可靠。



目前我只是完成了大致的架构,主要在于证实我的这个想法它具有可行性,其它的还待深入的测试和完善,尤其是其长期性能,它是建立在很不靠谱的 LTC2400 这个芯片的基础上的,说实话我对此没有很高的信心,所以如果在一个相当数量的样本上,经过数年测试,能达到 10ppm 的年指标,那就算是达到目标了   当然,目前温度系数和线性度,大致上算是达到了目标(5ppm 的温度系数和线性度指标),不过这个指标应该在至少一年的时间和设计的温度范围内被保持,所以目前的测试还是非常不足的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

37
发表于 2012-6-24 23:43:09 | 只看该作者
楼主牛逼           

出0入0汤圆

38
发表于 2012-6-25 01:15:06 | 只看该作者
本帖最后由 110112110 于 2012-6-25 01:22 编辑

是我这里的问题吗?我看不到图片

尝试下载图片提示
415 Unsupported Media Type

出0入0汤圆

39
发表于 2012-6-25 01:32:07 | 只看该作者
学习一下

出0入0汤圆

40
发表于 2012-6-25 06:57:12 | 只看该作者
楼主大才!;)

出70入145汤圆

41
发表于 2012-6-25 07:25:44 | 只看该作者
很强大。6位半我是想也不敢想的精度

出0入0汤圆

42
发表于 2012-6-25 08:01:48 | 只看该作者
楼主啊,这东西不配上LTZ1000基准太亏了吧。

出0入0汤圆

43
发表于 2012-6-25 08:30:12 | 只看该作者
jj3055 发表于 2012-6-25 08:01
楼主啊,这东西不配上LTZ1000基准太亏了吧。

楼主做的是尽量低成本实现高性能, LM399价格便宜性能又好, 34401A都用它;  LTZ1000货少价贵

出0入0汤圆

44
发表于 2012-6-25 08:35:49 | 只看该作者
强帖留名哈哈哈

出0入0汤圆

45
发表于 2012-6-25 09:16:14 | 只看该作者
lilith 发表于 2012-6-24 22:58
一看就知道了阿   当然是我做的,还有做模拟条图哟  

大致上源程序和上面的读取部分类 ...

液晶屏是什么型号呢?

出0入0汤圆

46
发表于 2012-6-25 09:31:10 | 只看该作者
强帖留名,好久没见到这么纯的技术贴了

出0入0汤圆

47
发表于 2012-6-25 09:39:12 | 只看该作者
basic写的,原来还真有人用basic写AVR啊………………
电源开眼界了,basic也开眼界了,顶LZ~~~~~~~~~

出0入0汤圆

48
 楼主| 发表于 2012-6-25 09:52:57 | 只看该作者
PCBBOY1991 发表于 2012-6-25 09:16
液晶屏是什么型号呢?

是并口的传统 12864,编译器内置了驱动,如果用别的串口液晶屏就要自己写驱动了





***************

basic写的,原来还真有人用basic写AVR啊………………
电源开眼界了,basic也开眼界了,顶LZ~~~~~~~~~



这个我只会 BASIC   

出0入0汤圆

49
 楼主| 发表于 2012-6-25 09:56:49 | 只看该作者
jj3055 发表于 2012-6-25 08:01
楼主啊,这东西不配上LTZ1000基准太亏了吧。

现在还在方案可行性的测试阶段,当然用 399 来测试啦,LTZ 我就那么两三个不舍得阿   你看我连 MAX541 的样片都不舍得用,用了两片 MAX515 来测试的说   当然到了长期实施测试阶段,这个配合 LTZ 进行长期测试的可以有,作为一个可选的基准选件吧,不过我并不是很想,LTZ 太难买到也太贵了,当然你手头上据说有不少

出0入0汤圆

50
发表于 2012-6-25 09:59:02 | 只看该作者
收藏及学习一下.

出0入0汤圆

51
 楼主| 发表于 2012-6-25 10:02:10 | 只看该作者
ddqq 发表于 2012-6-25 08:30
楼主做的是尽量低成本实现高性能, LM399价格便宜性能又好, 34401A都用它;  LTZ1000货少价贵 ...

是的,如果在长期的测试中表明这个方案的跟踪特性足够好,那么可能它配合 LTZ 能实现更高的指标也说不定,毕竟 LTZ 的内恒温温度可以自己设定,设定得比较低的话有利于延缓老化速度,同时降低噪声,此外 LTZ 的温度系数也容易做得比 LM399 好。不过我还是倾向于在大量测试中以 399 为主,其实 LTZ 外围电路比较复杂,也容易增加不可靠因素,同时对部分电阻要求也是相当高的。

34401A 使用的 LM399 怀疑是经过筛选的,或许我们一般买到的 399 没有那么好,不过这个只是猜测,我测试了两个来自 Linear 的 399 样片和两个在 JS 处购买的也是 Linear 的 399,温度系数差的接近 0.3ppm,好的小于 0.1ppm(太小了测试数据不确定性比较大),但是老化就不好说了,毕竟内恒温温度太高。

出0入0汤圆

52
发表于 2012-6-25 10:10:41 | 只看该作者
lilith 发表于 2012-6-25 09:56
现在还在方案可行性的测试阶段,当然用 399 来测试啦,LTZ 我就那么两三个不舍得阿   你看我连 M ...

昨天数了一下,包括一个全新的,总共42个。 早就知道这东西难买了,见到一个买一个,就搜罗起来了。还有14个成品在接受老化测试。也就是说手头总共有56个,哈哈。

我一直担心2400的线性问题,尤其是线性的长期稳定性,你玩了这么久,能不能说说你的经验。

出0入0汤圆

53
 楼主| 发表于 2012-6-25 10:23:17 | 只看该作者
jj3055 发表于 2012-6-25 10:10
昨天数了一下,包括一个全新的,总共42个。 早就知道这东西难买了,见到一个买一个,就搜罗起 ...

太奢侈了

关于 2400 的线性问题,我也担心,很多人都担心,都不持乐观态度,麻烦的地方是这个需要大量而长期的测试,而这个测试目前还没有开始,原因很简单,没有人帮我画 PCB 阿

出0入0汤圆

54
发表于 2012-6-25 10:26:50 | 只看该作者
这个是高手,我只能围观了,学习学习,谢谢

出0入0汤圆

55
发表于 2012-6-25 11:56:03 | 只看该作者
膜拜,高人

出0入0汤圆

56
发表于 2012-6-25 12:12:33 | 只看该作者
34410 ltz.... 都是高端货 LZ肯定是38度那边的人

出0入0汤圆

57
发表于 2012-6-25 12:37:53 | 只看该作者
不错。这么好的贴居然还有人泼冷水。唉。人心啊。

出0入0汤圆

58
发表于 2012-6-25 12:46:48 | 只看该作者
膜拜楼主呀!

出0入0汤圆

59
发表于 2012-6-25 13:00:56 | 只看该作者
收藏了,珍品

出0入0汤圆

60
发表于 2012-6-25 13:05:48 | 只看该作者
本帖最后由 deadline2012 于 2012-6-25 19:57 编辑
lilith 发表于 2012-6-24 17:54
电路图

模拟输入前置,ADC 驱动



这个电路用了很多遍,搂着可否给讲一讲这其中的电阻电容是如何确定的呢?

初步计算了一下,这个电路的带宽只有120Hz,不知道为什么楼主要选用这么小的带宽,是为了抑制噪声吗?还是。。。

个人觉得这个调节过程有点像逐次逼近型AD;

AD的线性度决定整个电路的精度;


其中的开关是用什么实现的,机械开关or模拟开关?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入14汤圆

61
发表于 2012-6-25 13:15:36 | 只看该作者
强帖留名

出0入0汤圆

62
发表于 2012-6-25 13:29:13 | 只看该作者
酷啊  论坛总有新东西

出0入0汤圆

63
发表于 2012-6-25 13:37:24 | 只看该作者
clogord 发表于 2012-6-25 12:12
34410 ltz.... 都是高端货 LZ肯定是38度那边的人


你说对了,楼主确实是那边过来的

出0入0汤圆

64
发表于 2012-6-25 16:49:43 | 只看该作者
DAC的用法比较创新

出10入120汤圆

65
发表于 2012-6-25 17:17:06 | 只看该作者
电源的重要指标有一项快速的负荷特性和响应时间,这个才是难点,为什么大量的电源使用硬件来实现,相比与这个相关吧,楼主什么时候也测试下。

出0入0汤圆

66
发表于 2012-6-25 18:49:43 | 只看该作者
支持强人啊1

出0入0汤圆

67
发表于 2012-6-25 18:58:59 | 只看该作者
lz是否能将字体上传? 很漂亮。

出0入0汤圆

68
发表于 2012-6-25 19:00:12 | 只看该作者
makesoft 发表于 2012-6-25 17:17
电源的重要指标有一项快速的负荷特性和响应时间,这个才是难点,为什么大量的电源使用硬件来实现,相比与这 ...

楼主做的其实就是校准源, 用来校准3位半,4位半电压表用途,目的不是作为电源

出0入0汤圆

69
发表于 2012-6-25 19:07:08 | 只看该作者
其实还有更牛叉的合成方法。

出0入0汤圆

70
发表于 2012-6-25 19:18:53 | 只看该作者
强贴一定要MARK·

出0入0汤圆

71
发表于 2012-6-25 19:20:53 | 只看该作者
BS一下那位说风凉话的,虽然我也看不懂,但这是源码,不是HEX文件。

出0入85汤圆

72
发表于 2012-6-25 19:29:08 | 只看该作者
本帖最后由 marshallemon 于 2012-6-25 20:19 编辑
lilith 发表于 2012-6-24 22:16
是的,手册上给出的是 10bit,两外两个低位 bit 说法是为了保持兼容,可是我使用的时候发现这两个 bit 是 ...


LZ出套件不?另外请LZ把你这个所使用的PID各个系数的值是多少麻烦列出来,特别是P参数,好让小的们对这个AD,DA 心里有个数
头像被屏蔽

出0入0汤圆

73
发表于 2012-6-25 19:35:32 | 只看该作者
看到好东西了,帮顶下

出0入0汤圆

74
发表于 2012-6-25 21:22:33 | 只看该作者
大神们往高精尖方向发展.我还在读图,差距不是一般的大啊,看楼主的上位机vB写的,看来要学的东西太多了

出0入0汤圆

75
发表于 2012-6-25 22:11:36 | 只看该作者
确实很强悍。。。谁有意DIY?

出0入0汤圆

76
发表于 2012-6-25 22:37:04 | 只看该作者
感谢楼主,收藏学习。

出0入0汤圆

77
发表于 2012-6-25 22:53:54 | 只看该作者
酷啊  论坛总有新东西

出0入0汤圆

78
发表于 2012-6-26 08:21:36 | 只看该作者
liouli 发表于 2012-6-25 21:22
大神们往高精尖方向发展.我还在读图,差距不是一般的大啊,看楼主的上位机vB写的,看来要学的东西太多了 ...

楼主经过多年修炼,已经打通任督二脉。

出0入0汤圆

79
发表于 2012-6-26 08:53:37 | 只看该作者
本帖最后由 fanmingming 于 2012-6-26 11:12 编辑
lilith 发表于 2012-6-24 22:20
(1)电源是不是按串联负反馈的形式来做的?(2)保证LTC2400读到的LM399的值和DAC的值为一恒定比例,这 ...


谢谢楼主解释!!! ,学到了很多崭新的设计思想!真的很谢谢!要是能上传一份pdf格式的电路图那就更好了,可以从整体学习楼主的设计理念!!!

出0入0汤圆

80
发表于 2012-6-26 10:58:49 | 只看该作者
学习,围观一下

出0入0汤圆

81
发表于 2012-6-26 16:49:06 | 只看该作者
呵呵,和这个有得一比
http://www.amobbs.com/forum.php? ... A%E7%83%AD%E9%97%B9

出0入0汤圆

82
 楼主| 发表于 2012-6-26 21:44:31 | 只看该作者
deadline2012 发表于 2012-6-25 13:05
这个电路用了很多遍,搂着可否给讲一讲这其中的电阻电容是如何确定的呢?

初步计算了一下,这个电路的 ...

Rc 的大小取为不会在意外的时候运放输出到正轨或负轨,而产生过大的电流流过 2400 的 ESD 二极管,也就是说其本意是保护 LTC2400 的,而 Cout 的大小是 2400 这个芯片的要求*,2400 的输入端表现为一个开关电容,所以要求在 Vin-Agnd 之间旁路一个大约 1uf 的电容,当然这个电容的大小和响应速度、积分线性都有关系,我取较大的值同时 Cs 也取到 0.1u,确实如你所说抑制带宽降低噪声了,毕竟这个电路并不注重于动态性能


*参考 Linear 的手册第 23 页:
http://cds.linear.com/docs/Datasheet/2400fa.pdf



个人觉得这个调节过程有点像逐次逼近型AD;
AD的线性度决定整个电路的精度;



**************

对的,不过不如说、逐次逼近的 DAC

另外,An86:
http://cds.linear.com/docs/Application%20Note/an86f.pdf


用于切换外部输入/内部参考/同步电压输出...的开关是模拟开关,型号就是图上标注的 SW202,任何兼容的模拟开关理论上都可以替换,但实际上我用 LT202 什么的效果较好(这是样片)而 DG202 效果很差(这是淘宝上的假冒翻新器件),SW202 是能找到的效果较好、价格便宜的拆机件。质量不好的模拟开关,主要的问题表现在自动调零的步骤中不能很好调零。

出0入0汤圆

83
 楼主| 发表于 2012-6-26 21:59:41 | 只看该作者
wahuahua 发表于 2012-6-26 16:49
呵呵,和这个有得一比
http://www.amobbs.com/forum.php? ... ighlight=%E5%87%91% ...


嗯,和这个的电源差不多是类似但又处于两个极端的参照物   


mcuzgh 的是电源(Power Supply)我的是电压源(DC Voltage Source)

mcuzgh 输出电流达到 5A,我的设计小于 10mA*

mcuzgh 的负载调整能力应该很好(mcuzgh 原话:5A时也就比空载大20uV的误差)我的,阿?负载调整系数?那是什么,好吃的吗?

###########makesoft ###########
电源的重要指标有一项快速的负荷特性和响应时间,这个才是难点,为什么大量的电源使用硬件来实现,相比与这个相关吧,楼主什么时候也测试下。
###########makesoft ###########


响应时间这个 mcuzgh 的的不知道,我的,阿?响应时间?左看看右看看,今天天气很好嘛!**

mcuzgh 使用自制的 R2R DAC,我用商品 DAC

mcuzgh 的回读分辨率只有 4 位半,和设定分辨率差很远,我的回读分辨率和设定分辨率一致(上位机上设定和回读分辨率更高唷

mcuzgh 的电压输出和回读之间没有闭环系统,我的电压输出和回读之间有闭环系统***


所以说,有一点重叠的地方,不过具体的方向还是差很远的,设计的目标也完全不一样。



* 当然在 10mA 设计范围内,它应该有小于 1ppm 的负载调整能力
** ADC 的响应时间是 167ms * 64 个周期 = 10 秒,PID 调整的延时大约是 200 秒以上
*** 我这个设计说白了就是设计这个闭环啦,如果开环使用就和 mcuzgh 那玩意没差别了,或者说还没有他的具有负载能力,而且一旦开环我这破烂的温度系数可能比 mcuzgh 的电源还烂 人家毕竟用了正经的高稳定电阻,我就是低成本设计阿

出0入0汤圆

84
发表于 2012-6-26 23:58:11 | 只看该作者
lilith 发表于 2012-6-26 21:44
Rc 的大小取为不会在意外的时候运放输出到正轨或负轨,而产生过大的电流流过 2400 的 ESD 二极管,也就是 ...

谢谢你的回答

文档中这样写道:
If the total capacitance at VIN (see Figure 17) is small
(< 0.01mF), relatively large external source resistances (up
to 20k for 20pF parasitic capacitance) can be tolerated
without any offset/full-scale error.
就是说小的输入电容,可以有大的源内阻而没有任何的 offset/full-scale error;

但是通常的理解是这样的,输入端有一个开关电流(采样电流),如果输入端子有大的电容存储电荷,那么采样电流从这个电容上面汲取电荷,而输入电压不会偏离多少,这样子得到的结果偏离真实值就小。
这与文档中得描述有点不一样,楼主可否说明一些呢?

出0入0汤圆

85
发表于 2012-6-27 00:14:38 | 只看该作者
lilith 发表于 2012-6-26 21:59
嗯,和这个的电源差不多是类似但又处于两个极端的参照物   

mcuzgh这位大神就是你那个HSPY电源的设计者 ,不知道量产后为什么质量如此不堪.

出0入0汤圆

86
发表于 2012-6-27 01:00:41 | 只看该作者
楼主厉害!!!!

出0入0汤圆

87
发表于 2012-6-27 01:10:02 | 只看该作者
很强悍的作品,看看照片已满足了。

出0入0汤圆

88
发表于 2012-6-27 11:00:41 | 只看该作者
deadline2012 发表于 2012-6-26 23:58
谢谢你的回答

文档中这样写道:

用ADC采样后再调整DAC的输出作为高精度、高稳定度的电压源有些疑问。1 以现有的ADC芯片精度有限(要实现全量程,难度更大,相当于做了一块高精度万用表,国产的61/2表的精度做到最好的也就0.002%还得来回漂移),2 稳定度受限,只要有调整稳定度就会受到一定的影响。要同时保证精度和稳定度必须找到一个很好的点,但这个点不大好找,所以国外的高精度电压源很少采用这种方式。以上是个人理解

出0入0汤圆

89
发表于 2012-6-28 13:55:50 | 只看该作者
lilith 发表于 2012-6-24 22:47
这个?

楼主的这个表头有套件吗?

出0入0汤圆

90
发表于 2012-6-28 15:22:09 | 只看该作者

楼主大才!;)

出0入0汤圆

91
发表于 2012-6-29 21:25:07 | 只看该作者
弱弱问一句  精度这么高 有什么用啊?????????????

出0入0汤圆

92
发表于 2012-7-1 07:46:32 | 只看该作者
楼主威武!!!

出0入0汤圆

93
发表于 2012-7-1 08:32:52 | 只看该作者
kdtcf 发表于 2012-6-24 22:48
楼主这种用法的是开创性的,用廉价DAC完成昂贵的高精度DAC的功能,精度达到6位半,确实很厉害,也谢谢楼主 ...

这个真不是开创性的。。。。

http://www.amobbs.com/thread-5158152-1-1.html

出0入0汤圆

94
发表于 2012-7-1 10:30:43 | 只看该作者
赞楼主两次(两次两字是为了保证内容大于10字节)

出0入0汤圆

95
发表于 2012-7-1 10:41:30 | 只看该作者
Crazy_Rain 发表于 2012-7-1 08:32
这个真不是开创性的。。。。

http://www.amobbs.com/thread-5158152-1-1.html

那个帖子是PWM的传统方式,楼主这个是引入高位ADC的负反馈技术,楼主这个是低成本高精度DAC的很好解决办法

出0入0汤圆

96
发表于 2012-7-1 10:54:38 | 只看该作者
kdtcf 发表于 2012-7-1 10:41
那个帖子是PWM的传统方式,楼主这个是引入高位ADC的负反馈技术,楼主这个是低成本高精度DAC的很好解决办 ...


呵呵,你没看完那个帖子里的链接吧?

那个电路原本就是用于两个低精度DAC的合成高精度DAC的,只是当时machao老师讨论的是PWM合成,所以就把这个电路改成适合PWM的形式了(里面的图是我画的,只要把前边的两个缓冲器去掉,就是DAC模式了)

楼主的电路核心部分跟这个是一样的,只是加了个ADC用于校准误差,因此这个电路的精度取决于这个ADC,但是你要知道,好的ADC可一点也不便宜啊。。。。

出0入0汤圆

97
 楼主| 发表于 2012-7-1 11:30:55 | 只看该作者
Crazy_Rain 发表于 2012-7-1 10:54
呵呵,你没看完那个帖子里的链接吧?

那个电路原本就是用于两个低精度DAC的合成高精度DAC的,只是当时ma ...

两个 DAC 的合成属于很通俗的用法了,我用两个 DAC 来合成无非是因为 AD5791 这种 20bit DAC 很贵、非常贵,自己做一个分立器件 DAC 则也不见得便宜还体积大复杂而已,这个在我的设计中只是一个细枝末节,它是可以被随意替换的,你要替换为一个 20bit 的商品 DAC 或替换为一个自制的分立器件 DAC 都无所谓,而且是 R2R 还是 PWM 也无所谓,这不是本设计的理念,本设计的理念就是

1、一个用于校准 DAC 的数字 ADC 闭环
2、一个用于校准 ADC 的内部参考

**************** 所以你说的没错 ****************

只是加了个ADC用于校准误差,因此这个电路的精度取决于这个ADC,但是你要知道,好的ADC可一点也不便宜啊。。。。

**************** 所以你说的没错 ****************

只是,只是,但这个只是就是我的设计理念,它确实只是那样,但我能用如此低成本的设计达到如此高的指标,就是靠了这个只是啊   我的理念就是 1、用 ADC 去校准 DAC,ADC-DAC 形成闭环;2、用一个内部参考去校准 ADC,这样再通过步骤 1 实现输出电压和内部参考保持一致的比例,消去温度变化的影响,确实只是这样而已。

当然,好的 ADC 不便宜,但是好的 DAC 更不便宜,你可以看看 AD5791 和 LTC2400 的官方报价,那我这个还是太便宜了

出0入0汤圆

98
发表于 2012-7-1 11:41:21 | 只看该作者
lilith 发表于 2012-7-1 11:30
两个 DAC 的合成属于很通俗的用法了,我用两个 DAC 来合成无非是因为 AD5791 这种 20bit DAC 很贵、非常 ...

呵呵,楼主你别急~,我只是对春风的话发表一下意见而已,没有批判你的意思:)

Linear 的这个方案我个人也觉得还是很不错的,要求不是很高的话挺合适,只是如果要求高的话,成本就不见得占优势了

出0入0汤圆

99
 楼主| 发表于 2012-7-1 11:46:13 | 只看该作者
wahuahua 发表于 2012-6-27 11:00
用ADC采样后再调整DAC的输出作为高精度、高稳定度的电压源有些疑问。1 以现有的ADC芯片精度有限(要实现 ...

用ADC采样后再调整DAC的输出作为高精度、高稳定度的电压源有些疑问。1 以现有的ADC芯片精度有限(要实现全量程,难度更大,相当于做了一块高精度万用表,国产的61/2表的精度做到最好的也就0.002%还得来回漂移),2 稳定度受限,只要有调整稳定度就会受到一定的影响。要同时保证精度和稳定度必须找到一个很好的点,但这个点不大好找,所以国外的高精度电压源很少采用这种方式。以上是个人理解


*************************************************

这里有几个问题,

1、你说没有这样的电压源,其实不完全正确,比如 Fluke 5440b 什么的就在一定程度上类似,只是实现的具体方法有所差异,5440b 用一个大概 16 位这样(或者 18 位?)的 ADC 来完成差错调整,之所以用的位数不高因为它是用电桥平衡法,之所以是电桥平衡法是因为它是 Voltage Standard,而计量界承认的电压传递它只能是这个方法。但不代表这是唯一的方法,我的方法它是不被计量界承认的,因为这个方法的核心取决于不那么靠谱也没有长期数据支持的一个 ADC。

2、用一个 ADC 完成电压的传递和转移也不是我首创的,其实已经有这样做的商品仪器,尤其是万用表,比如惠普(安捷伦)3458A、爱德万 6581,都是用其内部的 ADC 完成外部 10V 校准源 - 内部 7V 参考的传递和转移的。

当然,你提出的问题都是存在的,

1、现有商品 ADC 精度有限,这个是这样的,但是现在的商品 24bit-31bit ADC,它在牺牲速度的情况下还是能获得不错的 ENOD 分辨率* 的,那么只要满足本设计需要的 1ppm ENOD 分辨率,它还是可以采用的
2、所以,我这个不是做万用表阿,有 ADC 部分的设备很多,万用表只是其中一种,一台完整的万用表需要顾及到的地方实在是太多了,另外表的基本精度指标受限于更多的条件,而我简化了这些因素不说,更重要的是我的指标是在数字闭环状态下靠对内部参考的误差调整实现的,这个国内的万用表我看了一下似乎没有采用,国外的嘛,3458、6581 什么的它们都是这样做的,所以年指标都在 8ppm 甚至更好。我的目标(是目标不是指标)是 10-25ppm,这个差不多吧(25ppm=0.0025%)。
3、稳定度问题,这个问题确实是无解的,不过可以有两个方法,一个是暂时让数字误差调整部分开环,获得短期高稳定度而牺牲温度稳定性;一个是在程序设计中考虑误差调整值较小的时候不进行调整,这些都是需要后期慢慢考虑的部分。

出0入0汤圆

100
 楼主| 发表于 2012-7-1 12:52:29 | 只看该作者
本帖最后由 lilith 于 2012-7-1 12:58 编辑
Crazy_Rain 发表于 2012-7-1 11:41
呵呵,楼主你别急~,我只是对春风的话发表一下意见而已,没有批判你的意思:)

Linear 的这个方案我个人 ...


呵呵   我的设计中我的创意思想主要在于误差调整上,其中既有用 ADC 来对 DAC 进行误差调整,又有用一个内部高稳定参考对 ADC 本身进行误差调整,这两个是相辅相成的的。当然其中任何一个思想你都能找到已经有的应用,其实这不奇怪,我们的创新总是建立在前人的创造基础上的   



*******************************************
Linear 的这个方案我个人也觉得还是很不错的,要求不是很高的话挺合适,只是如果要求高的话,成本就不见得占优势了
*******************************************


那是肯定的,所以我的定位也不高,而且也没有试图实现一台完整的商品仪器的意思,因为那不是很轻易可以完成的,就在上次我放出一个 6.5 位表头的时候也有人提到自制的万用表,我当时就说表头,距离一台成品万用表还很远



*******************************************wahuahua*******************************************
以现有的ADC芯片精度有限(要实现全量程,难度更大,相当于做了一块高精度万用表,国产的61/2表的精度做到最好的也就0.002%还得来回漂移
*******************************************wahuahua*******************************************

所以说,只是实现一个单纯的、量程都很有限的电压表头,和实现一个完成的万用表,那个是差很远的,我这里仅仅只是应用了一台万用表中极少的部分,而且量程范围都是很有限的而已,影响精度的因素少了,需要考虑的东西也就少了,所以千万不要拿去和商品仪器比阿,这只是一个业余爱好者个人捣鼓出来的,适合业余爱好者 DIY 的东西而已。

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 13:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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