DDS芯片 AD9833正弦波 顶部略微有些畸形 江湖救急大神们··

2019-12-12 18:15发布

本帖最后由 射天狼 于 2019-3-24 16:10 编辑

做了一批DDS的板子,同一批次的PCB 元器件也都是 程序也都一样 测量方法也一样
弄了50个左右 啥样的都有
总结分了三类情况
波形几乎完全无失真 A类
波形毛刺多 B类
波形有明显凹陷失真 C类




自己找过问题 没找到

1.拿A类的AD9833换到C类上面  C类板子还是那样没任何改变



做了这么多呐

原理图和PCB
SINLE.jpg (506.89 KB, 下载次数: 0) 下载附件 2019-3-24 15:53 上传




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
27条回答
射天狼
2019-12-13 19:41
wye11083 发表于 2019-3-24 21:31
是不是正弦表写的不对?你好好查查写入时序。它不是标准iic。

代码如下


  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: AD9833_WaveSeting
  4. *        功能说明: 向SPI总线发送16个bit数据
  5. *        形    参: 1.Freq: 频率值, 0.1 hz - 12Mhz
  6.                           2.Freq_SFR: 0 或 1
  7.                           3.WaveMode: TRI_WAVE(三角波),SIN_WAVE(正弦波),SQU_WAVE(方波)
  8.                           4.Phase : 波形的初相位
  9. *        返 回 值: 无
  10. *********************************************************************************************************
  11. */
  12. void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )
  13. {

  14.                 int frequence_LSB,frequence_MSB,Phs_data;
  15.                 double   frequence_mid,frequence_DATA;
  16.                 long int frequence_hex;

  17.                 /*********************************计算频率的16进制值***********************************/
  18.                 frequence_mid=268435456/25;//适合25M晶振
  19.                 //如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz
  20.                 frequence_DATA=Freq;
  21.                 frequence_DATA=frequence_DATA/1000000;
  22.                 frequence_DATA=frequence_DATA*frequence_mid;
  23.                 frequence_hex=frequence_DATA;  //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;
  24.                 frequence_LSB=frequence_hex; //frequence_hex低16位送给frequence_LSB
  25.                 frequence_LSB=frequence_LSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位
  26.                 frequence_MSB=frequence_hex>>14; //frequence_hex高16位送给frequence_HSB
  27.                 frequence_MSB=frequence_MSB&0x3fff;//去除最高两位,16位数换去掉高位后变成了14位

  28.                 Phs_data=Phase|0xC000;        //相位值
  29.                 AD9833_Write(0x0100); //复位AD9833,即RESET位为1
  30.                 AD9833_Write(0x2100); //选择数据一次写入,B28位和RESET位为1

  31.                 if(Freq_SFR==0)                                  //把数据设置到设置频率寄存器0
  32.                 {
  33.                          frequence_LSB=frequence_LSB|0x4000;
  34.                          frequence_MSB=frequence_MSB|0x4000;
  35.                          //使用频率寄存器0输出波形
  36.                         AD9833_Write(frequence_LSB); //L14,选择频率寄存器0的低14位数据输入
  37.                         AD9833_Write(frequence_MSB); //H14 频率寄存器的高14位数据输入
  38.                         AD9833_Write(Phs_data);        //设置相位
  39.                         //AD9833_Write(0x2000); /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/
  40.             }
  41.                 if(Freq_SFR==1)                                //把数据设置到设置频率寄存器1
  42.                 {
  43.                          frequence_LSB=frequence_LSB|0x8000;
  44.                          frequence_MSB=frequence_MSB|0x8000;
  45.                         //使用频率寄存器1输出波形
  46.                         AD9833_Write(frequence_LSB); //L14,选择频率寄存器1的低14位输入
  47.                         AD9833_Write(frequence_MSB); //H14 频率寄存器1为
  48.                         AD9833_Write(Phs_data);        //设置相位
  49.                         //AD9833_Write(0x2800); /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,频率寄存器1输出波形**/
  50.                 }
  51.                
  52.                 /*显示处理函数*/

  53.                 if(WaveMode==TRI_WAVE) //输出三角波波形
  54.                 {
  55.                          AD9833_Write(0x2002);
  56.                         //先写入显示缓冲区
  57.                         //sprintf(string,"%s%.1fHz","",Freq);
  58.                 }
  59.                 if(WaveMode==SQU_WAVE)        //输出方波波形
  60.                 {
  61.                         AD9833_Write(0x2028);
  62.                         //先写入显示缓冲区
  63.                         //sprintf(string,"%s%.1fHz","",Freq);

  64.                 }
  65.                 if(WaveMode==SIN_WAVE)        //输出正弦波形
  66.                 {
  67.                         AD9833_Write(0x2000);
  68.                         //先写入显示缓冲区
  69.                         //sprintf(string,"%s%.1fHz","",Freq);

  70.                 }
  71. //LCD_DisplayStringLine(Line6,"V:2.73V");
  72. }
复制代码

一周热门 更多>