本文主要介绍如何使用ATmega328p控制器、DDS函数发生器IC、运算放大器、几个无源器件以及一些艰苦的工作来制作属于自己的任意波形发生器。
如果家里能拥有属于自己的电子实验室,那会是非常棒的 - 唯一的缺点就是即使是基础设备也可能会是非常昂贵的。自己制作设备不仅可以省钱,还是提高知识的一个很好的方式。因此,在本文中,我将介绍如何制作属于您自己的函数生成器。
什么是函数发生器? 首先,函数发生器(也称为乐音发生器)是能够以设定频率输出特定波形的电子设备。例如,可以产生60Hz的正弦信号。您可以使用它来测试音频放大器的内部工作情况,找出运算放大器和二极管的特性,制造噪音 - 以及一些其他的应用。
DDS函数发生器是一个数字任意波形发生器,这意味着它使用数模转换器(DAC)来产生一个信号。它还具有只读存储器(ROM),根据采样频率(Fs),以不同时间间隔存储特定波形的幅度值。
假设我们有一个8位DAC的DDS信号发生器,它以100Hz的采样频率输出800Hz的正弦信号。因为Fs是正弦波频率的8倍,所以工程师或更可能的是计算机需要从实际的正弦波中提取8个幅度值,从t = 0到t =2π。这个幅度间隔是[0,255](二进制中的1111 1111 = 255),其对应于具有实际正弦波的区间[-1,1]。由于图片胜过千言万语,下面是真实正弦波与我们的虚拟(和低性能)DDS函数发生器输出的图片之间的比较。
自制设备 本文的目标是建立一个可靠的函数发生器,频率可高达1MHz,幅度高达9V,并允许您选择正弦波、三角波和时钟(即具有50%占空比的矩形)信号。为了帮助您理解为什么选择使用的组件,它们如何协同工作以及如何编写固件,我将把本文分成两大块,即硬件和软件。
硬件 这个设备的硬件方面有两个主要部分:电源和包含函数发生器IC和微控制器的主板PCB。
电源 主PCB需要两个电压:+ 12V和-12V。信号的最终放大需要对称的电源。通过调节+ 12V一个直接在主PCB上创建一条较小的+ 5V电源轨;需要给单片机、AD9833、函数发生器IC、最后是24MHz的晶体振荡器供电。以下您可以找到电源板的原理图:
为了获得这些电压,将使用一个变压器,从230V或110V(取决于你所在的地区)到两个12V的交流线路(在变压器上通常会写12V-0V-12V的线路)。 200mA的输出电流已经足够了。
请记住,变压器的输出是交流电,我们需要直流电。为此,我们将使用一个简单的整流桥。这将改变正弦信号。这些通常作为独立元件来使用,但也可以使用四个通用二极管,如1N4001。
我们不会在标准配置中使用它,因为我们需要一个对称的输出,所以我们将按照上面的原理图连接它们:变压器的两端连接到整流器,中心抽头连接到地。为了平滑输出,我们将首先使用两个大电容,每个1000μF额定电压为35V。以下您可以在各个阶段找到电源轨的输出波形:
此外,为了消除纹波,使用两个电压调节器,典型的LM7812及其兄弟LM7912,它用于负电压。最后,我们在每个稳压器IC输出端加一个100μF电容器和一个100nF电容器,两者的额定电压都是25V。我们希望此电源尽可能平滑,因为我们将使用它们来抵消我们的最终输出电压,并且任何AC分量都将传播到输出。
AD9833电路板 让我们来看一看主板PCB。 LM1117-5V线性稳压器用于从+ 12V电源产生+ 5V电源。为了使得输出平滑,我们在电压输入线(+ 12V和-12V)和稳压器的输出端加上电容。
在原理图的左侧,您会看到一个ATMega328p-AU微控制器,与Arduino Uno中使用的相同,但采用SMD封装。为了对MCU进行编程,在它旁边放置一个称为AVR-ISP的6针连接器。它有两个电源引脚(+ 5V和GND)和另外四个通信引脚:MISO、MOSI、CLK和RESET。
我们只使用一个用户输入组件:一个带集成开关的旋转编码器。这将是我们的控制元素来设置频率、信号类型和其他设置。来自旋转编码器的信号被连接到微控制器PD2和PD3(Uno上的D2和D3)上的两个中断引脚,并且开关转到可用作输入的可用引脚;我选择了PD1(Uno上的D1)。我们不会添加任何上拉电阻,因为我们将使用集成在微控制器中的那些电阻。由于机械触点并不完美,所以当我们旋转编码器而不是一个理想的脉冲时,会出现一个抖动信号,但是这个可以通过软件或硬件使用一个电容来很容易的修复。对于集成开关,我们将使用软件方法,对于旋转触点,将使用两个100nF电容器。
普通的绿色LED连接到引脚PD7(Uno上的D7),用于调试目的或显示状态。使用的显示器是一个带有HD44780控制器的简单LCD,它具有16行和2列的背光。为了减少连接线的数量,使用了一个适配器板,以便控制LCD的唯一引脚为2,用于I2C上的数据,另外2个用于电源(+ 5V和GND)。微控制器上的I2C线路用于SDA引脚PC4和SCL引脚PC5。在Arduino Uno上,分别命名为A4和A5。
最后,在微控制器与AD9833集成电路之间建立最后一个连接。它使用单向SPI总线,这意味着数据只能从MCU向IC流动。信号是MOSI(主出从入),CLK(时钟)和CS(片选),在AD9833上称为FSYNC。为了总结微控制器部分,我应该提到,每个电源引脚都需要100nF的去耦电容。
在继续原理图的最后一部分之前,先介绍带有函数发生器IC的部分,让我指出AD9833的几个关键特性。虽然我会听起来像一个销售人员,让我们开始吧。这是一个DDS型可编程波形发生器,所以它需要一个最高频率为25MHz(对于这个特定的IC)的时钟信号,然后根据微控制器(最大228)通过SPI总线传递的值进行分频,使用10位DAC输出由微控制器选择的波形。输出的峰峰值为0.65V-0.038V(VOUT最大值 - VOUT最小值),偏移量为(0.65V-0.038V)/ 2。这意味着VOUT最小值非常接近0V。一个重要的注意事项是时钟输出(矩形信号)的幅度为2.5V,这是设备内部稳压器产生的电压。
现在我们已经弄清楚了,让我们看看原理图的最后一部分。晶振用于向AD9833的主时钟输入提供24MHz的时钟信号。 FSYNC,SCLK和SDATA连接到微控制器的SPI总线。在VDD引脚附近使用两个去耦电容,一个值为0.1μF,另一个值为10μF。 2.5V内部电压调节器需要另一个去耦电容;这在引脚CAP附近并且具有0.1μF的值。 COMP和VDD引脚之间需要另外一个电容来解耦DAC偏置电压;它的值为10nF,如数据表所示。
当我谈到微控制器连接时,我还写了Arduino Uno引脚等价物。我这样做是因为上一段中描述的AD9833电路可以在中国的各个制造商处作为可以连接到Arduino Uno的分线板使用。请记住,输出是直接从IC,没有额外的电路,我会继续在下面解释。
IC的输出通过1.3kΩ电阻馈入运算放大器的同相输入端。其侧引脚连接到-12V和+ 12V的微调器POT1(可变电阻器)具有连接到开关输入端的扫频器以提供偏移电压。 SPDT开关的另一个输入端直接接地,输出端通过另一个1.3kΩ电阻连接到运算放大器的同相输入端。这个配置与一个50kΩ电位器相结合,可以使我们获得1到20之间的可变增益。这是使用Millman定理和运算放大器将输入V +和V-保持在相同电压的事实计算得到的:
请记住,增益也适用于偏移电压。我这样做有三种配置: 1. 使用微调器POT1将失调电压设定为-350mV。当开关处于位置3(R4接地)时,输出电压是IC的输出,一个幅度为350mV,偏移量为350mV的信号乘以电位器POT2设置的增益。当开关处于位置1(R4连接到由调整器POT1获得的偏移电压)时,输出正如之前减去偏移电压,本质上是具有350mV振幅且没有偏移的信号乘以增益。 采用这种配置,输出电压可以从-7V到+ 7V或从0V摆动到运算放大器的能力(接近+ 12V)。 2. 偏移电压设置为AD9833的VOUT最小值。然后乘以1到20之间的增益。 3. 您可以使用电位计代替微调电位器POT1,并将其安装在前面板上,这样就可以获得一个可变偏移。只要记住偏移量也受增益影响,所以首先设置增益,选择所需的峰峰值电压是明智的,然后使用偏移电位器调整信号的垂直位置。我不推荐这个设置;如果你需要可变偏移,我建议你增加一个单独的运算放大器作为一个固定增益为2的求和放大器,如下图所示
为了将电路的放大部分封装起来,我不得不提到,正负电源需要100nF去耦电容,而且您需要选择一个能够承受电源电压的运算放大器( + 12V和-12V),并具有非常好的压摆率,以便能够跟上高放大信号。
理想情况下,该电路应该建立在专门为此应用而设计的PCB上,而不是在原型电路板上。我将通过下面的文件为您提供KiCad中已经设计的PCB。但是,如果你想自己做,请记住这些事情: ● 将所有集成电路的去耦电容尽可能靠近电源引脚。 ● 尝试使用地平面(如果只使用两层,使底层主要由地面组成)。 ● 将电路的模拟部分(AD9833的输出端、放大电路和输出BNC连接器)与数字部分(AD9833的单片机和通信端)分开。您可以将接地层分割到AD9833的正下方。由于IC具有两个独立的模拟和数字接地引脚,因此可以轻松完成。 ● 正如AD9833的数据表所示,避免在AD9833下运行数字走线。
现在我们已经完成了构建电路的工作,接下来开始进行编程。 |