使用AD9851模块自制函数发生器

AD9851是一款输出最高达到70mhz的模块,能输出方波,正弦波两种波形,模块自带滤波器输出波形较为干净

如果要输出三角波建议选用AD9850


【使用Arduino来控制9851输出波形】


功能描述:

全串口指令操作,蓝牙串口可直接控制,附带一个App用以进行远端操作(未完成)

用一个I2C芯片转接的1602液晶显示当前频率






基于AD9851的串口操控DDS发生器



【使用串口传入数据】

线路连接定义:

电位器10K,跳线跳到模块上用于控制方波占空比
  WCLK 接 D10
  FQUP 接 D9
  REST 接 D8
  DATA 接 D7
D4,D5,D6连接下方三个按键

A4,A5接1602液晶I2C模块的 SDA和SCL

基于AD9851的串口操控DDS发生器



串口控制指令:


w数字 指定频率输出
例如:w1000  就是以1000hz输出

重置模块

源代码:
#include
#include    //包含头文件
//#include
LiquidCrystal_I2Clcd(0x27,16,2);   //创建一个对象:lcd
const int AdjustGreen = 11;
const int AdjustRed = 12;
const int WCLK = 10;
const int FQUP = 9;
const int REST = 8;
const int DATA = 7;
const int Button1 = 6;
const int Button2 = 5;
const int Button3 = 4;
int DisWave = 1000;

int FrequenceSaveSlot[9];//可以保存8个频率数据


void setup() {
  // put your setup code here, to run once:
  pinMode(AdjustGreen, OUTPUT);
  pinMode(AdjustRed, OUTPUT);
  pinMode(WCLK, OUTPUT);
  pinMode(FQUP, OUTPUT);
  pinMode(REST, OUTPUT);
  pinMode(DATA, OUTPUT);
  Serial.begin(9600);
   digitalWrite(AdjustGreen ,HIGH);
  lcd.init();        //lcd初始化函数
 lcd.backlight();       //lcd开启背光灯函数
}
void lcdPrintWave()
{
 
}

void ad9851_reset_serial()
{
  digitalWrite(WCLK, LOW);
  digitalWrite(FQUP, LOW);
  //restSignal
  digitalWrite(REST, LOW);
  digitalWrite(REST, HIGH);
  digitalWrite(REST, LOW);
  //wclkSignal
  digitalWrite(WCLK, LOW);
  digitalWrite(WCLK, HIGH);
  digitalWrite(WCLK, LOW);
  //fqupSignal
  digitalWrite(FQUP, LOW);
  digitalWrite(FQUP, HIGH);
  digitalWrite(FQUP, LOW);

}
//写数据
void DataJudge(unsigned char w)
{
  if (w == 1)
  {
   digitalWrite(DATA, HIGH);
  }
  else if (w == 0)
  {
   digitalWrite(DATA, LOW);
  }
}
void ad9851_wr_serial(unsigned char w0, double frequence)
{
  unsigned char i, w;
  long int y;
  double x;
  //计算频率的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++)
  {
    DataJudge((w>> i) & 0x01);
   digitalWrite(WCLK, HIGH);
   digitalWrite(WCLK, LOW);
  }
  //写w3数据
  w = (y >> 8);
  for (i = 0; i < 8; i++)
  {
    DataJudge((w>> i) & 0x01);
   digitalWrite(WCLK, HIGH);
   digitalWrite(WCLK, LOW);
  }
  //写w2数据
  w = (y >> 16);
  for (i = 0; i < 8; i++)
  {
    DataJudge((w>> i) & 0x01);
   digitalWrite(WCLK, HIGH);
   digitalWrite(WCLK, LOW);
  }
  //写w1数据
  w = (y >> 24);
  for (i = 0; i < 8; i++)
  {
    DataJudge((w>> i) & 0x01);
   digitalWrite(WCLK, HIGH);
   digitalWrite(WCLK, LOW);
  }
  //写w0数据
  w = w0;
  for (i = 0; i < 8; i++)
  {
    DataJudge((w>> i) & 0x01);
   digitalWrite(WCLK, HIGH);
   digitalWrite(WCLK, LOW);
  }
  //移入始能
  digitalWrite(FQUP, HIGH);
  digitalWrite(FQUP, LOW);
}
void Spiertest()
{

}

void firstLoad()
{
   ad9851_reset_serial();
  ad9851_wr_serial(0x01, 50000);
}
void loop() {
  // put your main code here, to runrepeatedly:
  String Command = {""};
 int inputdate = 0;
 int mark = 0;
 firstLoad();
 
  while (1)
  {
    while(Serial.available() > 0)
    {
     Command += char(Serial.read());
     delay(2);
    mark =1;
    }
   
    if(mark ==1)
    {
     //Serial.println(Command);//----------调试语句回传
    if(Command.length() > 0)
    {
     for (int i = 1; i < Command.length() ; i++)
     {
       if( i ==1)
       inputdate += (Command[i] - '0');
       else
       {
         inputdate = inputdate*10 + (Command[i]-'0');
       }
       DisWave = inputdate;//存储用于显示的波频率
       
     }
     switch (Command[0])
     {
       case 'w':
         ad9851_wr_serial(0x01, inputdate);
         Serial.print("CurrentFrequency:");
         Serial.print(inputdate);
         Serial.println("Hz");
         lcd.clear();
         lcd.print("Current:");
         lcd.print(DisWave); 
         lcd.print("Hz");
         break;
       case 'r':
         ad9851_reset_serial();
         break;
         default:
         break;

     }
     Command = String("");//Clear Command
     inputdate = 0;
     }
    }
    mark =0;
  }
  }



基于AD9851的串口操控DDS发生器

基于AD9851的串口操控DDS发生器




  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包含以上所有资料 DDS AD9850 AD9851 原理图 串行程序 并行程序 目 录 1 DDS 简介 1.1 产品简介 1.2 参考资料 2 DDS 的基本概念 2.1 DDS 概述 2.2 DDS 工作原理 2.3 DDS 有关名词解释 3 具体应用问题 3.1 DDS 没有输出,怎么办 3.2 哪些DDS 能直接用晶体提供时钟,哪些不能 3.3 Update 更新信号如何控制? 3.4 DDS 的扫频功能如何实现 3.5 DDS 输出级滤波器如何设计 3.6 DDS 发烫,是否正常 3.7 DDS 对输入时钟有什么要求 3.8 AD9910 的时钟输入需要注意什么? 3.9 DDS 时钟输入,DAC 输出能否使用单端模式?电路该如何接 3.10 DDS 评估板上分别有2 个变压器或2 个巴伦(Balun)有什么用处 3.11 DDS 评估板上端接电阻为50 欧,为何变压器的参数是在75 欧标定的? 3.12 ADT1-1WT 的原副边是否可以互换使用 3.13 如何同步多片DDS 芯片的输出 3.14 DDS 输出端DAC 为电流输出,怎么转换为电压,有什么限制 3.15 DDS 的AGND,DGND 应该怎样连接,接模拟地还是数字地 3.16 有些DDS 评估板上的MC100LVEL16 的用途是什么? 3.17 AD7008 已经停产,有什么可以替代 3.18 如何确定DDS 寄存器的值 3.19 DDS 的评估板软件对操作系统有什么要求 3.20 DDS 除了正弦波,还能产生别的波形么 3.21 用DDS 有什么好处 3.22 ADI 的DDS 捷变频能力为多少 3.23 有无DDS 的参考程序代码 3.24 如何使用DDS 进行幅度调制 3.25 如何用AD5930 来产生一个单频信号 3.26 为什么DDS 输出的幅度会随频率的增加而减小 3.27 DDS 输出电压的幅度如何计算 3.28 应该用什么样的仪器来调试DDS 3.29 输出杂散较大,怎么办

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值