基于AD5626的10-20KHz正弦波发生器
51单片机驱动AD5626生成10-20KHz的正弦波信号,信号的幅值频率以及直流偏置可通过串口配置。
标签
模拟
ADALP2000
AD5626
正弦信号发生器
qewtry
更新2023-05-16
652

一、项目要求:

   1.使用串行DAC AD5626设计一款任意波形发生器;
   2.输出信号幅度要达到3Vpp,直流偏移可调1.5V到3.5V;
   3.搭配单片机或FPGA或其它方式的控制逻辑能够产生10Hz到20KHz范围内的正弦波信号;
   4.使用ADALP2000套件中的运算放大器搭建一个Sallen-Key滤波器,滤除40KHz以上的混叠信号,输出运算放大器也选自ADALP2000套件
 
二、方案确定:
      按照题目要求确定硬件框架如下:电源由USB接口提供;主控芯片通过SPI驱动ad5626生成正弦波信号,经过低通滤波器滤除40KHz混叠信号,最后添加直流偏置后输出。参数调节部分可使用电位器或者使用PC发送命令来实现。另外为获得较好的信号质量,需画图制板。
FmqgdT4jJgsTPtuorCHlUnL3GNIA
 
      1.AD5626是一块单电源5V供电的12位串行输入DAC芯片,输出电压范围是0-4095mV即分辨率为1毫伏,SPI通讯速率为20M。内部包含DAC,移位寄存器,基准电压源和一个轨到轨放大器如下图:
   FsltrQLQdarpyyDzQGUcRMCsGwjq
 
      2.AD5626的电压输出范围为0-4.096V,满足3Vpp需求。信号直流偏置可以用可调电位器配合运放来做,或者使用带DAC的单片机来调节。
 
      3.题目要求信号频率要做到20KHz,对照AD5626通讯时序计算可得,更新一次数据至少需要780ns,即更新速率1.28MHz。可得波表长度为64位;
FsMT4JRr67bigUm6WsT6Y_JgcDXy
 
      sallen_key低通滤波器选用adalp2000套件中的OP484运放,滤波器外围电路由ADI滤波器设计工具确定。
      主控选用EFM8LB单片机,主频72MHz,SPI通讯速率可以跑到18MHz,有一路12位DAC。满足以上需求。
三、硬件原理图:
 
      硬件图纸使用立创EDA绘制,原理图如下:
      电源部分原理图:
FnKZa8gLOglToGFndyihnAFo1x4E
      整个系统的5V输入由USB接口接入,经过滤波后给AD5626供电。使用U6 TPS78233 线性稳压芯片将5V转换为3.3V电源给单片机供电。为了获得更宽的信号输出范围,使用了U8芯片LM2776电荷泵芯片,将输入的5V电源转换为-5V。正负5V电源用来给AD5626以及滤波电路供电。
      滤波偏置电路原理图:Fjj4UUMaI5drdPRtrv8FPcTTfFLG
 
      正弦波信号由R46输入,sallen_key低通滤波器滤波后(滤波电路参数由ADI滤波器设计工具给出),再经过C27电容隔直,输入给电压偏置电路。此处电压偏置电压可以由R23电位器给出,调节范围是0-5V;也可以由单片机dac给出,EFM8LB1单片机的DAC输出范围是0-3V,为满足题目中1.5V-3.5V偏置调节范围,此处设置R36//(R42+R30)例比为3/10,计算的偏置调节范围是1.5V-3.6V。
      使用ltspice搭建电路仿真幅频特性曲线如下:
Fjn1Hg6jlZ5x6YcR7AAsIy_RzVvk
      原理图中预留了另外两家的DAC芯片,TI的DAC7311和思瑞浦TPC112S。用来对比测试(因时间关系以下未测试)TPC112S需要配置一路外部电压参考,此处选用TL431A芯片。DAC7311选用的电源和参考电压共用一个引脚此处选用LM4040BIM3-3.0芯片。三个DAC输出信号由模拟开关bl1551切换。
      另外预留一路信号输入电路,用于自检。Fmc31yYXPnAydekukpkQLD618_Ql
      信号调节电路:
      FqfL3oH1Y54EslF6goJy7yF-yzpQ
      信号的频率,幅值以及偏置电压的调节可以通过按键设置,或者使用PC直接发送命令给单片机。此处选用上位机串口助手来调节,发送命令格式:[交直流],[频率],[幅值],[偏置mV] /r/n;例如:AC,1000,100,100
      关于串扰:
      本系统中既存在数字电路,又有模拟电路,调试过程中发现单片机的SPI最高可以跑到36MHz,AD5626也可以正常工作,所以最终确定使用36MHz通讯速率。但是过高的数字开关频率会带来电源的波动,SPI的CLK信号会经电源串扰到模拟电路部分。最终导致输出信号被污染。
      因此采用以下措施进行规避:
      1.模拟电路接地宜采用单点接地。即通过0欧电阻接到数字地面;
      2.模拟器件电源前面需添加磁珠滤波电容;
      3.PCB使用四层板,布局时将数字地与模拟地分割开来;
      4.使用SMA接口输出信号;
四、代码调试:
      EFM8单片机调试工具我用的是simplicity studio,是芯科的官方开发平台。其中芯片外设的配置非常方便,选择需要的外设配置完,直接生成初始化代码。
      FlxjmvGqNfjvK-Di199b4ODSN70Q
 
      波表      
      51单片机为单核MCU,算力有限。为获得更高的实时性,需事先使用excel算好正弦波波表,再将波表写到单片机内部。此处我生成了一个长度为256,位宽为12位的波表,并将它的高4位和低8位分别存入两个数组。
      时序
      SPI通讯是单向的即:只需要单片机向AD5626发送数据,没有返回数据,所以可以屏蔽SPI的状态判断。定时向SPI0DAT写入数据即可。
  while (AC)
    {
      ad5626_ldac = 1;
      ad5626_cs = 0;                             //AD5626片选引脚拉低
      SPI0DAT = sin_temp_h;
      SPI0DAT = sin_temp_l;
      sin_temp_h = main_calculate_h[count];    //数据高四位
      sin_temp_l = main_calculate_l[count];    //8位数据低位
//    _nop_();
//    _nop_();
      count = count + 2;                         //调频率
      ad5626_cs = 1;                             //上一个数据的CS置零,利用函数返回时间来节省时间
      ad5626_ldac = 0;                           //下降沿输出

#pragma asm                                      //插入一段汇编用来精确延时
      MOV R5, asm_delay_h
      TSR1:MOV R6, asm_delay_l
      DJNZ R6,$
      DJNZ R5, TSR1

      //延时递减
#pragma endasm

// $[Generated Run-time code]
// [Generated Run-time code]$
    }
      幅值处理
      初始正弦波表是一段固化再flash中的数组,无法二次赋值,所以需要定义两个相同大小的数组来当作显存。当接收到串口发送过来的目标幅值后,就需要对波表数据进行重新计算,计算过程如下:
  while (calculate)                                 //幅值限制
    {
      for (i = 0; i < 255; i++)                    //循环256次来处理高四位波表显存数据
        {
          amp_temp = sin_code_h[i];
          amp_temp = (amp_temp << 8) + sin_code_l[i];
          amp_temp = (amp_temp * 1000 / 4096 * calculate) / 1000;
          main_calculate_h[i] = amp_temp >> 8;
        }
      for (i = 0; i < 255; i++)                    //循环256次来处理低8位波表显存数据
        {
          amp_temp = sin_code_h[i];
          amp_temp = (amp_temp << 8) + sin_code_l[i];
          amp_temp = (amp_temp * 1000 / 4096 * calculate) / 1000;
          main_calculate_l[i] = amp_temp;
        }

      AC = 1;                                     //回到主循环
      DC = 0;                                     //失能DC模式
      calculate = 0;                              //杀掉自己释放资源
    }
      频率计算
      单片机制作信号发生器是非常痛苦的事情,因为它只能同通过调节延时长短来获得目标频率,调频逻辑是形如y=1/x是反比例函数。且10-20KHz的跨度较大,单一波表无法满足这么宽的动态范围,所以就需要根据不同的频率段选择不同的波表长度,代码处理部分如下:
FoqA012Sxn6sTwxoNSqRgg5ceGYn
 frequence=(UART_Buffer[3]-0x30)*10000+(UART_Buffer[4]-0x30)*1000+
          (UART_Buffer[5]-0x30)*100+(UART_Buffer[6]-0x30)*10+
          (UART_Buffer[7]-0x30);

      if((4<=frequence)&&(frequence<400))
        {
          AC_low = 1;
          AC = 0;count=0;
          sin_seg=1;
          asm_delay_h=1;
          asm_delay=(main_clock/(256*frequence/sin_seg)-main_clock/685975)/19;      //根据频率 反算延时长度
        }
      else if((400<=frequence)&&(frequence<5022))
            {
          AC_low = 0;
          AC = 1;count=0;
              sin_seg=2;
              asm_delay_h=1;
              asm_delay_l=(main_clock/(256*frequence/sin_seg)-main_clock/1125000)/7;  //根据频率 反算延时长度
            }
      else if((5022<=frequence)&&(frequence<10045))
            {
          AC_low = 0;
          AC = 1;count=0;
              sin_seg=4;
              asm_delay_h=1;
              asm_delay_l=(main_clock/(256*frequence/sin_seg)-main_clock/1125000)/7;
            }

      else if((10045<=frequence)&&(frequence<20089))
            {
          AC_low = 0;
          AC = 1;count=0;
              sin_seg=8;
              asm_delay_h=1;
              asm_delay_l=(main_clock/(256*frequence/sin_seg)-main_clock/1125000)/7;
            }

      else if((20089<=frequence)&&(frequence<100000))
            {
          AC_low = 0;
          AC = 1;count=0;
              sin_seg=16;
              asm_delay_h=1;
              asm_delay_l=(main_clock/(256*frequence/sin_seg)-main_clock/1125000)/7;
            }
五、效果展示:
      10-20KHz信号输出
lvvzfSnoTl7gLvTBICFBEBGkSF81
      1.5V-3.5V电压偏置调节
      FvzZyW2rWhbzwhc4PRkw5WpTlwnD
      sallen_key滤除40KHz信号
      lrApiUFi48eWywlIs58pxLyUIzAa
六、不足:
      1.输出信号串入了CLK干扰信号,使得分辨率达不到1mV,发挥不出AD5626的性能;
      2.电源使用usb扩展坞供电,纹波比较大,需要优化。
FnrRJHMUWJ-vQJ3U8kFZQ5Vx8Y-d
七、心得体会:
      通过对调试AD5626,让我对串行DAC芯片有了直观的认识,受益匪浅;
软硬件
电路图
附件下载
BackupProjects_qewtry_personal_0_20230512.zip
立创工程
Draft6.asc
ltspice sallen_key 仿真
EFM8LB11F32E-DDS.zip
simplicity studio 工程
团队介绍
长草的小破号
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号