IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> stm32F407hal+AD9854dds配置+源程序 -> 正文阅读

[嵌入式]stm32F407hal+AD9854dds配置+源程序

经过两天的摸索,一个纯小白的成功配置过程。

在淘宝上买的AD9854dds四通道正弦波模块,卖家只提供了STM32F103的库函数历程,本博客实现了hal的移植并在f407上实现。

?

?第一步:打开cube mx,时钟配置及下载方式配置。

第二步:打开所有需要的GPIO口,全部初始设为上拉,推挽输出,速度设为高。

连线如图所示进行连接,线比较多请耐心连接。

?

?第三步配置好时钟。

?第四步:配置好输出文件,点击右上角生成即可。

?开始进入keil程序

keil中添加AD9854.c文件

#include <AD9854.h>      //STC单片机头文件	
#include "stm32f407xx.h"
//#include "delay.h"




unsigned char FreqWord[6];				 //6个字节频率控制字

//**********************以下为系统时钟以及其相关变量设置**************************

/* 
      此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个   
      CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ
      Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型
*/

/*
#define      CLK_Set            4
const ulong  Freq_mult_ulong  = 3518437;
const double Freq_mult_doulle = 3518437.2088832;
*/

/*
#define      CLK_Set            5
const ulong  Freq_mult_ulong  = 2814750;
const double Freq_mult_doulle = 2814749.76710656;
*/

 /*
#define      CLK_Set            6
const ulong  Freq_mult_ulong  = 2345625;
const double Freq_mult_doulle = 2345624.80592213;
 */ 

/*
#define      CLK_Set            7
const ulong  Freq_mult_ulong  = 2010536;
const double Freq_mult_doulle = 2010535.54793326;
*/

/*
#define      CLK_Set            8
const ulong  Freq_mult_ulong  = 1759219;
const double Freq_mult_doulle = 1759218.6044416;
*/

/*
#define      CLK_Set            9
const ulong  Freq_mult_ulong  = 1563750;
const double Freq_mult_doulle = 1563749.87061476;
*/

/*
#define      CLK_Set            10
const ulong  Freq_mult_ulong  = 1407375;
const double Freq_mult_doulle = 1407374.88355328;
*/

/*
#define      CLK_Set            11
const ulong  Freq_mult_ulong  = 1279432;
const double Freq_mult_doulle = 1279431.712321164;
*/

/*
#define      CLK_Set            12
const ulong  Freq_mult_ulong  = 1172812;
const double Freq_mult_doulle = 1172812.402961067;
*/

/*
#define      CLK_Set            13
const ulong  Freq_mult_ulong  = 1082596;
const double Freq_mult_doulle = 1082596.064271754;
*/

/*
#define      CLK_Set            14
const ulong  Freq_mult_ulong  = 1005268;
const double Freq_mult_doulle = 1005267.773966629;
*/


#define      CLK_Set            15
const ulong  Freq_mult_ulong  = 938250;
const double Freq_mult_doulle = 938249.9223688533;

 
//**************************修改硬件时要修改的部分********************************



//**************************以下部分为函数定义********************************

static void AD9854_WR_Byte(uint32_t addr,uint32_t dat);
extern void AD9854_Init(void);						  
static void Freq_convert(long Freq);	         	  
extern void AD9854_SetSine(ulong Freq,uint Shape);	  
static void Freq_double_convert(double Freq);		  
extern void AD9854_SetSine_double(double Freq,uint Shape);
extern void AD9854_InitFSK(void);				
extern void AD9854_SetFSK(ulong Freq1,ulong Freq2);					  
extern void AD9854_InitBPSK(void);					  
extern void AD9854_SetBPSK(uint Phase1,uint Phase2);					
extern void AD9854_InitOSK(void);					 
extern void AD9854_SetOSK(uchar RateShape);					  
extern void AD9854_InitAM(void);					 
extern void AD9854_SetAM(uint Shape);					
extern void AD9854_InitRFSK(void);					 
extern void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate);				

//void AD9854_IO_Init(void)
//{
//    GPIO_InitTypeDef GPIO_InitStructure ; 
//	
//	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);	 //使能PB,PE端口时钟

//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
//    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; 
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; 
//    GPIO_Init(GPIOB ,&GPIO_InitStructure) ; 
//	
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_8| GPIO_Pin_2; 
//	GPIO_Init(GPIOA ,&GPIO_InitStructure) ;
//	
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All^(GPIO_Pin_14| GPIO_Pin_15); 
//	GPIO_Init(GPIOC ,&GPIO_InitStructure) ;

//}

//====================================================================================
//函数名称:void AD9854_WR_Byte(uchar addr,uchar dat)
//函数功能:AD9854并行口写入数据
//入口参数:addr     6位地址
//         dat      写入的数据
//出口参数:无
//====================================================================================
	uint32_t dat1,dat2;

void AD9854_WR_Byte(uint32_t addr,uint32_t dat)
{
	dat1= dat|(addr<<8);
	
	AD9854_AdrBus=(dat1&0x3fff)|((dat1^0x3fff)<<16);
	
//	AD9854_AdrBus  = ((addr&0x3f)<<8) | ((addr^0x3f)<<(16+8));
//	AD9854_DataBus = dat|(dat^0xff)<<16;
//	dat1  = ((addr&0x3f)<<8) | ((addr^0x3f)<<(16+8));
//	dat2 = (dat1&0x3fff)|((dat1^0x3fff)<<16);
	AD9854_WR      = 0;
	AD9854_WR      = 1;
}

//====================================================================================
//函数名称:void AD9854_Init(void)
//函数功能:AD9854初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_Init(void)
{
	
	AD9854_WR=1;//将读、写控制端口设为无效
    AD9854_RD=1;
    AD9854_UDCLK=0;
    AD9854_RST=1;                 //复位AD9854
    AD9854_RST=0;

	AD9854_WR_Byte(0x1d,0x00);	           //关闭比较器
	AD9854_WR_Byte(0x1e,CLK_Set);	   //设置系统时钟倍频            
	AD9854_WR_Byte(0x1f,0x00);	   //设置系统为模式0,由外部更新
	AD9854_WR_Byte(0x20,0x60);	   //设置为可调节幅度,取消插值补偿

	AD9854_UDCLK=1;               //更新AD9854输出
    AD9854_UDCLK=0;
}
//====================================================================================
//函数名称:void Freq_convert(long Freq)
//函数功能:正弦信号频率数据转换
//入口参数:Freq   需要转换的频率,取值从0~SYSCLK/2
//出口参数:无   但是影响全局变量FreqWord[6]的值
//说明:   该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK
//         得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK
//         为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
//====================================================================================
void Freq_convert(long Freq)   
{
    ulong FreqBuf;
    ulong Temp=Freq_mult_ulong;   	       

	uchar Array_Freq[4];			     //将输入频率因子分为四个字节
	Array_Freq[0]=(uchar)Freq;
	Array_Freq[1]=(uchar)(Freq>>8);
	Array_Freq[2]=(uchar)(Freq>>16);
	Array_Freq[3]=(uchar)(Freq>>24);

	FreqBuf=Temp*Array_Freq[0];                  
    FreqWord[0]=FreqBuf;    
    FreqBuf>>=8;

    FreqBuf+=(Temp*Array_Freq[1]);
    FreqWord[1]=FreqBuf;
    FreqBuf>>=8;

    FreqBuf+=(Temp*Array_Freq[2]);
    FreqWord[2]=FreqBuf;
    FreqBuf>>=8;

	FreqBuf+=(Temp*Array_Freq[3]);
    FreqWord[3]=FreqBuf;
    FreqBuf>>=8;

    FreqWord[4]=FreqBuf;
    FreqWord[5]=FreqBuf>>8;			
}  

//====================================================================================
//函数名称:void AD9854_SetSine(ulong Freq,uint Shape)
//函数功能:AD9854正弦波产生程序
//入口参数:Freq   频率设置,取值范围为0~(1/2)*SYSCLK
//         Shape  幅度设置. 为12 Bit,取值范围为(0~4095) ,取值越大,幅度越大 
//出口参数:无
//====================================================================================
void AD9854_SetSine(ulong Freq,uint Shape)
{
	uchar count;
	uchar Adress;

	Adress = 0x04;                        //选择频率控制字地址的初值

	Freq_convert(Freq);		           //频率转换

	for(count=6;count>0;)	          //写入6字节的频率控制字  
    {
		AD9854_WR_Byte(Adress++,FreqWord[--count]);
    }
	
	AD9854_WR_Byte(0x21,Shape>>8);	  //设置I通道幅度
	AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
	
	AD9854_WR_Byte(0x23,Shape>>8);	  //设置Q通道幅度
	AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

	AD9854_UDCLK=1;                    //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void Freq_doublt_convert(double Freq)
//函数功能:正弦信号频率数据转换
//入口参数:Freq   需要转换的频率,取值从0~SYSCLK/2
//出口参数:无   但是影响全局变量FreqWord[6]的值
//说明:   有公式FTW = (Desired Output Frequency × 2N)/SYSCLK得到该函数,
//         其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK
//         为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
//注意:   该函数与上面函数的区别为该函数的入口参数为double,可使信号的频率更精确
//         建议在100HZ以下用本函数,在高于100HZ的情况下用函数void Freq_convert(long Freq)
//====================================================================================
void Freq_double_convert(double Freq)   
{
	ulong Low32;
	uint  High16;
    double Temp=Freq_mult_doulle;   	            //23ca99为2的48次方除以120M
	Freq*=(double)(Temp);
//	1 0000 0000 0000 0000 0000 0000 0000 0000 = 4294967295
	High16 =(int)(Freq/4294967295);                  //2^32 = 4294967295
	Freq -= (double)High16*4294967295;
	Low32 = (ulong)Freq;

    FreqWord[0]=Low32;	     
    FreqWord[1]=Low32>>8;
    FreqWord[2]=Low32>>16;
    FreqWord[3]=Low32>>24;
    FreqWord[4]=High16;
    FreqWord[5]=High16>>8;			
} 
//====================================================================================
//函数名称:void AD9854_SetSine_double(double Freq,uint Shape)
//函数功能:AD9854正弦波产生程序
//入口参数:Freq   频率设置,取值范围为0~1/2*SYSCLK
//         Shape  幅度设置. 为12 Bit,取值范围为(0~4095) 
//出口参数:无
//====================================================================================
void AD9854_SetSine_double(double Freq,uint Shape)
{
	uchar count=0;
	uchar Adress;

	Adress=0x04;						     //选择频率控制字1地址的初值

	Freq_double_convert(Freq);		           //频率转换
	 
	for(count=6;count>0;)	                    //写入6字节的频率控制字  
    {
		AD9854_WR_Byte(Adress++,FreqWord[--count]);
    }
	
	AD9854_WR_Byte(0x21,Shape>>8);	  //设置I通道幅度
	AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
	
	AD9854_WR_Byte(0x23,Shape>>8);	  //设置Q通道幅度
	AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

	AD9854_UDCLK=1;                    //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_InitFSK(void)
//函数功能:AD9854的FSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitFSK(void)
{
	AD9854_WR=1;                        //将读、写控制端口设为无效
    AD9854_RD=1;
    AD9854_UDCLK=0;
    AD9854_RST=1;                        //复位AD9854
    AD9854_RST=0;	

	AD9854_WR_Byte(0x1d,0x00);	       //关闭比较器
	AD9854_WR_Byte(0x1e,CLK_Set);	   //设置系统时钟倍频
	AD9854_WR_Byte(0x1f,0x02);	       //设置系统为模式1,由外部更新
	AD9854_WR_Byte(0x20,0x60);	      //设置为可调节幅度,取消插值补偿

	AD9854_UDCLK=1;                  //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_SetFSK(ulong Freq1,ulong Freq2)
//函数功能:AD9854的FSK设置
//入口参数:Freq1   FSK频率1
//         Freq2   FSK频率2
//出口参数:无
//====================================================================================
void AD9854_SetFSK(ulong Freq1,ulong Freq2)
{
    uchar count=6;
	uchar Adress1,Adress2;

	const uint Shape=4000;	      //幅度设置. 为12 Bit,取值范围为(0~4095)
	
	Adress1=0x04;				 //选择频率控制字1地址的初值
	Adress2=0x0a;				 //选择频率控制字2地址的初值
	
	Freq_convert(Freq1);               //频率转换1
	
	for(count=6;count>0;)	          //写入6字节的频率控制字  
    {
		AD9854_WR_Byte(Adress1++,FreqWord[--count]);
    }
	
	Freq_convert(Freq2);               //频率转换2

	for(count=6;count>0;)	          //写入6字节的频率控制字  
    {
		AD9854_WR_Byte(Adress2++,FreqWord[--count]);
    }

	AD9854_WR_Byte(0x21,Shape>>8);	      //设置I通道幅度
	AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
	
	AD9854_WR_Byte(0x23,Shape>>8);	     //设置Q通道幅度
	AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

	AD9854_UDCLK=1;                    //更新AD9854输出
    AD9854_UDCLK=0;		
}

//====================================================================================
//函数名称:void AD9854_InitBPSK(void)
//函数功能:AD9854的BPSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitBPSK(void)
{
	AD9854_WR=1;                    //将读、写控制端口设为无效
    AD9854_RD=1;
    AD9854_UDCLK=0;
    AD9854_RST=1;                   //复位AD9854
    AD9854_RST=0;

	AD9854_WR_Byte(0x1d,0x00);	       //打开比较器,输出方波
	AD9854_WR_Byte(0x1e,CLK_Set);	   //设置系统时钟倍频
	AD9854_WR_Byte(0x1f,0x08);	      //设置系统为模式4,由外部更新
	AD9854_WR_Byte(0x20,0x60);	      //设置为可调节幅度,取消插值补偿

	AD9854_UDCLK=1;                //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_SetBPSK(uint Phase1,uint Phase2)
//函数功能:AD9854的BPSK设置
//入口参数:Phase1   调制相位1
//         Phase2	调制相位2
//出口参数:无
//说明:   相位为14Bit,取值从0~16383,建议在用本函数的时候将Phase1设置为0,
//         将Phase1设置为8192,180°相位
//====================================================================================
void AD9854_SetBPSK(uint Phase1,uint Phase2)
{
	uchar count;

	const ulong Freq=60000;
    const uint Shape=4000;

	uchar Adress;
	Adress=0x04;                           //选择频率控制字1地址的初值

	AD9854_WR_Byte(0x00,Phase1>>8);	           //设置相位1
	AD9854_WR_Byte(0x01,(uchar)(Phase1&0xff));
	
	AD9854_WR_Byte(0x02,Phase2>>8);	          //设置相位2
	AD9854_WR_Byte(0x03,(uchar)(Phase2&0xff));

	Freq_convert(Freq);                            //频率转换

	for(count=6;count>0;)	                         //写入6字节的频率控制字  
    {
		AD9854_WR_Byte(Adress++,FreqWord[--count]);
    }

	AD9854_WR_Byte(0x21,Shape>>8);	                  //设置I通道幅度
	AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
	
	AD9854_WR_Byte(0x23,Shape>>8);	               //设置Q通道幅度
	AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

	AD9854_UDCLK=1;                                //更新AD9854输出
    AD9854_UDCLK=0;	
}

//====================================================================================
//函数名称:void AD9854_InitOSK(void)
//函数功能:AD9854的OSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitOSK(void)
{
	AD9854_WR=1;                           //将读、写控制端口设为无效
	AD9854_RD=1;
	AD9854_UDCLK=0;
	AD9854_RST=1;                          //复位AD9854
	AD9854_RST=0;

    AD9854_WR_Byte(0x1d,0x00);	           //关闭比较器
	AD9854_WR_Byte(0x1e,CLK_Set);	       //设置系统时钟倍频
	AD9854_WR_Byte(0x1f,0x00);	           //设置系统为模式0,由外部更新
	AD9854_WR_Byte(0x20,0x70);	           //设置为可调节幅度,取消插值补偿,通断整形内部控制

	AD9854_UDCLK=1;                        //更新AD9854输出
	AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_SetOSK(uchar RateShape)
//函数功能:AD9854的OSK设置
//入口参数: RateShape    OSK斜率,取值为4~255,小于4则无效
//出口参数:无
//====================================================================================
void AD9854_SetOSK(uchar RateShape)
{
	uchar count;

	const ulong Freq=60000;			 //设置载频
  const uint  Shape=4000;			//幅度设置. 为12 Bit,取值范围为(0~4095)

	uchar Adress;
	Adress=0x04;               //选择频率控制字地址的初值

	Freq_convert(Freq);                       //频率转换

	for(count=6;count>0;)	                         //写入6字节的频率控制字  
    {
		AD9854_WR_Byte(Adress++,FreqWord[--count]);
    }

	AD9854_WR_Byte(0x21,Shape>>8);	                  //设置I通道幅度
	AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
	
	AD9854_WR_Byte(0x23,Shape>>8);	                  //设置Q通道幅度
	AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));  	 


    AD9854_WR_Byte(0x25,RateShape);				       //设置OSK斜率

	AD9854_UDCLK=1;                                //更新AD9854输出
    AD9854_UDCLK=0;	
}

//====================================================================================
//函数名称:void AD9854_InitAM(void)
//函数功能:AD9854的AM初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitAM(void)
{
	uchar count;

	const ulong Freq=60000;			 //设置载频

	uchar  Adress;
	Adress=0x04;      //选择频率控制字地址的初值
	
    AD9854_WR=1;    //将读、写控制端口设为无效
    AD9854_RD=1;
    AD9854_UDCLK=0;
    AD9854_RST=1;     //复位AD9854
    AD9854_RST=0;

	AD9854_WR_Byte(0x1d,0x00);	                  //关闭比较器
	AD9854_WR_Byte(0x1e,CLK_Set);	             //设置系统时钟倍频
	AD9854_WR_Byte(0x1f,0x00);	                 //设置系统为模式0,由外部更新
	AD9854_WR_Byte(0x20,0x60);	                  //设置为可调节幅度,取消插值补偿

	Freq_convert(Freq);                            //频率转换

	for(count=6;count>0;)	                         //写入6字节的频率控制字  
    {
		AD9854_WR_Byte(Adress++,FreqWord[--count]);
    }

	AD9854_UDCLK=1;                             //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_SetAM(uchar Shape)
//函数功能:AD9854的AM设置
//入口参数:Shape   12Bit幅度,取值从0~4095   
//出口参数:无
//====================================================================================
void AD9854_SetAM(uint Shape)
{
	AD9854_WR_Byte(0x21,Shape>>8);	                  //设置I通道幅度
	AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
	
	AD9854_WR_Byte(0x23,Shape>>8);	                  //设置Q通道幅度
	AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

	AD9854_UDCLK=1;                                   //更新AD9854输出
    AD9854_UDCLK=0;			
}

//====================================================================================
//函数名称:void AD9854_InitRFSK(void)
//函数功能:AD9854的RFSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitRFSK(void)
{
	AD9854_WR=1;                      //将读、写控制端口设为无效
    AD9854_RD=1;
    AD9854_UDCLK=0;
    AD9854_RST=1;                     //复位AD9854
    AD9854_RST=0;
	
	AD9854_WR_Byte(0x1d,0x00);	       //关闭比较器
	AD9854_WR_Byte(0x1e,CLK_Set);	   //设置系统时钟倍频
	AD9854_WR_Byte(0x1f,0x24);	        //设置系统为模式2,由外部更新,使能三角波扫频功能
	AD9854_WR_Byte(0x20,0x60);	        //设置为可调节幅度,取消插值补偿	

	AD9854_UDCLK=1;                   //更新AD9854输出
    AD9854_UDCLK=0;
}

//====================================================================================
//函数名称:void AD9854_SetRFSK(void)
//函数功能:AD9854的RFSK设置
//入口参数:Freq_Low          RFSK低频率	   48Bit
//         Freq_High         RFSK高频率	   48Bit
//         Freq_Up_Down		 步进频率	   48Bit
//		   FreRate           斜率时钟控制  20Bit
//出口参数:无
//注:     每两个脉冲之间的时间周期用下式表示(FreRate +1)*(System Clock ),一个脉冲,
//         频率 上升或者下降 一个步进频率
//====================================================================================
void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate)
{
	uchar count=6;
	uchar Adress1,Adress2,Adress3;
    const uint  Shape=4000;			   //幅度设置. 为12 Bit,取值范围为(0~4095)

	Adress1=0x04;		     //选择频率控制字地址的初值 
	Adress2=0x0a;
	Adress3=0x10;

	Freq_convert(Freq_Low);                             //频率1转换

	for(count=6;count>0;)	                         //写入6字节的频率控制字  
    {
		AD9854_WR_Byte(Adress1++,FreqWord[--count]);
    }

	Freq_convert(Freq_High);                             //频率2转换

	for(count=6;count>0;)	                         //写入6字节的频率控制字  
    {
		AD9854_WR_Byte(Adress2++,FreqWord[--count]);
    }

	Freq_convert(Freq_Up_Down);                             //步进频率转换

	for(count=6;count>0;)	                               //写入6字节的频率控制字  
    {
		AD9854_WR_Byte(Adress3++,FreqWord[--count]);
    }

	AD9854_WR_Byte(0x1a,(uchar)((FreRate>>16)&0x0f));				   //设置斜升速率
	AD9854_WR_Byte(0x1b,(uchar)(FreRate>>8));
	AD9854_WR_Byte(0x1c,(uchar)FreRate);				    

	AD9854_WR_Byte(0x21,Shape>>8);	                  //设置I通道幅度
	AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
	
	AD9854_WR_Byte(0x23,Shape>>8);	                  //设置Q通道幅度
	AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

	AD9854_UDCLK=1;                                //更新AD9854输出
    AD9854_UDCLK=0;	
}

//测试正弦波,采用120MHZ SYSCLK时,出来10MHZ波形,波形很好,测试成功
//当采用300MHZ SYSCLK时,测试50MHZ波形时,DDS发热厉害,且波形衰减严重,幅度在35mV左右
//
//int main()
//{
//	AD9854_Init();
//	AD9854_SetSine(80000000,4095);
//	while(1);			
//}

 
//测试正弦波,采用120MHZ SYSCLK时,出来87.697HZ波形,波形很好,测试成功
//
//int main()
//{
//	AD9854_Init();
//	AD9854_SetSine_double(87.697,4000);
//	while(1);			
//} 


//测试FSK,采用120MHZ SYSCLK,1K和6K,测试成功,结果对应"FSK波形.bmp"

//int main()
//{
//	AD9854_InitFSK();
//	AD9854_SetFSK(1000,6000);
//	while(1)
//	{
//		AD9854_FDATA = 1;
//		delay_us(30000);	      //延时时间长,便于观察
//		AD9854_FDATA = 0;
//		delay_us(30000);
//	}			
//} 


//测试BPSK,采用120MHZ SYSCLK,测试成功

//int main()
//{
//	AD9854_InitBPSK();
//	AD9854_SetBPSK(0,8192);
//	while(1)
//	{
//		AD9854_FDATA = 1;
//		delay_us(10);	      
//		AD9854_FDATA = 0;
//		delay_us(10);
//	}			
//} 



//测试OSK,采用120MHZ SYSCLK,测试成功

//int main()
//{
//	AD9854_InitOSK();
//	AD9854_SetOSK(10);
//	while(1)
//	{
//		AD9854_OSK=1;	
//		delay_us(30); 
//		AD9854_OSK=0;	
//		delay_us(30);
//	}			
//} 


//测试AM,采用120MHZ SYSCLK,测试成功

//int main()
//{
//	AD9854_InitAM();
//	while(1)
//	{
//		AD9854_SetAM(2000);
//		delay_us(10);	      
//		AD9854_SetAM(4000);
//		delay_us(10);
//	}
//}
// 

//测试RFSK,采用120MHZ SYSCLK,测试成功

//int main()
//{
//	AD9854_InitRFSK();
//	AD9854_SetRFSK(1000,60000,100,30);
//	while(1)
//	{
//		AD9854_FDATA = 1;
//		delay_us(30000);	      //延时时间长,便于观察
//		AD9854_FDATA = 0;
//		delay_us(30000);
//	} 
//}			

添加AD9854.h文件

#ifndef __AD9854_H
#define __AD9854_H	 
#include "sys.h"


#define AD9854_RST    PAout(6)   //AD9854复位端口
#define AD9854_UDCLK  PAout(4)   //AD9854更新时钟
#define AD9854_WR     PAout(5)  //AD9854写使能,低有效
#define AD9854_RD     PAout(8)   //AD9854读使能,低有效
#define AD9854_OSK    PAout(2)   //AD9854 OSK控制端
#define AD9854_FDATA  PBout(10)   //AD9854 FSK,PSK控制

#define AD9854_DataBus GPIOC->BSRR
#define AD9854_AdrBus  GPIOC->BSRR

#define uint  unsigned int
#define uchar unsigned char
#define ulong unsigned long

extern void AD9854_Init(void);						  
static void Freq_convert(long Freq);	         	  
extern void AD9854_SetSine(ulong Freq,uint Shape);	  
static void Freq_double_convert(double Freq);		  
extern void AD9854_SetSine_double(double Freq,uint Shape);
extern void AD9854_InitFSK(void);				
extern void AD9854_SetFSK(ulong Freq1,ulong Freq2);					  
extern void AD9854_InitBPSK(void);					  
extern void AD9854_SetBPSK(uint Phase1,uint Phase2);					
extern void AD9854_InitOSK(void);					 
extern void AD9854_SetOSK(uchar RateShape);					  
extern void AD9854_InitAM(void);					 
extern void AD9854_SetAM(uint Shape);					
extern void AD9854_InitRFSK(void);					 
extern void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate);		

#endif

添加sys.c文件

__asm void WFI_SET(void)
{
	WFI;		  
}
//关闭所有中断(但是不包括fault和NMI中断)
__asm void INTX_DISABLE(void)
{
	CPSID   I
	BX      LR	  
}
//开启所有中断
__asm void INTX_ENABLE(void)
{
	CPSIE   I
	BX      LR  
}
//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(uint32_t  addr) 
{
	MSR MSP, r0 			//set Main Stack value
	BX r14
}

?添加sys.h文件

#ifndef __SYS_H
#define __SYS_H	 
#include "stm32f4xx.h" 

#define SYSTEM_SUPPORT_OS		0		//定义系统文件夹是否支持UCOS
																	    
	 
//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).M4同M3类似,只是寄存器地址变了.
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
//IO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014
#define GPIOB_ODR_Addr    (GPIOB_BASE+20) //0x40020414 
#define GPIOC_ODR_Addr    (GPIOC_BASE+20) //0x40020814 
#define GPIOD_ODR_Addr    (GPIOD_BASE+20) //0x40020C14 
#define GPIOE_ODR_Addr    (GPIOE_BASE+20) //0x40021014 
#define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414    
#define GPIOG_ODR_Addr    (GPIOG_BASE+20) //0x40021814   
#define GPIOH_ODR_Addr    (GPIOH_BASE+20) //0x40021C14    
#define GPIOI_ODR_Addr    (GPIOI_BASE+20) //0x40022014     

#define GPIOA_IDR_Addr    (GPIOA_BASE+16) //0x40020010 
#define GPIOB_IDR_Addr    (GPIOB_BASE+16) //0x40020410 
#define GPIOC_IDR_Addr    (GPIOC_BASE+16) //0x40020810 
#define GPIOD_IDR_Addr    (GPIOD_BASE+16) //0x40020C10 
#define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010 
#define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410 
#define GPIOG_IDR_Addr    (GPIOG_BASE+16) //0x40021810 
#define GPIOH_IDR_Addr    (GPIOH_BASE+16) //0x40021C10 
#define GPIOI_IDR_Addr    (GPIOI_BASE+16) //0x40022010 
 
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

#define PHout(n)   BIT_ADDR(GPIOH_ODR_Addr,n)  //输出 
#define PHin(n)    BIT_ADDR(GPIOH_IDR_Addr,n)  //输入

#define PIout(n)   BIT_ADDR(GPIOI_ODR_Addr,n)  //输出 
#define PIin(n)    BIT_ADDR(GPIOI_IDR_Addr,n)  //输入

//以下为汇编函数
void WFI_SET(void);		//执行WFI指令
void INTX_DISABLE(void);//关闭所有中断
void INTX_ENABLE(void);	//开启所有中断
void MSR_MSP(uint32_t  addr);	//设置堆栈地址 
#endif


?添加完成如图所示

?到这里恭喜你已经配置完成了下面就开始简单的使用它。如图所示添加

 /* USER CODE BEGIN 2 */
	 AD9854_Init();

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	AD9854_SetSine(10000,2040);
		while(1);

实现频率为10k,ad值为2040的输出;正弦波与方波接线及效果如图所示

结果的峰峰值会有一定的衰减,想要在进行放大可以进行外接功放即可。

到这里就完了,希望你们都是配置成功呀。?

?

?

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:21:29  更:2021-07-22 14:23:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:55:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码