外设驱动库开发笔记4:AD9833函数发生器驱动

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

很多时候我们需要输出某种函数信号,如方波、三角波、正弦波等,但想要获得这样的函数信号,不论是硬件电路还是软件实现,却并不是一件简单的事情。不过AD9833这类函数生成芯片可以简化这方面的操作,这一节我们就来设计并实现AD9833的驱动。

1、功能概述

各种类型的检测、信号激励和时域反射(TDR)应用都需要波形发生器。而AD9833就是一款低功耗、可编程波形发生器,能够产生正弦波、三角波和方波输出。

1.1、硬件配置及功能描述

AD9833无需额外的外部元件就能够产生正弦波、三角波和方波输出。输出频率和相位可通过软件进行编程,调整简单。AD9833通过一个三线式串行接口写入数据。该串行接口能够以最高40 MHz的时钟速率工作,并且与DSP和微控制器标准兼容。该器件采用2.3 V5.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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值