13
2021
07

AD9834驱动

//AD9834.h
#ifndef _AD9834_H_
#define _AD9834_H_

#include <STC12C5A60S2.H>

#define FCLK        12000000   //50MµÄ¾§Õñ
#define FREQ_0      0
#define FREQ_1      1 

sbit FSYNC = P1^0;   
sbit SCLK  = P1^1;
sbit SDATA = P1^2;   
sbit RESET = P1^3;

void Send_Con(unsigned int Con_word) ;
void Send_Freq(unsigned int Freq_word);
void Send_Phase();
void writing_Freq(unsigned char freq_number, unsigned long Freq_value);

#endif
//AD9834.c
#include <STC12C5A60S2.H>
#include <ad9834.h>

/*****************************************************  
AD9834波形产生程序  
*****************************************************/   
  

/**************************  
发送控制字  
**************************/   
void Send_Con(unsigned int Con_word)   
{   
   unsigned char i;    
   FSYNC =0;   			   //低电平使数据有效
   for(i=0;i<16;i++)   	   //传输16位控制字
   {   
      SDATA =Con_word&0x8000;   //最高位不变,最高位赋给SDATA 
      Con_word<<=1;   			//控制字左移一位,准备下一次
      SCLK =0;   				//产生下降沿,传输SDATA
      SCLK =1;   
   }    
   FSYNC =1;    				//高电平,无效
}   
   
/****************************  
发送频率字  
****************************/   
void Send_Freq(unsigned int Freq_word)   
{   
   unsigned char i;     
   FSYNC =0;   			   //低电平使数据有效
   for(i=0;i<16;i++)   	   //传输16位频率字
   {   
      SDATA =Freq_word&0x8000;  //最高位不变,最高位赋给SDATA 
      Freq_word<<=1;   			//频率字左移一位,准备下一次
      SCLK =0;   				//产生下降沿,传输SDATA
      SCLK =1;   
   }    
   FSYNC =1;    				//高电平,无效
}   
   
/*****************************  
发送相位字  
注:根据情况可设定入口参数,设置相位  
*****************************/   
void Send_Phase()   
{   
   Send_Con(0xC000);   //设置初相位为0   
}   
   
   
/*******************************************************  
设置频率值   
Freq_value(value)=Freq_data(data)*FCLK/2^28  
2^28=268435456=0x10000000  
*******************************************************/   
void writing_Freq(unsigned char freq_number, unsigned long Freq_value)   
{  
    unsigned long FREQREG = (unsigned long)(268435456.0/FCLK*Freq_value);
    
    unsigned int LSB_D = (unsigned int)FREQREG;
    unsigned int MSB_D = (unsigned int)(FREQREG>>14);
    
    if(freq_number == FREQ_0)
    {
        LSB_D &= ~(1U<<15);
        LSB_D |= 1<<14;
        MSB_D &= ~(1U<<15);
        MSB_D |= 1<<14;
    }
    else
    {
        LSB_D &= ~(1<<14);
        LSB_D |= 1U<<15;
        MSB_D &= ~(1<<14);
        MSB_D |= 1U<<15;
    }
    
    Send_Freq(LSB_D);
    Send_Freq(MSB_D);
     
}

我自己写的AD9834的示例工程,仅供参考

AD9834.zip

中文手册

AD9834-中文完整资料.pdf


« 上一篇 下一篇 »

返回顶部
请先 登录 再评论,若不是会员请先 注册