一种高精度波形发生器的设计
D7846工作在双极性输出状态下。AD434为D/A提供+4.096V的参考电平,D/A根据此电平经过双极十六位线性分解,所得的最低可调电压为4.096V/215=125μV。具体的编码表如表1所列。
表1AD7846编码表
DAC锁存器中的二进制数
模拟输出VOUT/V
1111111111111111+4.096C(32767/32768)=+4.0958751000000000001000+1.096V(8/32768)=+0.0011000000000000001+4.096V(1/32768)=+0.0001251000000000000000+4.096V(0/32768)=00111111111111111-4.096V(1/32768)=-0.0001250000000000000000-4.096V(32768/32768)=-4.096
4逻辑控制及软件实现
本文使用CPLD作为DSP控制D/A映射在DSP的I/O口,地址为4000H~7FFFH。AD7846一共有4根控制线,它们组成的控制逻辑如表2所列。
表2AD7846控制逻辑真值表
CSR/WLDACCLR
功能
1XXX使DAC的I/O锁存器呈高阻态00XX数据(DB1~5DB0)装入I/O锁存器01XXI/O锁存器中的数据输出到数据线上XX01I/O锁存器中的数据装入DAC锁存器X0X0DAC锁存器装入数据000...000X1X0DAC锁存器装入数据100...000
CPLD中烧入的逻辑图如图3所示。
对于波形的产生,通常有两种方法。一种方法为使用算法计算输出波形某点的幅度编码值(如正弦波可通过泰勒级数展开得到),这种方法可直接精确地计算出每个角度的波形值,所占用的存储空间小,但对于任意波形的输出,所需的算法较为复杂,系统实时性也会受到影响。另一种方法为查表法,该方法可能需要占用较大的存储空间,但软件控制却非常方便,实时性也更高。采用查表法的软件控制可由如下代码实现。
.mmregs
.globalmain
main:nop
ori:stm#SINtable,ar2;将数据表头地址送入ar2
ld#13H,a;循环输出20个样点值
JUMP:portw*ar2+,4000h;AD4846被配置在I/O口的4000H~7FFFFH处
Rpt#1fffh;改变rpt的值可以改变正弦波的频率
Nop
Sub#1d,a
BcJUMP,aneq
bori
SINtable;正弦波幅度编码表
.word7FFFH.word0A78DH.word0CB3CH.word0EF8DH
.word0F9BCH.word0FFFFH.word0F9BCH.word0E78DH
.word0cB3CH.word0A78DH.word8000H.word5872H
.word34C3H.word1872H.word0643H.wo 《一种高精度波形发生器的设计(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/176197.html
表1AD7846编码表
DAC锁存器中的二进制数
模拟输出VOUT/V
1111111111111111+4.096C(32767/32768)=+4.0958751000000000001000+1.096V(8/32768)=+0.0011000000000000001+4.096V(1/32768)=+0.0001251000000000000000+4.096V(0/32768)=00111111111111111-4.096V(1/32768)=-0.0001250000000000000000-4.096V(32768/32768)=-4.096
4逻辑控制及软件实现
本文使用CPLD作为DSP控制D/A映射在DSP的I/O口,地址为4000H~7FFFH。AD7846一共有4根控制线,它们组成的控制逻辑如表2所列。
表2AD7846控制逻辑真值表
CSR/WLDACCLR
功能
1XXX使DAC的I/O锁存器呈高阻态00XX数据(DB1~5DB0)装入I/O锁存器01XXI/O锁存器中的数据输出到数据线上XX01I/O锁存器中的数据装入DAC锁存器X0X0DAC锁存器装入数据000...000X1X0DAC锁存器装入数据100...000
CPLD中烧入的逻辑图如图3所示。
对于波形的产生,通常有两种方法。一种方法为使用算法计算输出波形某点的幅度编码值(如正弦波可通过泰勒级数展开得到),这种方法可直接精确地计算出每个角度的波形值,所占用的存储空间小,但对于任意波形的输出,所需的算法较为复杂,系统实时性也会受到影响。另一种方法为查表法,该方法可能需要占用较大的存储空间,但软件控制却非常方便,实时性也更高。采用查表法的软件控制可由如下代码实现。
.mmregs
.globalmain
main:nop
ori:stm#SINtable,ar2;将数据表头地址送入ar2
ld#13H,a;循环输出20个样点值
JUMP:portw*ar2+,4000h;AD4846被配置在I/O口的4000H~7FFFFH处
Rpt#1fffh;改变rpt的值可以改变正弦波的频率
Nop
Sub#1d,a
BcJUMP,aneq
bori
SINtable;正弦波幅度编码表
.word7FFFH.word0A78DH.word0CB3CH.word0EF8DH
.word0F9BCH.word0FFFFH.word0F9BCH.word0E78DH
.word0cB3CH.word0A78DH.word8000H.word5872H
.word34C3H.word1872H.word0643H.wo 《一种高精度波形发生器的设计(第2页)》