51单片机设计多功能低频函数信号发生器 应用89S52单片机和DAC0832进行低频函数信号发生器的设计。本设计能产生正弦波、锯齿波、三角波和方波。这里着重介绍正弦波和锯齿波的生成原理。 ADC0832的介绍:DAC0832是8分辨率的D/A转换集成芯片。与微处理器xx兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。 D0~D7:八位数据输入端 ILE: 数据允许锁存信号 /CS: 输入寄存器选择信号 /WR1: 输入寄存器选择信号 /XFER:数据传送信号 /WR2: DAC寄存器的写通选择信号 Vref: 基准电源输入端 Rfb: 反馈信号输入端 Iout1: 电流输出1 Iout2: 电流输出2 Vcc: 电源输入端 AGND: 模拟地 DGND: 数字地
DAC0832结构: D0~D7:8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错); ILE:数据锁存允许控制信号输入线,高电平有效; CS:片选信号输入线(选通数据锁存器),低电平有效; WR1:数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存; XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效; WR2:DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由WR1、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。 IOUT1:电流输出端1,其值随DAC寄存器的内容线性变化; IOUT2:电流输出端2,其值与IOUT1值之和为一常数; Rfb:反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度; Vcc:电源输入端,Vcc的范围为+5V~+15V; DAC0832的工作方式: 根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:直通方式、单缓冲方式和双缓冲方式。本设计选用直通方式。 DAC0832工作时序:
DAC0832内部结构图:
当ILE为1时,只有当/CS、/WR1都为0时输入寄存器才允许输入;当/WR2、/XFER也都为0时,输入寄存器里的信息才能写入DAC寄存器。根据实际电路图我们就可以得到DAC0832工作的时序的程序。如下: P37=0; //P37=CS _nop_(); //P36=WR P36=0; P0=value; ( 数据端口信号数值0~255) P36=1; _nop_(); P37=1; 硬件电路:
P0口是数据端口,接上拉电阻(其他端口则不用)。电源质量要好,质量越好的电源,芯片工作就越稳定。 从LM358运放输出的电压{zd0}峰峰值就是12V所以在二级运放的放大倍数要注意跟基准电压想匹配,否则输出信号会很容易失真。
正弦波的生成: DAC0832产生信号的原理可以说是ADC0809AD转换的逆过程,但DAC0832生成的信号是离散的。假设要生成一个Y=Asin(2*pi*f*t)的正弦波。adc0832数据端口给的数据的范围是0~255一共256个。前0~127表示是X轴上方的电压值(也可能是下方)。那么128~255是X轴下方的电压值。那么我们可以得到数据端口的数值的具体量,即value=127sin(2*pi*f*t)+127;假设我在X轴上抽样100个点(0~99),那么value=127sin(pi/50*t)+127; t:0~99.(这个100位的数组可以用MATALB生成)。也可以抽样更多的点,抽样的点越多,得到的信号越保真,但信号的频率会有所下降。抽样的点越少,失真越大,但频率能成大幅度递增。怎么选择,具体情况具体分析。其他的波形也跟正弦波一样。 程序如下: #include<reg52.h>
void Timer2_Init() void T0_service() interrupt 1
void main() 本程序需注意:按键是低电平有效。定时器2中断发送数据给DAC0832,0832在得到一个数据后生成相应的电压值。所以他的中断时间决定信号的频率,调节它的中断时间就能调节信号的频率。 其他波形的生成,其他的波形也跟正弦波一样,但锯齿波和三角波可以不用查表法,应用加减计算得到就可以得到。 下面介绍的是锯齿波: #include <at89x52.h> void DAC_0832(void) void main(void) DAC0832有着致命的一个缺点就是输出的波形里的含有的频率比较杂乱,常常出现过激的现象。如果你需要xx的信号的话,那么你必须在信号输出端就如滤波器。得到干净的低频函数信号。如果要作为信号源的话{zh0}是能就上一级攻放。效果会好很多。虽然DAC0832不是非常专业的函数信号发生芯片,但是它的输出波形的范围比较广,常常能输出一些,你意想不到得很有意思的信号曲线。 下面发几张示波器观察到得曲线:实验室里手机照的,不是太清晰但还能看。
编者注:最近比较忙很少去查看邮箱,前几天看一下邮箱结果里面有100份邮件是要函数信号发生器的。为了方便大家于是我今天又重新整理了一下,并有实际搭了一遍电路验证特一下。效果还行。但在protues 上仿真不了,得到的是一个不能预料的曲线。没查明原因,如果大家有兴趣,可以研究研究。共同探讨一番。 |