⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad9833.c

📁 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 + -