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

📄 ad9954.c

📁 1、直接数字频率合成的单片机代码。 2、重要采用ADI公司提出的DDS芯片AD9954来实现直接数字频率合成。
💻 C
字号:
#include <reg51.h>
#include "AD9954.h"

unsigned long CFR1 = 0;                          
unsigned long CFR1SLAVE = 0x00800000;            
unsigned long CFR2 = 0x00000024;                    
unsigned long ASF;
unsigned long ARR;  
unsigned long FTW0;                           
unsigned long POW0;                              
unsigned long FTW1;
unsigned long NLSCW;
unsigned long PLSCW;
unsigned long multfreq = 0xffffffff; //计算频率控制字的系数


/***********************************************************************
** 函数名称: 	端口操作
** 功能描述: 	AD9954端口基本操作
** 输 入: 	无     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void SCLK_0(void)
{ 
  SCLK = 0;
}


void SCLK_1(void)
{
  SCLK = 2;
}


void SDIO_0(void)
{
  SDIO = 0;
}


void SDIO_1(void)
{
  SDIO = 1;
}


void CS_Enable(void)
{
  CS = 0;
}


void CS_Disable(void)
{
  CS = 1;
}

void CS2_Enable(void)
{
  CS2 = 0;
}

void CS2_Disable(void)
{
  CS2 = 1;
}

void IO_UPDATE_0(void)
{
  IO_UPDATE = 0;
}

void IO_UPDATE_1(void)
{
  IO_UPDATE = 1;
}

void IO_SYNC_1(void)
{
  IO_SYNC = 1;
}

void IO_SYNC_0(void)
{
  IO_SYNC = 0;
}

void PS0_Set_High(void)
{
  PS0 = 1;
}

void PS0_Set_Low(void)
{
  PS0 = 0;
}

void PS1_Set_High(void)
{
  PS1 = 1;
}

void PS1_Set_Low(void)
{
  PS1 = 0;
}


/***********************************************************************
** 函数名称: 	IO9954_Init
** 功能描述: 	IO_Init
** 输 入: 	    无      
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void IO9954_Init()
{
	CS2  = 0;
	P0   = 0x00;
	}

/***********************************************************************
** 函数名称: 	nNop
** 功能描述: 	US级软件延时(不精确)
** 输 入: 	延时参数,值越大时延时越久      
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void nNop(unsigned long nValue)
{
  unsigned long i;
  for(i=nValue;i>0;i--);
}

/***********************************************************************
** 函数名称: 	WriteByte
** 功能描述: 	向AD9954发送一字节数据 MSB FIRST
** 输 入: 	unsigned char data   发送的数据     
** 输 出:      无
** 全局变量:	无
** 调用模块: 	端口操作 nNop
***********************************************************************/
void WriteByte(unsigned char Data)
{
  unsigned char k;
  for(k=0;k<8;k++) 
  { 
   SCLK_0();
   nNop(4);
   if((Data&0x80) == 0x80)
     SDIO_1();
   else
     SDIO_0();
   Data = Data << 1;
   nNop(2);
   SCLK_1();
   nNop(4);
  }
}


/***********************************************************************
** 函数名称: 	ReadByte
** 功能描述: 	从AD9954读取一字节数据 MSB FIRST
** 输 入: 	无   
** 输 出:      unsigned char 读回的数据
** 全局变量:	无
** 调用模块: 	端口操作 
***********************************************************************/
unsigned char ReadByte(void)
{
 unsigned char Data=0;
 unsigned char k;
 SDIO = 0;
 for(k=0;k<8;k++)
   { 
    SCLK_0();
    nNop(1);
    nNop(1);
    SCLK_1();
    nNop(1);
    nNop(1);
    Data = Data << 1;
    if(SDIO)
	  {
            Data |= 0x01;
          } 
   }
  SDIO = 1;
  return Data;
}



/***********************************************************************
** 函数名称: 	RW_Reg
** 功能描述: 	AD9954读写寄存器操作
** 输 入: 	unsigned char addr  寄存器地址
**              unsigned char *buf  写寄存器: 指向发送数据的指针
**                                  读寄存器: 指向读回数据的指针
**              unsigned char num   发送或读回的数据长度 num Byte
**              unsigned char rw    读写选择 1 读  0 写
** 输 出:      无
** 全局变量:	无
** 调用模块: 	ReadByte  WriteByte
***********************************************************************/
void RW_Reg(unsigned char addr,unsigned char *buf,unsigned char num,
            unsigned char rw)
{
 unsigned char ins;// instruction byte
 if(rw == 1)
   {
    ins = addr | 0x80;
    WriteByte(ins);
     do{
	   buf[num-1] = ReadByte();
	   num--;
           nNop(5);
      }
    while(num);
   }
 else
   {
     ins = addr;
     WriteByte(ins);
	do{
	   WriteByte(buf[num-1]);
	   num--;
           nNop(5);
          }
	while(num);   
   }
}


/***********************************************************************
** 函数名称: 	AD9954_Write_Reg
** 功能描述: 	AD9954写寄存器操作
** 输 入: 	unsigned long command  写入寄存器的指令
**              unsigned char num      发送或读回的数据长度 num Byte
**              unsigned char addr     寄存器地址
** 输 出:      无
** 全局变量:	无
** 调用模块: 	RW_Reg
***********************************************************************/
void AD9954_Write_Reg(unsigned long command,unsigned char num,unsigned char addr)
{
  unsigned char temp_com[5] = {0,0,0,0,0};
  unsigned char i;
  unsigned long temp;
  temp = command;
  for(i = 0;i < num;i++)
  {
    temp_com[i] = (temp & 0xff);
    temp = temp >> 8;
  } 
  RW_Reg(addr,temp_com,num,0);
}



/***********************************************************************
** 函数名称: 	FTW_Float
** 功能描述: 	将浮点型频率值MHZ 转换成频率控制字
** 输 入: 	float freqfloat    浮点型频率值MHZ        
** 输 出:      unsigned long      4 byte 频率控制字
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
unsigned long FTW_Float(float freqfloat)
{
  unsigned long temp = 0;
  float freqf = 0;
  freqf = freqfloat / 400;    //AD9954主频400MHZ
  temp = (freqf * multfreq);
  return(temp);
}

/***********************************************************************
** 函数名称: 	更新寄存器操作
** 功能描述: 	每次更新寄存器的固定操作
** 输 入: 	无      
** 输 出:      无
** 全局变量:	无
** 调用模块: 	无
***********************************************************************/
void AD9954_Updata_First(void)
{
 IO9954_Init();
 CS_Enable();
 IO_SYNC_1();
 nNop(40);
 IO_SYNC_0();
 IO_UPDATE_0();
}

void AD9954_Updata_Final(void)
{
 CS_Disable();
 nNop(20);
 IO_UPDATE_1(); 
}


/*****************************************************************************
*                                 Single-Tone Mode
******************************************************************************/
/***********************************************************************
** 函数名称: 	AD9954_SingleTone_Init
** 功能描述: 	AD9954 Single-Tone Mode  初始化 
** 输 入: 	无       
** 输 出:      无
** 全局变量:	CFR1 CFR2   AD9954 功能控制寄存器
** 调用模块: 	AD9954_Write_Reg
***********************************************************************/
void AD9954_SingleTone_Init(void)
{ 
 CFR1 = 0x00000000;
 AD9954_Updata_First();
 AD9954_Write_Reg(CFR2,3,0x01);    //控制寄存器2
 AD9954_Write_Reg(CFR1,4,0x00);    //控制寄存器1
 AD9954_Updata_Final();
}

/***********************************************************************
** 函数名称: 	AD9954_SingleTone_Freq
** 功能描述: 	更新频率控制
** 输 入: 	无       
** 输 出:      无
** 全局变量:	FTW0
** 调用模块: 	AD9954_Write_Reg   更新寄存器操作
***********************************************************************/
void AD9954_SingleTone_Freq(float freq)
{ 
 FTW0 = FTW_Float(freq);
 AD9954_Updata_First();
 AD9954_Write_Reg(FTW0,4,0x04);      //设置全局输出频率
 AD9954_Updata_Final();
}



/***********************************************************************
** 函数名称: 	AD9954_Amplitude_Change
** 功能描述: 	手动改变输出幅度
** 输 入: 	无       
** 输 出:      无
** 全局变量:	ASF
** 调用模块: 	AD9954_Write_Reg   更新寄存器操作
***********************************************************************/
void AD9954_Amplitude_Change(void)
{
  CFR1 |= OSKEN;
  CFR1 &= ~AOSK;
  AD9954_Updata_First();
  AD9954_Write_Reg(CFR1,4,0x00);          
  AD9954_Write_Reg(ASF,2,0x02);
  AD9954_Updata_Final();
}



/***********************************************************************
** 函数名称: 	AD9954_Phase_Change
** 功能描述: 	改变输出相角  0<=phase<=360
** 输 入: 	double phase  浮点型相角值      
** 输 出:      无
** 全局变量:	POW0
** 调用模块: 	AD9954_Write_Reg   更新寄存器操作
***********************************************************************/
void AD9954_Phase_Change(double phase)  //   0<=phase<=360
{
  POW0=(unsigned int)(phase*45.511111111);
  AD9954_Updata_First();    
  AD9954_Write_Reg(POW0,2,0x05);
  AD9954_Updata_Final();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -