标题:
STM32F103ZET6驱动AD9954源程序
[打印本页]
作者:
艾米莉亚碳
时间:
2019-8-5 20:31
标题:
STM32F103ZET6驱动AD9954源程序
可以用,ZET6的
单片机源程序如下:
/**********************************************************
功能:stm32f103rct6控制,20MHz时钟, AD9954正弦波点频输出,范围0-130M(可编辑0-200M),
扫频默认正弦波 。
显示:12864cog
接口:控制接口请参照AD9954.h 按键接口请参照key.h
**********************************************************/
#include "AD9954.h"
#include "delay.h"
#include "math.h"
//系统频率fosc(外部晶振频率),系统频率=fosc*M
#define fosc 20 //晶振频率
#define PLL_MULTIPLIER 20 //PLL倍频数(4--20)
#define fs (fosc*PLL_MULTIPLIER) //系统时钟频率
//double fH_Num=11.2204;
double fH_Num=10.73741824; //400M
//double fH_Num=11.3671588397205;//
//double fH_Num = 11.3025455157895;
/*
** 函数名称 :void GPIO_AD9954_Init(void)
** 函数功能 :AD9954接口IO初始化
** AD9954_CS----------PB9 OUT
** AD9954_SCLK--------PB10 OUT
** AD9954_SDIO--------PB11 OUT
** AD9954_OSK---------PB12 OUT
** PS0----------------PB13 OUT
** PS1----------------PB14 OUT
** IOUPDATE-----------PB15 OUT
** AD9954_SDO---------PB5 IN
** AD9954_IOSY--------PB6 OUT
** AD9954_RET---------PB7 OUT
** AD9954_PWR---------PB8 OUT
*/
void GPIO_AD9954_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_2|GPIO_Pin_7|GPIO_Pin_6; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_1|GPIO_Pin_0; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED1-->PE.5 端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOE2,3,4
AD9954_IOSY=0;
AD9954_OSK=0;
AD9954_PWR=0;
}
/*********************************************************************************************************
** 函数名称 :void AD9954_RESET(void)
** 函数功能 :复位AD9954
** 函数说明 :不复位也可以
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void AD9954_RESET(void)
{
AD9954_CS = 0;
AD9954_RET = 0;
AD9954_RET = 1;
delay_ms(100);
AD9954_RET = 0;
AD9954_CS = 0;
AD9954_SCLK = 0;
PS0 = 0;
PS1 = 0;
IOUPDATE = 0;
AD9954_CS = 1;
}
/*********************************************************************************************************
** 函数名称 :void AD9954_SENDBYTE(u8 dat)
** 函数功能 :往AD9954发送一个字节的内容
** 函数说明 :AD9954的传输速度最大为25M,所以不加延时也可以
** 入口参数 :待发送字节
** 出口参数 :无
*********************************************************************************************************/
void AD9954_SENDBYTE(u8 dat)
{
u8 i;
for (i = 0;i<8;i++)
{
AD9954_SCLK = 0;
if (dat & 0x80)
{
AD9954_SDIO = 1;
}
else
{
AD9954_SDIO = 0;
}
AD9954_SCLK = 1;
dat <<= 1;
}
}
u8 AD9954_ReadByte(void)
{
u8 i,dat=0;
for (i = 0;i<8;i++)
{
AD9954_SCLK = 0;
dat|=AD9954_SDO;
AD9954_SCLK = 1;
dat <<= 1;
}
return dat;
}
/*********************************************************************************************************
** 函数名称 :void UPDATE(void)
** 函数功能 :产生一个更新信号,更新AD9954内部寄存器,
** 函数说明 :可以不加任何延时
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void UPDATE(void)
{
IOUPDATE=0;
// delay_us(100);
IOUPDATE = 1;
//delay_us(200);
IOUPDATE = 0;
}
/*********************************************************************************************************
** 函数名称 :void AD9954_Init(void))
** 函数功能 :初始化AD9954的管脚和最简单的内部寄存器的配置,
** 函数说明 :默认关掉比较器的电源,因板上的晶振为100MHz,最大采用了4倍频,为400M
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
//读寄存器
u32 Read_Vau1(void)
{
uint32_t ret;
// char i;
AD9954_CS=1;
AD9954_SENDBYTE(CFR1);
ret = AD9954_ReadByte();
ret<<=8;
ret += AD9954_ReadByte();
ret<<=8;
ret += AD9954_ReadByte();
ret<<=8;
ret += AD9954_ReadByte();
AD9954_CS=1;
return ret;
}
u32 Read_Vau2(void)
{
uint32_t ret;
// char i;
AD9954_CS=1;
AD9954_SENDBYTE(CFR2);
ret = AD9954_ReadByte();
ret<<=8;
ret += AD9954_ReadByte();
ret<<=8;
ret += AD9954_ReadByte();
AD9954_CS=0;
return ret;
}
void AD9954_Init(void)
{
GPIO_AD9954_Init();
AD9954_RESET();
delay_ms(10);
AD9954_CS = 0;
//single tone
AD9954_SENDBYTE(CFR1);//地址0写操作
AD9954_SENDBYTE(0x02);//02
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x10);
// AD9954_SENDBYTE(0x40);//比较器power down
AD9954_SENDBYTE(0x00);//比较器使能
AD9954_SENDBYTE(CFR2);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
#if fs>400
#error "系统频率超过芯片最大值"
#elseif fs>=250
AD9954_SENDBYTE(PLL_MULTIPLIER<<3|0x04|0X03);
#else
AD9954_SENDBYTE(PLL_MULTIPLIER<<3);
#endif
// AD9954_SENDBYTE(0x24);//4倍频,打开VCO控制高位,系统时钟倍频后为400M
AD9954_CS=1;
}
//Get_FTW的修正后频率
u32 Get_FTW(double f)
{
return (u32)((fH_Num+4.6)*f);
}
/*********************************************************************************************************
** 函数名称 :void AD9954_SETFRE(float f)
** 函数功能 :设置AD9954当前的频率输出,采用的是单一频率输出
** 函数说明 :因为采用的浮点数进行计算,转换过程中会出现误差,通过调整可以精确到0.1Hz以内
** 入口参数 :欲设置的频率值
** 出口参数 :无
*********************************************************************************************************/
void AD9954_SETFRE(double f)//single tone
{
u32 date;
AD9954_CS = 0;
date = Get_FTW(f);//det=(f/fclk)x2^32=10.7374xf
//date=10.7374*f;
AD9954_SENDBYTE(FTW0);//FTW0地址
// delay_ms(1);
AD9954_SENDBYTE((u8)(date >> 24));//频率控制字
AD9954_SENDBYTE((u8)(date >> 16));
AD9954_SENDBYTE((u8)(date >> 8));
AD9954_SENDBYTE((u8)date);
AD9954_CS=1;
UPDATE();
// fH_Num+=0.001;
}
/*
*/
void DirectSwitchPSK(float f, float phase1, float phase2, float phase3, float phase4)
{
u16 date;
AD9954_CS = 0;
IOUPDATE = 0;
delay_us(1);
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0xA4);//4倍频,打开VCO控制高位,系统时钟倍频后为400M
AD9954_SETFRE(f);//载波频率
PS0 = 0;
PS1 = 0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//final address:0x000
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x00);//RAM0工作于模式0,不停留位没有激活
UPDATE();
date = 45.51*phase1;
date = date << 2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE((u8)(date >> 8));//频率控制字
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
PS0 = 1;//ram1
PS1 = 0;
AD9954_SENDBYTE(0x08);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x01);//final address:0x0001
AD9954_SENDBYTE(0x04);//start address:0x0001
AD9954_SENDBYTE(0x00);//RAM1工作于模式0,不停留位没有激活
UPDATE();
date = 45.51*phase2;
date = date << 2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE((u8)(date >> 8));//频率控制字
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
PS0 = 0;//ram2
PS1 = 1;
AD9954_SENDBYTE(0x09);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x02);//final address:0x0002
AD9954_SENDBYTE(0x08);//start address:0x0002
AD9954_SENDBYTE(0x00);
UPDATE();
date = 45.51*phase3;
date = date << 2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE((u8)(date >> 8));//频率控制字
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
PS0 = 1;//ram3
PS1 = 1;
AD9954_SENDBYTE(0x0a);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x03);//final address:0x0003
AD9954_SENDBYTE(0x0c);//start address:0x0003
AD9954_SENDBYTE(0x00);
UPDATE();
date = 45.51*phase4;
date = date << 2;
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE((u8)(date >> 8));//频率控制字
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0xa0);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函数名称 :void Generate_PSK(float f,u16 *phase)
** 函数功能 :PSK调制信号输出
** 函数说明 :通过RAM端来控制信号的相位,从而实现PSK信号的调制
** 这里使用一个RAM段的循环模式,PSK信号为8为数据位。
** RAM的更新速度由ram rate定时寄存器控制,寄存器为16位,实现对系统提供的100M时钟1~65535分频,写0是无效的
** 当跟输出PSK载波的频率是ram rate跟新频率的整数倍时,才能保证每次的相位改变一致
** 入口参数 :float f :PSK载波的频率
** u16 *phase: 写入相位累加器的相位值,180实现对相位翻转,0不改变相位,PSK信号为8位,需为8位的数组
** 出口参数 :无
*********************************************************************************************************/
void Generate_PSK(double f, u16 *phase)
{
u8 i;
u16 date;
AD9954_CS = 0;
IOUPDATE = 0;
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x24);//4倍频,打开VCO控制高位,系统时钟倍频后为400M
AD9954_SETFRE(f);//载波频率
AD9954_SENDBYTE(0x04);//FTW0地址
AD9954_SENDBYTE(0x00);//频率控制字
AD9954_SENDBYTE(0x10);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
UPDATE();
PS0 = 0;
PS1 = 0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x00);//ramp rate=0x0400
AD9954_SENDBYTE(0x04);
AD9954_SENDBYTE(0x07);//final address:0x007
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x80);//RAM0工作于模式4,不停留位没有激活
UPDATE();
AD9954_SENDBYTE(0x0b);
for (i = 0;i<8;i++)
{
date = 45.51*phase[i];
date = date << 2;
AD9954_SENDBYTE((u8)(date >> 8));//频率控制字
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
}
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0xc0);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函数名称 :void Generate_FM(u32 *fre)
** 函数功能 :FM调制信号输出
** 函数说明 :通过RAM端来控制信号的频率,从而实现FM信号的调制
** 这里使用一个RAM段的循环模式,PSK信号为8为数据位。
** RAM的更新速度由ram rate定时寄存器控制,寄存器为16位,实现对系统提供的100M时钟1~65535分频,写0是无效的
** ram rate的跟新速度为调制信号的频率,这里如1KHz,写入ram rate的值为0X0C35,
** 入口参数 :u32 *fre:FM信号频率值,这里采用的是32点频率采样,调用此函数之前需先设置好频率表的值,其按正弦规律改变
** for(i=0;i<32;i++)
** {
** fre[i]=Fc+Fshift*sin(wt);
** }
** 出口参数 :无
Fc调制前载波的角频率,Fshift
*********************************************************************************************************/
void Generate_FM(u32 *fre)
{
u8 i;
u32 date;
AD9954_CS = 0;
IOUPDATE = 0;
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x24);//4倍频,打开VCO控制高位,系统时钟倍频后为400M
PS0 = 0;
PS1 = 0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x35);//ramp rate=32kHz
AD9954_SENDBYTE(0x0C);
AD9954_SENDBYTE(0x1F);//final address:0x000
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x80);//RAM0工作于模式0,不停留位没有激活
UPDATE();
AD9954_SENDBYTE(0x0b);
for (i = 0;i<32;i++)
{
date = 10.73741*fre[i];
AD9954_SENDBYTE((u8)(date >> 24));//频率控制字
AD9954_SENDBYTE((u8)(date >> 16));
AD9954_SENDBYTE((u8)(date >> 8));
AD9954_SENDBYTE((u8)date);
}
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x80);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函数名称 :void ASK_Init(void)
** 函数功能 :ASK调制信号输出初始化
** 函数说明 :ASK调制,需要先设置好载波频率,然后改变DAC比例因子 scale factor其为14位,通过设置为最大和0两种值实现ASK信号的调制
** 调用Write_ASF(u16 factor)来改变幅值
** 入口参数 :无
** 出口参数 :无
****************************************************** ***************************************************/
void ASK_Init(void)
{
AD9954_CS = 0;
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x02);//手动打开OSK打开
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x20);//当受到UPDATE信号,自动清楚相位累加器 //
// AD9954_SENDBYTE(0x00);//不改变任何
AD9954_SENDBYTE(0x40);
//控制相位偏移,因默认输出是余弦波,所以需控制相位累加器的累加相位为270
AD9954_SENDBYTE(0X05);
AD9954_SENDBYTE(0X30);
AD9954_SENDBYTE(0X00);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函数名称 :void AM_Init(void)
** 函数功能 :AM调制信号输出初始化
** 函数说明 :AM调制,需要先设置好载波频率,然后改变DAC比例因子 scale factor其为14位,AM的幅度值按正弦规律变换,可以实现AM
** 最高可以采用32点采样
** 调用Write_ASF(u16 factor)来改变幅值
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void AM_Init(void)
{
AD9954_CS = 0;
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x02);//手动打开OSK打开
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//不改变任何
AD9954_SENDBYTE(0x00);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函数名称 :void Write_ASF(u16 factor)
** 函数功能 :改变scale factor数值,改变DAC输出幅度
** 函数说明 :写入最大为0X3FFF,最小为0
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void Write_ASF(u16 factor) //2ASK
{
AD9954_CS = 0;
// AD9954_SENDBYTE(0x00);//地址0写操作
// AD9954_SENDBYTE(0x02);//手动打开OSK打开
// AD9954_SENDBYTE(0x00);
// AD9954_SENDBYTE(0x20);//当受到UPDATE信号,自动清楚相位累加器 //
// // AD9954_SENDBYTE(0x00);//不改变任何
// AD9954_SENDBYTE(0x40);
// //控制相位偏移
// AD9954_SENDBYTE(0X05);
// AD9954_SENDBYTE(0X30);
// AD9954_SENDBYTE(0X00);
AD9954_SENDBYTE(0x02);//幅度
AD9954_SENDBYTE(factor >> 8);
AD9954_SENDBYTE(factor);
AD9954_CS = 1;
UPDATE();
}
void Write_Pow0(void)
{
AD9954_CS = 0;
AD9954_SENDBYTE(0X05);
// AD9954_SENDBYTE((u8)(date >> 8));//频率控制字
// AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0X10);
AD9954_SENDBYTE(0X00);
AD9954_CS = 1;
UPDATE();
}
//相位控制:相位偏移=(pow/16384)*360 pow=(相位偏移/360)*16384
void Write_Pow(double xw)
{
u16 date;
date=xw*45.511;
AD9954_CS = 0;
AD9954_SENDBYTE(0X05);
// date>>=2;
AD9954_SENDBYTE((u8)(date >> 8));//频率控制字
AD9954_SENDBYTE((u8)date);
// AD9954_SENDBYTE(0X00);
// AD9954_SENDBYTE(0X00);
AD9954_CS = 1;
UPDATE();
}
/******************************************************************
* 名 称:Linear_Sweep
* 功 能:AD9954扫频模式输出
* 参 数:MinFreq:扫频下限频率,MaxFreq:扫频上限频率
* UpStepFreq:向上扫频步进,UpStepTime:向上扫频的跳频时间
* DownStepFreq:向下扫频步进,DownStepTime:向下扫频的跳频时间
* Mode:扫频模式
* 返 回 值:无 Linear_Sweep(100, 100000000, 100, 250, 100,250, 1);
* 说 明:步进频率单位是100khz
* Mode=DoubleScan(双边扫频)时,PS0=1,即为向上扫频,但配置了
* 向下扫频的寄存器,可以直接通过PS0_WriteBit()来改变扫频方向
******************************************************************/
void Linear_Sweep(double MinFreq,double MaxFreq,double UpStepFreq,u8 UpStepTime,double DownStepFreq,u8 DownStepTime,ScanMode Mode )//0向下扫频模式,1向上扫频模式,2双边扫频
{
uint32_t FTW_Vau;
PS0=0;
PS1=0;
AD9954_CS=0;
AD9954_SENDBYTE(CFR1);
AD9954_SENDBYTE(0x02);//斜坡键控使能
AD9954_SENDBYTE(0x20);//线性频率扫描使能
AD9954_SENDBYTE(0x00);
// if (Mode & No_Dwell)
// AD9954_SENDBYTE(0x44);//使能比较器和线性扫描无停留
// else
AD9954_SENDBYTE(0x40); //使能比较器
//
//写入FTW0----最小频率
FTW_Vau = Get_FTW(MinFreq);
AD9954_SENDBYTE(FTW0);
AD9954_SENDBYTE((u8)(FTW_Vau>>24));
AD9954_SENDBYTE((u8)(FTW_Vau>>16));
AD9954_SENDBYTE((u8)(FTW_Vau>>8));
AD9954_SENDBYTE((u8)(FTW_Vau));
//写入FTW1----最大频率
FTW_Vau = Get_FTW(MaxFreq);
AD9954_SENDBYTE(FTW1);
AD9954_SENDBYTE(FTW_Vau>>24);
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
// Mode &= 0x7F;
if(Mode == DownScan)
{
PS0=0;
//写入NLSCW----下降频率步进和跳频时间
FTW_Vau = Get_FTW(DownStepFreq);
AD9954_SENDBYTE(NLSCW);
AD9954_SENDBYTE(DownStepTime); //跳频时间(DownStepTime个??周期)
AD9954_SENDBYTE(FTW_Vau>>24); //频率步进
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
PS0=0; //下降扫频
}
if (Mode == UpScan)
{
//写入PLSCW----上升频率步进和跳频时间
FTW_Vau = Get_FTW(UpStepFreq);
AD9954_SENDBYTE(PLSCW);
AD9954_SENDBYTE(UpStepTime); //跳频时间(0XFF个??周期)
AD9954_SENDBYTE(FTW_Vau>>24); //频率步进
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
PS0=1; //上升扫频
}
AD9954_CS=1;
UPDATE();
}
/******************************************************************
* 名 称:PS0_WriteBit
* 功 能:设置PS0的状态
* 参 数:BitVal:PS0状态
* 返 回 值:无
* 说 明:PS0可以控制AD9954扫频方向
******************************************************************/
void PS0_WriteBit(BitAction BitVal)
{
PS0=BitVal;
}
/*********************************************************************************************************
** 函数名称 :void DirectSwitchFSK(float f1,float f2,float f3,float f4)
** 函数功能 :四相FSK信号输出
** 函数说明 :在四个RAM区各设置了一个频率值,通过改变PS0和PS1的电平选择对应的RAM端输出相应的频率值来实现FSK,也可以实现二项的FSK;
** 通过设置定时器中断控制PS0,PS1管脚的电平就可以将二进制的编码转化为FSK信号输出
** 入口参数 :float f1:频率1
** float f2:频率2
** float f3:频率3
** float f4:频率4
** 隐含控制 PS0: 0 1 0 1
管脚参数: PS1: 0 0 1 1
** 对应控制 RAM段: 0 1 2 3
** 出口参数 :无
*********************************************************************************************************/
void DirectSwitchFSK(double f1,double f2,double f3,double f4)
{
u32 FTW_Vau;
AD9954_CS = 0;
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0xA4);//8倍频,打开VCO控制高位,系统时钟倍频后为400M
PS0=0;
PS1=0;
AD9954_SENDBYTE(0x07);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);//final address:0x000
AD9954_SENDBYTE(0x00);//start address:0x000;
AD9954_SENDBYTE(0x00);//RAM0工作于模式0,不停留位没有激活
UPDATE();
FTW_Vau=Get_FTW(f1);
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(FTW_Vau>>24); //频率步进
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
PS0=1;//ram1
PS1=0;
AD9954_SENDBYTE(0x08);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x01);//final address:0x0001
AD9954_SENDBYTE(0x04);//start address:0x0001
AD9954_SENDBYTE(0x00);//RAM1工作于模式0,不停留位没有激活
UPDATE();
FTW_Vau=Get_FTW(f2);
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(FTW_Vau>>24); //频率步进
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
PS0=0;//ram2
PS1=1;
AD9954_SENDBYTE(0x09);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x02);//final address:0x0002
AD9954_SENDBYTE(0x08);//start address:0x0002
AD9954_SENDBYTE(0x00);
UPDATE();
FTW_Vau=Get_FTW(f3);
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(FTW_Vau>>24); //频率步进
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
PS0=1;//ram3
PS1=1;
AD9954_SENDBYTE(0x0a);
AD9954_SENDBYTE(0x01);//ramp rate=0x0010
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x03);//final address:0x0003
AD9954_SENDBYTE(0x0c);//start address:0x0003
AD9954_SENDBYTE(0x00);
UPDATE();
FTW_Vau=Get_FTW(f4);
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE(FTW_Vau>>24); //频率步进
AD9954_SENDBYTE(FTW_Vau>>16);
AD9954_SENDBYTE(FTW_Vau>>8);
AD9954_SENDBYTE(FTW_Vau);
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x80);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函数名称 :void LINEARSWEEP(float f1,float f2)
** 函数功能 :线性扫面输出模式
** 函数说明 :使频率按预置的模式线性扫描上去,详细参见官方PDF
** 入口参数 :float f1:起始频率
** float f2:终止频率
** 出口参数 :无
*********************************************************************************************************/
void LINEARSWEEP(float f1,float f2)//linear sweep mode
{
u32 date;
AD9954_SCLK=0;
AD9954_RET=0;
IOUPDATE=0;
PS0=0;
PS1=0;
AD9954_CS=0;
//linear sweep mode
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x02);//
AD9954_SENDBYTE(0x20);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x02);
// AD9954_SENDBYTE(0x24);//4倍频,打开VCO控制高位,系统时钟倍频后为400M
AD9954_SENDBYTE(PLL_MULTIPLIER<<3|0x04);
date=10.7374*f1;
AD9954_SENDBYTE(0x04);//FTW0地址
AD9954_SENDBYTE((u8)(date>>24));//频率控制字
AD9954_SENDBYTE((u8)(date>>16));
AD9954_SENDBYTE((u8)(date>>8));
AD9954_SENDBYTE((u8)date);
date=10.7374*f2;
AD9954_SENDBYTE(0x06);//FTW1地址
AD9954_SENDBYTE((u8)(date>>24));//频率控制字
AD9954_SENDBYTE((u8)(date>>16));
AD9954_SENDBYTE((u8)(date>>8));
AD9954_SENDBYTE((u8)date);
AD9954_SENDBYTE(0x07);//NLSCW
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x1b);
AD9954_SENDBYTE(0xf4);
AD9954_SENDBYTE(0x08);//PLSCW
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0xa3);
AD9954_SENDBYTE(0x6f);
AD9954_CS=1;
UPDATE();
}
复制代码
所有资料51hei提供下载:
AD9954.7z
(224.66 KB, 下载次数: 64)
2019-8-6 03:01 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
爱仕达撒多所
时间:
2020-4-23 10:26
感谢分享!!!1
作者:
305305305
时间:
2021-5-1 12:58
楼主,我试了一下发现输出不是正弦波,请问是什么原因
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1