📄 ad9833.c
字号:
/*
AD9833
功能:可编程波形发生器,能够产生正弦波、三角波、方波输出。
特点:主频时钟为25MHz时,精度为0.1Hz,主频时钟为1MHz时,精度可以达到0.004Hz。
输出正弦波频率 fOUT=M(fMCLK/2^28)
M为频率控制字,由外部编程给定,其范围为0≤M≤2^28-1。
fMCLK为外部输入晶振。
FSYNC引脚是使能引脚,电平触发方式,低电平有效。进行串行数据传输时,FSYNC引脚必须置低,
要注意FSYNC有效到SCLK下降沿的建立时间t7的最小值。FSYNC置低后,在16个SCLK的下降沿数据
被送到AD9833的输入移位寄存器,在第16个SCLK的下降沿FSYNC可以被置高,但要注意在SCLK下降
沿到FSYNC上升沿的数据保持时间ts的最小和最大值。当然,也可以在FSYNC为低电平的时候,连
续加载多个16位数据,仅在最后一个数据的第16个SCLK的下降沿的时将FSYNC置高,最后需要注意
的是,写数据时SCLK时钟为高低电平脉冲信号,但是,在FSYNC刚开始变为低时(即将开始写数
据时),SCLK必须为高电平(注意t11这个参数)。
当AD9833初始化时,为了避免DAC产生虚假输出,RESET必须置为1(RESET不会复位频率、相位和
控制寄存器),直到配置完毕,需要输出时才将RESET置为0;RESET为0后的8-9个MCLK时钟周期
可在DAC的输出端观察到波形。
AD9833数据传输格式:
对于单个16位数据来说,高位在前,低位在后。
对于频率寄存器和相位寄存器来说,先是控制字,再是数据低字节,最后是数据高字节。
*/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include "AD9833.h"
#include "main.h"
/*-----------------------------------------------------------------------
delay_nus :长延时函数(GCC内部延时函数的延时过短)
输入参数: t :延时时间 us
-----------------------------------------------------------------------*/
void delay_nus(unsigned int t)
{
while (t--)
_delay_us(1);
}
/*-----------------------------------------------------------------------
delay_nms :长延时函数(GCC内部延时函数的延时过短)
输入参数: t :延时时间 ms
-----------------------------------------------------------------------*/
void delay_nms(unsigned int t)
{
while (t--)
_delay_ms(1);
}
//-----------------------------------------------------------------------
//Write_word : 写16位数据到SPI接口,软件SPI方式
//
//输入参数: data: 数据(16位)
//-----------------------------------------------------------------------
void Write_word(unsigned int data)
{
unsigned char i;
SCL_H;
SDA_H;
FSYNC_H;
delay_nus(200);
FSYNC_L;
for(i=0;i<16;i++)
{
if(data&0x8000) SDA_H;
else SDA_L;
SCL_L;
delay_nus(5);
SCL_H;
data=data<<1;
}
delay_nus(2);
FSYNC_H;
SCL_L;
delay_nus(200);
}
void init_ad9833(void)
{
Write_word(0x2100); //28位连续,选择频率0,相位0,RESET=1
Write_word(0x4000); //写频率0寄存器的低字节LSB
Write_word(0x4000); //写频率0寄存器的高字节MSB
Write_word(0x2900); //28位连续,选择频率0,相位0,RESET=1
Write_word(0x8000); //写频率0寄存器的低字节LSB
Write_word(0x8000); //写频率0寄存器的高字节MSB
Write_word(0xC000); //写频率0寄存器的低字节LSB
Write_word(0xF000); //写频率0寄存器的高字节MSB
Write_word(0x2000); //28位连续,选择频率0,相位0,RESET=0
}
//------------------------------------------------------------------
//output :AD9833输出指定频率的正弦波
//
//输入参数:freq_value 类型:unsigned long
//输出参数:无
//------------------------------------------------------------------
void output(unsigned long freq_value)
{
unsigned long dds;
unsigned int dds_l,dds_h;
dds= freq_value *268.435456; //268435456/ FMCLK
dds=dds<<2;
dds_l=dds; //低字节
dds_h=dds>>16; //高字节
dds_l=dds_l>>2;
dds_l=dds_l & 0x7FFF;
dds_l=dds_l | 0x4000;
dds_h=dds_h & 0x7FFF;
dds_h=dds_h | 0x4000;
Write_word(0x2000); //28位连续,选择频率0,相位0,RESET=0
Write_word(dds_l);
Write_word(dds_h);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -