Arduino + AD9851 DDS信号模块 频率控制字和相位控制字写入

AD9851是美国模拟器件公司采用先进DDS直接数字频率合成技术生产的高集成度产品。AD9851是在AD9850的基础上,做了一些改进以后生成的具有新功能的DDS芯片。当系统时钟为180MHz时,在参考时钟输入端,只需输入30MHz的参考时钟即可。AD9851是由数据输入寄存器、频率/相位寄存器、具有6倍参考时钟倍乘器的DDS芯片、10位的模/数转换器、内部高速比较器这几个部分组成。其中具有6倍参考时钟倍乘器的DDS芯片是由32位相位累加器、正弦函数功能查找表、D/A变换器以及低通滤波器集成到一起。这个高速DDS芯片时钟频率可达180MHz,输出频率可达70MHz,分辨率为0.04Hz 。模块框图如下:


模块电路图如下:


        电路主要由两部分电路构成:AD9851核心电路和7阶无源滤波电路。输出信号为两路互补正弦波信号和两路互补方波信号,同时采用SMA射频接口输出;AD9851芯片DDS输
出形式串联或并联用一个短路套在J2插针上选择,方便选择需要的程序实现不同形式输出。
    AD9851核心电路参考芯片手册上的应用电路设计。信号由+SV供电,在芯片的电源引脚焊接10uF钽电容和100nF贴片电容,用作电源去耦。系统采用同一块地,保持地的完整性,在信号频率较大时,减小地的阻抗。30MHz的有源晶振电路中,+5 V的供电电源添加二型滤波电路,减少电源对时钟信号的干扰。
    AD9851芯片内部的两路DAC是电流输出型的,输出电流可通过电阻R10调节Ⅰout=39.9/R10。本模块电路R10=3.9kΩ ,输出电流Ⅰout=10mA,Ⅰout1和Ⅰout2引脚并接一个100Ω电阻(R3、 R11)到地,所以AD9851的互补正弦波信号输出幅值Vout=Ⅰout×100=1V。可通过更换电阻Rio或电阻R3,  R11,得到需要输出的信号电压值。AD9851电流型输出转换成电压后经过7阶无源LC低通滤波,由于做了阻抗匹配,正弦波的最后输出电压为Vout/2=500mV,而方波输出直接串联电阻到射频头,占空比通过电位器RW1调节。


模块实物图:


左上角J1跳帽断开:并行模式(两排都要接)

                        合上:串行模式(只需使用D7,WCLK,FQUP,REST四个引脚)

左下角J3跳帽断开:输出幅值为I-R外接电位

                        合上:固定约1V输出

右上角J2跳帽断开:VD_P和VD_N引脚不产生方波

                        合上:产生方波

右下角两个排针:输出正弦波

左上角电位器:产生可变电位输出,调节方波的占空比(比较器的比较电位,也可通过跳帽选择VINN引脚外部电压控制)

另:本AD9851模块采用30MHz有源晶振,可倍频至180MHz。


右侧输出引脚:

VINP:比较器信号输入

VINN:比较器比较电位

GND:地

OUT:正弦波输出(通过70MHz低通滤波,使输出波形的信噪比更好)

GND:地

VD_N:方波1

VD_P:方波2



接线图(串行模式):

AD9851 |  Arduino

————————

GND |   GND

D7 |   5

WCLK |   2

FQUP |   3

REST | 4

VCC | VCC


网上只有C51的程序,看了一下程序,其实只要控制各个引脚的电平变化就行了(上个星期的课刚好讲到串行通信),按照C51的程序做简单的移植就可以用了;

程序:

#define ad9851_w_clk 2
#define ad9851_fq_up 3
#define ad9851_rest 4
#define ad9851_bit_data 5

void setup() {
  pinMode(ad9851_w_clk, OUTPUT);
  pinMode(ad9851_fq_up, OUTPUT);
  pinMode(ad9851_rest, OUTPUT);
  pinMode(ad9851_bit_data, OUTPUT);
  pinMode(13, OUTPUT);
  digitalWrite(ad9851_w_clk, 0);
  digitalWrite(ad9851_fq_up, 0);
  digitalWrite(ad9851_rest, 0);
  digitalWrite(ad9851_bit_data, 0);

  Serial.begin(9600);
  Serial.println("init complete!");
}

void loop() {
  ad9851_reset_serial();
  ad9851_wr_serial(0x01, 500);
  //0x01为开六倍频
  //ad9851_wr_serial(0x00, 500);
  //0x00为不开六倍频
  digitalWrite(13, 0);
  delay(500);
  digitalWrite(13, 1);
  delay(500);
  digitalWrite(13, 0);
  delay(500);
  digitalWrite(13, 1);
  delay(500);
  
  ad9851_reset_serial();
  ad9851_wr_serial(0x01, 2000);

}

//***************************************************//
//              ad9851复位(串口模式)               //
//---------------------------------------------------//
void ad9851_reset_serial()
{
  digitalWrite(ad9851_w_clk, 0);
  digitalWrite(ad9851_fq_up, 0);
  //rest信号
  digitalWrite(ad9851_rest, 0);
  digitalWrite(ad9851_rest, 1);
  digitalWrite(ad9851_rest, 0);
  //w_clk信号
  digitalWrite(ad9851_w_clk, 0);
  digitalWrite(ad9851_w_clk, 1);
  digitalWrite(ad9851_w_clk, 0);
  //fq_up信号
  digitalWrite(ad9851_fq_up, 0);
  digitalWrite(ad9851_fq_up, 1);
  digitalWrite(ad9851_fq_up, 0);
}
//***************************************************//
//          向ad9851中写命令与数据(串口)           //
//---------------------------------------------------//
void ad9851_wr_serial(unsigned char w0, double frequence)
{
  unsigned char i, w;
  long int y;
  double x;
  int bit_data;
  //计算频率的HEX值
  x = 4294967295 / 180; //适合180m晶振/180为最终时钟频率(或30m六倍频)
  //如果时钟频率不为180MHz,修改该处频率值,单位为MHz
  frequence = frequence / 1000000;
  frequence = frequence * x;
  y = frequence;
  //写w4数据
  w = (y >>= 0);
  for (i = 0; i < 8; i++)
  {
    bit_data = (w >> i) & 0x01;
    digitalWrite(ad9851_bit_data, bit_data);
    digitalWrite(ad9851_w_clk, 1);
    digitalWrite(ad9851_w_clk, 0);
  }
  //写w3
  w = (y >> 8);
  for (i = 0; i < 8; i++)
  {
    bit_data = (w >> i) & 0x01;
    digitalWrite(ad9851_bit_data, bit_data);
    digitalWrite(ad9851_w_clk, 1);
    digitalWrite(ad9851_w_clk, 0);
  }
  //w2
  w = (y >> 16);
  for (i = 0; i < 8; i++)
  {
    bit_data = (w >> i) & 0x01;
    digitalWrite(ad9851_bit_data, bit_data);
    digitalWrite(ad9851_w_clk, 1);
    digitalWrite(ad9851_w_clk, 0);
  }
  //w1
  w = (y >> 24);
  for (i = 0; i < 8; i++)
  {
    bit_data = (w >> i) & 0x01;
    digitalWrite(ad9851_bit_data, bit_data);
    digitalWrite(ad9851_w_clk, 1);
    digitalWrite(ad9851_w_clk, 0);
  }
  //w0
  w = w0;
  for (i = 0; i < 8; i++)
  {
    bit_data = (w >> i) & 0x01;
    digitalWrite(ad9851_bit_data, bit_data);
    digitalWrite(ad9851_w_clk, 1);
    digitalWrite(ad9851_w_clk, 0);
  }
  //移入使能
  digitalWrite(ad9851_fq_up, 1);
  digitalWrite(ad9851_fq_up, 0);
}

并行模式接线太麻烦就不写了XD

以上只是控制输出频率(注意写入顺序,相位控制及倍频控制字w0最后写入)。


关于相位控制字:

芯片的datasheet相位控制部分截取如下:

w0的高5位是信号的相位,2的5次方平分360度;

位2是掉电控制位1有效;

位1写0;

位0是6倍频控制位1有效。


例:

w0 = 0b00001001 = 0x09 //相位设置为11.25度,开启六倍频

w0 = 0b00010001 = 0x0B //相位设置为22.50度,开启六倍频



  • 13
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值