基于单片机的DDS算法的实现
DDS(Direct Digital Synthesis)信号发生器是一种新的频率合成技术和信号产生的方法,在近年来逐渐取代了传统的基于LC或RC振荡电路的信号发生器,成为当前信号发生器的主流。DDS信号发生器的设计核心在于DDS算法的实现,当前主流的设计方案主要有两种:采用FPGA实现DDS算法,即通过HDL语言自行设计DDS算法,产生波形数字序列,FPGA输出驱动D/A转换器,实现信号输出;采用专用DDS芯片实现,单片机只需改写DDS芯片相关寄存器,即可输出相应频率及波形的模拟信号。然而,对于一些非主流的应用,比如对输出频率和设计要求都较低时,有没有更简单的解决方案?
本文针对频率及要求较低的应用,提出一种更为简单的解决方案,即通过单片机编程完成DDS算法,从而实现信号发生器功能。本文讨论如何采用单片机代替FPGA及DDS专用芯片,采用C语言编程完成DDS算法,从而实现单片机完成DDS信号发生器的简单设计方案。
DDS基本原理 DDS是一种从相位出发的新的频率合成技术和信号产生的方法。DDS主要由相位累加器、正弦波形存储器(ROM)、数模转换器(D/A转换)、低通滤波器、和时钟五部分组成。DDS算法包括了时钟、相位累加器、正弦查询部分,基本原理如图2所示。采用32位的相位累加器,可输出为数据范围为0~(232-1)。取相位累加器的后8位作为正弦查询表的地址。正弦表存放一个周期的正弦波数据,由于采用于8位的D/A转换器,正弦表采用采用256个点来描述一个完整的正弦波数据。
C语言实现DDS算法根据DDS算法的原理,在每个时钟脉冲fclk的作用下,累加器加1,同时,从正弦表得到一个波形数据。结合C语言的特点,采用定时中断代替时钟脉冲,每个时钟作用下的工作放在定时中断中完成。具体实现如下:(1)时钟fclk通过定时器初始化程序,设置100us的定时中断。DDS算法在中断服务子程序中完成。因此,fclk取值为10KHz。由于受STC89C52单片机运行速度的限制,定时周期不能太短,最终影响输出信号频率。如果采用运行速度更快的CPU,可通过设置更短的定时周期,即可提高输出信号频率。(2)相位累加器通过定义一个32位的寄存器,直接通过加法运算实现。每次定时中断,累加器与频率控制字相加,并将结果放入累加器中。(3)正弦查询表通过定义一个具有256个元素的一维数组,用于存放一个完整的正弦数据表。每次定时中断,用累加器的后8位作为该数组的索引,读出波形数据。
本文提出了一种基于单片机的DDS算法的实现方案,通过C语言编程完成DDS算法,从而实现信号发生器功能。该方案具有简单、低成本、易于实现的特点,对于频率及要求较低的应用具有非常重要的实际意义。