1.AD9854模块介绍

模块的主要特性如下:
(1)功能:两路2 个正交信号(即四路正弦信号,每路相位相差90°),一路方波信
号,以及FSK、RFSK、BPSK、AM、Chirp 和OSK 调制波形输出;一路FSK 外部调制信
号输入。
(2)带宽:正交信号输出的-1dB 带宽为70M 左右,-3dB 带宽为100M 左右,几乎无
衰减;方波信号输出频率最大达到120MHz。
(3)幅度:输出空载时,正交信号输出最大峰峰值为500mV 左右,方波信号输出最
大峰峰值为2.4V 左右;输出接50 欧姆负载(后级模块输入阻抗50Ω)时,正交信号输出
最大峰峰值为320mV 左右,方波信号输出最大峰峰值为1.2V 左右。
正交信号频率在DC~40MHz 范围内,输出幅值平坦度、幅度平衡误差均小于5%,频
率稳定度小于10-4。
如果想输出更小幅度的正交信号,可以通过程序编程控制。
(4)滤波特性:4 路正交信号输出部分都带有独立的7 阶无源低通滤波电路,特性阻
抗50Ω,截止频率为120MHz。
(5)供电:默认使用+5V@1A 开关电源通过DC 电源座供电,模块预留供电插针;模
块供电带防反接保护;通过LM1085-3.3V 稳压芯片把+5V 电源转换得到+3.3V 电源电压。
(6)接口和控制方式:信号输出采用SMA 接口;控制AD9854 使用并行或串行方式,
采用插针接口。
(7)本模块设计了地测试环/测试孔,以方便用户测试。
2.AD9854模块使用
供电接口有两个:一个DC 电源座输入,一个是插针接口输入,只要选择其中一个即可!
注意控制器比如单片机和AD9854 模块的共地。
1.引脚配置
使用8个IO口实现串行传输,推挽输出,高速。
2.驱动文件
.AD9854.h
/*--------------------------------------------------------------
头文件名:AD9854.h
文件描述:数据处理头文件
---------------------------------------------------------------*/
#ifndef _AD9854_H_
#define _AD9854_H_
#include "main.h"
//----------------------------------------------------------------
// AD9854_I/O控制线
//-----------------------------------------------------------------
#define AD9854_RD_Set ( HAL_GPIO_WritePin(ad9854_RD_GPIO_Port, ad9854_RD_Pin, GPIO_PIN_SET))
#define AD9854_RD_Clr ( HAL_GPIO_WritePin(ad9854_RD_GPIO_Port, ad9854_RD_Pin, GPIO_PIN_RESET))
#define AD9854_WR_Set ( HAL_GPIO_WritePin(ad9854_WR_GPIO_Port, ad9854_WR_Pin, GPIO_PIN_SET))
#define AD9854_WR_Clr ( HAL_GPIO_WritePin(ad9854_WR_GPIO_Port, ad9854_WR_Pin, GPIO_PIN_RESET))
#define AD9854_UDCLK_Set ( HAL_GPIO_WritePin(ad9854_UD_GPIO_Port, ad9854_UD_Pin, GPIO_PIN_SET))
#define AD9854_UDCLK_Clr ( HAL_GPIO_WritePin(ad9854_UD_GPIO_Port, ad9854_UD_Pin, GPIO_PIN_RESET))
#define AD9854_RST_Set ( HAL_GPIO_WritePin(ad9854_RT_GPIO_Port, ad9854_RT_Pin, GPIO_PIN_SET)) //开关电源板
#define AD9854_RST_Clr ( HAL_GPIO_WritePin(ad9854_RT_GPIO_Port, ad9854_RT_Pin, GPIO_PIN_RESET))
#define AD9854_SP_Set ( HAL_GPIO_WritePin(ad9854_SP_GPIO_Port, ad9854_SP_Pin, GPIO_PIN_SET))
#define AD9854_SP_Clr ( HAL_GPIO_WritePin(ad9854_SP_GPIO_Port, ad9854_SP_Pin, GPIO_PIN_RESET))
#define AD9854_OSK_Set
#define AD9854_OSK_Clr
#define AD9854_FDATA_Set //fsk/bpsk/hold
#define AD9854_FDATA_Clr
// I/O驱动 使用别名
#define SPI_IO_RST_Set ( HAL_GPIO_WritePin(ad9854_A2_GPIO_Port, ad9854_A2_Pin, GPIO_PIN_SET))
#define SPI_IO_RST_Clr ( HAL_GPIO_WritePin(ad9854_A2_GPIO_Port, ad9854_A2_Pin, GPIO_PIN_RESET))
#define SPI_SDO_Set ( HAL_GPIO_WritePin(ad9854_A1_GPIO_Port, ad9854_A1_Pin, GPIO_PIN_SET))
#define SPI_SDO_Clr ( HAL_GPIO_WritePin(ad9854_A1_GPIO_Port, ad9854_A1_Pin, GPIO_PIN_RESET))
#define SPI_SDI_Set ( HAL_GPIO_WritePin(ad9854_A0_GPIO_Port, ad9854_A0_Pin, GPIO_PIN_SET))
#define SPI_SDI_Clr ( HAL_GPIO_WritePin(ad9854_A0_GPIO_Port, ad9854_A0_Pin, GPIO_PIN_RESET))
// AD9854寄存器地址
#define PHASE1 0x00 //phase adjust register #1
#define PHASE2 0x01 //phase adjust register #2
#define FREQ1 0x02 //frequency tuning word 1
#define FREQ2 0x03 //frequency tuning word 2
#define DELFQ 0x04 //delta frequency word
#define UPDCK 0x05 //update clock
#define RAMPF 0x06 //ramp rate clock
#define CONTR 0x07 //control register
#define SHAPEI 0x08 //output shape key I mult
#define SHAPEQ 0x09 //output shape key Q mult
#define RAMPO 0x0A //output shape key ramp rate
#define CDAC 0x0B //QDAC
//**************************以下部分为函数定义********************************
extern void GPIO_AD9854_Configuration(void); // AD9854_IO口初始化
static void AD9854_WR_Byte(uint8_t Adata);
extern void AD9854_Init(void);
static void Freq_convert(long Freq);
extern void AD9854_SetSine(uint32_t Freq,uint16_t Shape);
static void Freq_double_convert(double Freq);
extern void AD9854_SetSine_double(double Freq,uint16_t Shape);
extern void AD9854_InitFSK(void);
extern void AD9854_SetFSK(uint32_t Freq1,uint32_t Freq2);
extern void AD9854_InitBPSK(void);
extern void AD9854_SetBPSK(uint16_t Phase1,uint16_t Phase2);
extern void AD9854_InitOSK(void);
extern void AD9854_SetOSK(uint8_t RateShape);
extern void AD9854_InitAM(void);
extern void AD9854_SetAM(uint16_t Shape);
extern void AD9854_InitRFSK(void);
extern void AD9854_SetRFSK(uint32_t Freq_Low,uint32_t Freq_High,uint32_t Freq_Up_Down,uint32_t FreRate);
#endif
AD9854.c
#include "AD9854.h"
#include "delay.h"
//**********************以下为系统时钟以及其相关变量设置**************************/
/*
此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个
CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ
Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型
*/
//#define CLK_Set 7
//const uint32_t Freq_mult_ulong = 1340357;
//const double Freq_mult_doulle = 1340357.032;
//#define CLK_Set 9
//const uint32_t Freq_mult_ulong = 1042500;
//const double Freq_mult_doulle = 1042499.9137431;
// #define CLK_Set 8
// const uint32_t Freq_mult_ulong = 1172812;
// const double Freq_mult_doulle = 1172812.403;
#define CLK_Set 10
const uint32_t Freq_mult_ulong = 938250;
const double Freq_mult_doulle = 938249.9224;
uint8_t FreqWord[6]; //6个字节频率控制字
//====================================================================================
// 初始化程序区
//====================================================================================
//====================================================================================
// void GPIO_AD9854_Configuration(void)
// 函数功能: AD9854引脚配置函数
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: RCC_APB2PeriphClockCmd(); GPIO_Init();
// 注意事项: 无
//====================================================================================
void GPIO_AD9854_Configuration(void)
{
// GPIO_InitTypeDef GPIO_InitStructure;
// // 使能IO口时钟
// RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
//
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;; // 推挽输出
// GPIO_Init(GPIOA, &GPIO_InitStructure);
// // 控制端口
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11
// | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;; // 推挽输出
// GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//====================================================================================
// AD9854驱动区
//====================================================================================
//====================================================================================
//函数名称:void AD9854_WR_Byte(uint8_t Adata)
//函数功能:AD9854并行口写入数据;串行方式
//入口参数:adata 地址&数据
//出口参数:无
//====================================================================================
void AD9854_WR_Byte(uint8_t Adata)
{
unsigned char i;
for(i=8;i>0;i--)
{
if(Adata&0x80)
SPI_SDI_Set;
else
SPI_SDI_Clr;
Adata <<= 1;
AD9854_WR_Clr;
AD9854_WR_Set;
}
}
//====================================================================================
//函数名称:void AD9854_Init(void)
//函数功能:AD9854初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_Init(void)
{
AD9854_SP_Clr; // 串行控制
AD9854_WR_Clr;
AD9854_UDCLK_Clr;
AD9854_RST_Set; // 复位AD9854
delay_us(100);
AD9854_RST_Clr;
SPI_IO_RST_Clr;
AD9854_RD_Clr;
AD9854_WR_Byte(CONTR);
// AD9854_WR_Byte(0x10); //关闭比较器
AD9854_WR_Byte(0x00); //打开比较器
AD9854_WR_Byte(CLK_Set); //设置系统时钟倍频
AD9854_WR_Byte(0x00); //设置系统为模式0,由外部更新
AD9854_WR_Byte(0x60);
AD9854_UDCLK_Set; // 更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称: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)
{
uint32_t FreqBuf;
uint32_t Temp=Freq_mult_ulong;
uint8_t Array_Freq[4]; //将输入频率因子分为四个字节
Array_Freq[0]=(uint8_t) Freq;
Array_Freq[1]=(uint8_t)(Freq>>8);
Array_Freq[2]=(uint8_t)(Freq>>16);
Array_Freq[3]=(uint8_t)(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(uint32_t Freq,uint16_t Shape)
{
uint8_t count;
uint8_t i=0;
Freq_convert(Freq); //频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
if(i==0)
AD9854_WR_Byte(FREQ1);
AD9854_WR_Byte(FreqWord[--count]);
i++;
}
AD9854_WR_Byte(SHAPEI); //设置I通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_WR_Byte(SHAPEQ); //设置Q通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称: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)
{
uint32_t Low32;
uint16_t 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 = (uint32_t)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,uint16_t Shape)
{
uint8_t count=0;
uint8_t i=0;
Freq_double_convert(Freq); //频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
if(i==0)
AD9854_WR_Byte(FREQ1);
AD9854_WR_Byte(FreqWord[--count]);
i++;
}
AD9854_WR_Byte(SHAPEI); //设置I通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_WR_Byte(SHAPEQ); //设置Q通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void AD9854_InitFSK(void)
//函数功能:AD9854的FSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitFSK(void)
{
AD9854_SP_Clr;
AD9854_WR_Clr; // 将读、写控制端口设为无效
AD9854_UDCLK_Clr;
AD9854_RST_Set; // 复位AD9854
delay_us(100);
AD9854_RST_Clr;
SPI_IO_RST_Clr;
AD9854_RD_Clr;
AD9854_WR_Byte(CONTR);
AD9854_WR_Byte(0x10); //关闭比较器
AD9854_WR_Byte(CLK_Set); //设置系统时钟倍频
AD9854_WR_Byte(0x02); //设置系统为模式0,由外部更新
AD9854_WR_Byte(0x60); //设置为可调节幅度,取消插值补偿
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void AD9854_SetFSK(ulong Freq1,ulong Freq2)
//函数功能:AD9854的FSK设置
//入口参数:Freq1 FSK频率1
// Freq2 FSK频率2
//出口参数:无
//====================================================================================
void AD9854_SetFSK(uint32_t Freq1,uint32_t Freq2)
{
uint8_t count=6;
uint8_t i=0,j=0;
const uint16_t Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095)
Freq_convert(Freq1); //频率转换1
for(count=6;count>0;) //写入6字节的频率控制字
{
if(i==0)
AD9854_WR_Byte(FREQ1);
AD9854_WR_Byte(FreqWord[--count]);
i++;
}
Freq_convert(Freq2); //频率转换2
for(count=6;count>0;) //写入6字节的频率控制字
{
if(j==0)
AD9854_WR_Byte(FREQ2);
AD9854_WR_Byte(FreqWord[--count]);
j++;
}
AD9854_WR_Byte(SHAPEI); //设置I通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_WR_Byte(SHAPEQ); //设置Q通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void AD9854_InitBPSK(void)
//函数功能:AD9854的BPSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitBPSK(void)
{
AD9854_SP_Clr;
AD9854_WR_Clr; // 将读、写控制端口设为无效
AD9854_UDCLK_Clr;
AD9854_RST_Set; // 复位AD9854
delay_us(100);
AD9854_RST_Clr;
SPI_IO_RST_Clr;
AD9854_RD_Clr;
AD9854_WR_Byte(CONTR);
AD9854_WR_Byte(0x10); //关闭比较器
AD9854_WR_Byte(CLK_Set); //设置系统时钟倍频
AD9854_WR_Byte(0x08); //设置系统为模式0,由外部更新
AD9854_WR_Byte(0x60);
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void AD9854_SetBPSK(uint Phase1,uint Phase2)
//函数功能:AD9854的BPSK设置
//入口参数:Phase1 调制相位1
// Phase2 调制相位2
//出口参数:无
//说明: 相位为14Bit,取值从0~16383,谷雨建议在用本函数的时候将Phase1设置为0,
// 将Phase1设置为8192,180°相位
//====================================================================================
void AD9854_SetBPSK(uint16_t Phase1,uint16_t Phase2)
{
uint8_t count;
uint8_t i=0;
const uint32_t Freq=60000;
const uint16_t Shape=4000;
AD9854_WR_Byte(PHASE1); //设置相位1
AD9854_WR_Byte(Phase1>>8);
AD9854_WR_Byte((uint8_t)(Phase1&0xff));
AD9854_WR_Byte(PHASE2); //设置相位2
AD9854_WR_Byte(Phase2>>8);
AD9854_WR_Byte((uint8_t)(Phase2&0xff));
Freq_convert(Freq); //频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
if(i==0)
AD9854_WR_Byte(FREQ1);
AD9854_WR_Byte(FreqWord[--count]);
i++;
}
AD9854_WR_Byte(SHAPEI); //设置I通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_WR_Byte(SHAPEQ); //设置Q通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void AD9854_InitOSK(void)
//函数功能:AD9854的OSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitOSK(void)
{
AD9854_SP_Clr;
AD9854_WR_Clr; // 将读、写控制端口设为无效
AD9854_UDCLK_Clr;
AD9854_RST_Set; // 复位AD9854
delay_us(100);
AD9854_RST_Clr;
SPI_IO_RST_Clr;
AD9854_RD_Clr;
AD9854_WR_Byte(CONTR);
AD9854_WR_Byte(0x10); //关闭比较器
AD9854_WR_Byte(CLK_Set); //设置系统时钟倍频
AD9854_WR_Byte(0x00); //设置系统为模式0,由外部更新
AD9854_WR_Byte(0x70); //设置为可调节幅度,取消插值补偿,通断整形内部控制
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void AD9854_SetOSK(uchar RateShape)
//函数功能:AD9854的OSK设置
//入口参数: RateShape OSK斜率,取值为4~255,小于4则无效
//出口参数:无
//====================================================================================
void AD9854_SetOSK(uint8_t RateShape)
{
uint8_t count;
uint8_t i=0;
const uint32_t Freq=60000; //设置载频
const uint16_t Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095)
Freq_convert(Freq); //频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
if(i==0)
AD9854_WR_Byte(FREQ1);
AD9854_WR_Byte(FreqWord[--count]);
i++;
}
AD9854_WR_Byte(SHAPEI); //设置I通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_WR_Byte(SHAPEQ); //设置Q通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_WR_Byte(RAMPO); //设置OSK斜率
AD9854_WR_Byte(RateShape); //设置OSK斜率
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void AD9854_InitAM(void)
//函数功能:AD9854的AM初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitAM(void)
{
uint8_t count;
uint8_t i=0;
const uint32_t Freq=60000; //设置载频
AD9854_SP_Clr;
AD9854_WR_Clr; // 将读、写控制端口设为无效
AD9854_UDCLK_Clr;
AD9854_RST_Set; // 复位AD9854
delay_us(100);
AD9854_RST_Clr;
SPI_IO_RST_Clr;
AD9854_RD_Clr;
AD9854_WR_Byte(CONTR);
AD9854_WR_Byte(0x10); //关闭比较器
AD9854_WR_Byte(CLK_Set); //设置系统时钟倍频
AD9854_WR_Byte(0x00); //设置系统为模式0,由外部更新
AD9854_WR_Byte(0x60); //设置为可调节幅度,取消插值补?
Freq_convert(Freq); //频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
if(i==0)
AD9854_WR_Byte(FREQ1);
AD9854_WR_Byte(FreqWord[--count]);
i++;
}
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void AD9854_SetAM(uchar Shape)
//函数功能:AD9854的AM设置
//入口参数:Shape 12Bit幅度,取值从0~4095
//出口参数:无
//====================================================================================
void AD9854_SetAM(uint16_t Shape)
{
AD9854_WR_Byte(SHAPEI); //设置I通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_WR_Byte(SHAPEQ); //设置Q通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称:void AD9854_InitRFSK(void)
//函数功能:AD9854的RFSK初始化
//入口参数:无
//出口参数:无
//====================================================================================
void AD9854_InitRFSK(void)
{
AD9854_SP_Clr;
AD9854_WR_Clr; // 将读、写控制端口设为无效
AD9854_UDCLK_Clr;
AD9854_RST_Set; // 复位AD9854
delay_us(100);
AD9854_RST_Clr;
SPI_IO_RST_Clr;
AD9854_RD_Clr;
AD9854_FDATA_Clr;
AD9854_WR_Byte(CONTR);
AD9854_WR_Byte(0x10); //关闭比较器
AD9854_WR_Byte(CLK_Set); //设置系统时钟倍频
AD9854_WR_Byte(0x24); //设置系统为模式0,由外部更新
AD9854_WR_Byte(0x20); //设置为可调节幅度,取消插值补偿,关闭Sinc效应
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
//====================================================================================
//函数名称: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(uint32_t Freq_Low,uint32_t Freq_High,uint32_t Freq_Up_Down,uint32_t FreRate)
{
uint8_t count=6;
uint8_t i=0,j=0,k=0;
const uint16_t Shape=3600; //幅度设置. 为12 Bit,取值范围为(0~4095)
Freq_convert(Freq_Low); //频率1转换
for(count=6;count>0;) //写入6字节的频率控制字
{
if(i==0)
AD9854_WR_Byte(FREQ1);
AD9854_WR_Byte(FreqWord[--count]);
i++;
}
Freq_convert(Freq_High); //频率2转换
for(count=6;count>0;) //写入6字节的频率控制字
{
if(j==0)
AD9854_WR_Byte(FREQ2);
AD9854_WR_Byte(FreqWord[--count]);
j++;
}
Freq_convert(Freq_Up_Down); //步进频率转换
for(count=6;count>0;) //写入6字节的频率控制字
{
if(k==0)
AD9854_WR_Byte(DELFQ);
AD9854_WR_Byte(FreqWord[--count]);
k++;
}
AD9854_WR_Byte(RAMPF); //设置斜升速率
AD9854_WR_Byte((uint8_t)((FreRate>>16)&0x0f));
AD9854_WR_Byte((uint8_t)(FreRate>>8));
AD9854_WR_Byte((uint8_t)FreRate);
AD9854_WR_Byte(SHAPEI); //设置I通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_WR_Byte(SHAPEQ); //设置Q通道幅度
AD9854_WR_Byte(Shape>>8);
AD9854_WR_Byte((uint8_t)(Shape&0xff));
AD9854_UDCLK_Set; //更新AD9854输出
AD9854_UDCLK_Clr;
}
main.c
#include "AD9854.h"
/*
输出正弦波,频率(HZ),幅度(mv)
*/
AD9854_Init();
AD9854_SetSine(10000, 4095);
/*
输出FSK波
*/
AD9854_InitFSK();
AD9854_SetFSK(10000,100000);
// 其他波形写法类似,先初始化,在开启
使用调制波形时,FSK口要输入正弦波控制。