很多时候我们需要输出某种函数信号,如方波、三角波、正弦波等,但想要获得这样的函数信号,不论是硬件电路还是软件实现,却并不是一件简单的事情。不过AD9833这类函数生成芯片可以简化这方面的操作,这一节我们就来设计并实现AD9833的驱动。
1、功能概述
各种类型的检测、信号激励和时域反射(TDR)应用都需要波形发生器。而AD9833就是一款低功耗、可编程波形发生器,能够产生正弦波、三角波和方波输出。
1.1、硬件配置及功能描述
AD9833无需额外的外部元件就能够产生正弦波、三角波和方波输出。输出频率和相位可通过软件进行编程,调整简单。AD9833通过一个三线式串行接口写入数据。该串行接口能够以最高40 MHz的时钟速率工作,并且与DSP和微控制器标准兼容。该器件采用2.3 V至5.5 V电源供电。

1.2、内部寄存器
AD9833包含一个16位控制寄存器,让用户可以配置AD9833的操作。mode位之外的所有控制位均在MCLK的内部下降沿采样。

控制寄存器各位的含义如下:

AD9833包含两个频率寄存器和两个相位寄存器,频率寄存器为28位:时钟速率为25 MHz时,可以实现0.1 Hz的分辨率;而时钟速率为1 MHz时,则可以实现0.004 Hz的分辨率。

每次写数据时,都是从写控制寄存器器开始,每次写的16为数据的高两位用以决定所写的寄存器。

如上图所示,写不同寄存器时高两位需根据寄存器的不同设定不同的值。
2、驱动设计与实现
我们已经了解了AD9833的基本情况。接下来我们就据此实现AD9833波形发生器驱动的设计及实现。
2.1、对象定义
AD9833波形发生器的驱动依然采用基于对象的操作,所以我们需要先得到AD9833波形发生器的对象。
2.1.1、抽象对象类型
一个对象最起码包含属性和操作两方面内容,我们先来分析一下AD9833波形发生器对象需要包含哪些属性和操作。
对于AD9833波形发生器来说,控制寄存器的状态决定了下一步的操作,所以我们将控制寄存器的状态抽象为对象的属性,以便随时掌握操作的目标。此外,作为函数发生器,输出的信号具有周期性,在输出频率固定的情况下,计算有一个常数,我们将其作为属性已确认输出型号的频率。
进而我们考虑AD9833波形发生器对象的操作。首先我们要操作AD9833波形发生器则需要向其传送数据,所以我们将向AD9833波形发生器写数据作为对象的一个操作。AD9833波形发生器采用SPI通讯接口,有时需要在软件中对片选信号进行操作,所以我们将片选型号的操作作为对象的另一个操作。在一些情况下,有些针对对象的活动需要延时进行,而在不同的平台中采取的延时方式不尽相同,为了操作方便我们将延时操作作为对象的一个操作。
据以上的分析我们可以抽象AD9833波形发生器的对象类型如下:
/* 定义AD9833对象类型 */
typedef struct Ad9833Object{
uint16_t ctlRegister; //控制寄存器
float freqConstant; //频率计算常数
void (*WriteData)(uint8_t *tData,uint16_t tSize); //向DAC发送数据
void (*ChipSelcet)(AD9833CSType en); //片选信号
void (*Delayms)(volatile uint32_t nTime); //ms延时操作指针
}Ad9833ObjectType;
2.1.2、对象初始化
我们虽然得到了AD9833的对象,但对象不能直接使用,我们需要对其进行初始化方能使用。所以接下来我们考虑AD9833波形发生器对象的初始化函数。
初始化函数至少包含有2方面内容:一是为对象变量赋必要的初值;二是检查这些初值是否是有效的。特别是一些操作指针错误的话可能产生严重的后果。基于这一原则,我们设计AD9833波形发生器的对象初始化函数如下:
/* 初始化AD9833对象 */
void AD9833Initialization(Ad9833ObjectType *dev,
&nbs

本文详细介绍了AD9833波形发生器的驱动设计与实现过程,包括对象定义、初始化、操作及应用。通过具体代码示例展示了如何生成正弦波、三角波和方波。
最低0.47元/天 解锁文章
1285

被折叠的 条评论
为什么被折叠?



