AD9954

/*********************************************************************************************************
** 程序名称 :键盘扫描程序
** 作    者 :郑增亮
** 修改日期 :2011年7月29日
** 版    本 :V1.0
** 来源于华南师范大学天蓝工程组
*********************************************************************************************************/
#include <stm32f10x_lib.h>   
#include "ad9954.h"
#include "delay.h"
/*********************************************************************************************************
** 函数名称 :void GPIO_AD9954_Init(void)
** 函数功能 :AD9954接口IO初始化
** 函数说明 :PS0----------------PE0  OUT
**      PS1----------------PE1  OUT
**            IOUPDATE-----------PE2  OUT
**            AD9954_SDIO--------PE3      OUT
**      AD9954_SCLK--------PE4  OUT
**            AD9954_CS----------PE5  OUT
**            AD9954_RES---------PE6      OUT
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void GPIO_AD9954_Init(void)
{
RCC->APB2ENR|=1<<6;//开启E时钟
GPIOE->CRL&=0X00000000;
GPIOE->CRL|=0X33333333;
GPIOE->ODR|=0X00FF;//上拉输出
}
/*********************************************************************************************************
** 函数名称 :void AD9954_RESET(void)
** 函数功能 :复位AD9954
** 函数说明 :不复位也可以
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void AD9954_RESET(void)
{
AD9954_RES=0;
AD9954_RES=1;
delay_us(100);
AD9954_RES=0;
AD9954_CS=0;
AD9954_SCLK=0; 
PS0=0;
PS1=0;
IOUPDATE=0;
}
/*********************************************************************************************************
** 函数名称 :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;
}
}
/*********************************************************************************************************
** 函数名称 :void UPDATE(void)
** 函数功能 :产生一个更新信号,更新AD9954内部寄存器,
** 函数说明 :可以不加任何延时
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void UPDATE(void)
{
// IOUPDATE=0;
// delay_us(10);
IOUPDATE=1;
// delay_us(1);
IOUPDATE=0;
}
/*********************************************************************************************************
** 函数名称 :void AD9954_Init(void))
** 函数功能 :初始化AD9954的管脚和最简单的内部寄存器的配置,
** 函数说明 :默认关掉比较器的电源,因板上的晶振为100MHz,最大采用了4倍频,为400M
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void AD9954_Init(void)
{
AD9954_SCLK=0;
AD9954_RES=0;
日本生命公司破产IOUPDATE=0;
PS0=0;
PS1=0;
AD9954_CS=0;
delay_us(1);
//single tone
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);//比较器power down 
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x24);//4倍频,打开VCO控制高位,系统时钟倍频后为400M
// AD9954_CS=1;
}
/*********************************************************************************************************
** 函数名称 :void AD9954_SETFRE(float f)上海海洋大学学报
** 函数功能 :设置AD9954当前的频率输出,采用的是单一频率输出
** 函数说明 :因为采用的浮点数进行计算,转换过程中会出现误差,通过调整可以精确到0.1Hz以内
** 入口参数 :欲设置的频率值
** 出口参数 :无
*********************************************************************************************************/
void AD9954_SETFRE(float f)//single tone
{
u32 date;
AD9954_CS=0;
date=(u32)(10.7374*f);//det=(f/fclk)x2^32=10.7374xf
AD9954_SENDBYTE(0x04);//FTW0地址
AD9954_SENDBYTE((u8)(date>>24));//频率控制字
AD9954_SENDBYTE((u8)(date>>16));
AD9954_SENDBYTE((u8)(date>>8));
AD9954_SENDBYTE((u8)date);
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_RES=0;
IOUPDATE=0;
PS0=0;
PS1=0;
AD9954_CS=0;
/
/linear sweep mode
AD9954_SENDBYTE(0x00);//地址0写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x20);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
AD9954_SENDBYTE(0x01);//地址1写操作
AD9954_SENDBYTE(0x00);//
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x24);//4倍频,打开VCO控制高位,系统时钟倍频后为400M
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);//RLSCW
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x01);
AD9954_SENDBYTE(0xa3);
AD9954_SENDBYTE(0x6f);
AD9954_CS=1;
UPDATE();
}
/*********************************************************************************************************
** 函数名称 :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  0
** 对应控制 RAM段:0  1 2  3
** 出口参数 :无
*********************************************************************************************************/
void DirectSwitchFSK(float f1,float f2,float f3,float f4)
{
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(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=(u32)(10.7374*f1);//det=(f/fclk)x2^32=10.7374xf
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE((u8)(date>>24));//频率控制字
AD9954_SENDBYTE((u8)(date>>16));药用植物学论文
AD9954_SENDBYTE((u8)(date>>8));
AD9954_SENDBYTE((u8)date);
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=(u32)(10.7374*f2);//det=(f/fclk)x2^32=10.7374xf
AD9954_SENDBYTE(0x0
b);
AD9954_SENDBYTE((u8)(date>>24));//频率控制字
AD9954_SENDBYTE((u8)(date>>16));
AD9954_SENDBYTE((u8)(date>>8));
AD9954_SENDBYTE((u8)date);
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=(u32)(10.7374*f3);
AD9954_SENDBYTE(0x0b);
AD9954_SENDBYTE((u8)(date>>24));//频率控制字
AD9954_SENDBYTE((u8)(date>>16));
AD9954_SENDBYTE((u8)(date>>8));
AD9954_SENDBYTE((u8)date);
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=(u32)(10.7374*f4);
AD9954_SENDBYTE(0x0b);
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);
// AD9954_SENDBYTE(0x80);//打开RAM控制位驱动FTW
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x00);
AD9954_SENDBYTE(0x40);
UPDATE(); 
AD9954_CS=1;
}
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(0x24);//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(0
x08);//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(float 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_SENDBYT

本文发布于:2024-09-22 03:57:59,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/158297.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:控制   频率   函数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议