[求助] AD9102 DDS不输出(已解决)

littleshrimp   2017-1-17 22:22 楼主
AD9102 DDS 配置好以后没有输出 原理图我参考官方参考设计改的,只保留了放大器部分 QQ图片20170117220658.png
ad9102_sch.pdf (116.15 KB)
(下载次数: 150, 2017-1-17 22:09 上传)
我使用MSP430通过SPI配置AD9102 代码参考了官方的AD9106例程,地址都是按照AD9202修改的 现在的问题是这样 可以确定SPI通信正常 因为配置BGDR通过万用表可以测量到REFIO引脚的电平变化 和官方手册里一样 QQ图片20170117221831.png 配置好以后IOUTP和IOUTN有电压,但是没有变化 无论是配置成DDS输出正弦波还是配置成三角波输出 IOUT都没有任何变化 配置RSET会影响IOUTP的电平 时钟输入原来有一个LMK61E2使用时发现坏了不输出 因为没有时钟源后来使用MSP430的PWM功能输出一个3.3V 2MHz 50%占空比的信号给CLKP 按照官方对CMOS时钟的要求,把CLKN对地接一个39k的电阻和100nF的电容 试了很长时间都没找出问题在哪里 求大神帮忙
  1. const uint32_t PAT_TYPE = 0x001F0000;//模式连续运行。
  2. const uint32_t DACRSET = 0x000C8011;//DAC_RSET_EN,
  3. //const uint32_t WAV_CONFIG = 0x00270031;//DDS输出,预存波形
  4. const uint32_t WAV_CONFIG = 0x00270011;//锯齿波,预存波形
  5. const uint32_t SAW_CONFIG = 0x003700FC;//上斜坡锯齿波
  6. //const uint32_t DAC_DGAIN = 0x00354000;//Data=0x4000 Very important,the maximum value is 0x4000
  7. const uint32_t DDS_TW32 = 0x003E1999;//Register 0x3E, Data=0x0E38
  8. const uint32_t DDS_TW1 = 0x003F9A00;//Register 0x3F, Data=0xE600 5MHz output,50MHz fsys
  9. const uint32_t PAT_STATUS = 0x001E0001;//PAT_STATUS 0x1E, run bit=1 Very important
  10. const uint32_t RAMUPDATE = 0x001D0001;//用新配置更新所有SPI设置(自清零)
  1. void ad9102_init(void)
  2. {
  3. uint32_t i = 0;
  4. CS_HI( );
  5. TRIGGER_HI();
  6. REST_LOW();
  7. __delay_cycles(65500);
  8. REST_HI();
  9. //hal_spi_write_uint16(0x0003,0x001d);
  10. //hal_spi_write_uint16(0x0003,0x0028);
  11. hal_spi_write_uint32(0x0003001D);
  12. hal_spi_write_uint32(0x00030028);
  13. hal_spi_write_uint32(PAT_TYPE);
  14. hal_spi_write_uint32(DACRSET);
  15. hal_spi_write_uint32(WAV_CONFIG);
  16. hal_spi_write_uint32(SAW_CONFIG);
  17. // hal_spi_write_uint32(DAC_DGAIN);
  18. hal_spi_write_uint32(DDS_TW32);
  19. hal_spi_write_uint32(DDS_TW1);
  20. hal_spi_write_uint32(RAMUPDATE);
  21. hal_spi_write_uint32(PAT_STATUS);
  22. hal_spi_write_uint32(RAMUPDATE);
  23. __delay_cycles(65500);
  24. TRIGGER_LOW();
  25. hal_spi_write_uint32(RAMUPDATE);
  26. //
  27. // WriteToAD9106(InstruAndData_DDS4_PW);
  28. //
  29. // WriteToAD9106(InstruAndData_update);
  30. // WriteToAD9106(InstruAndData_Run);
  31. // WriteToAD9106(InstruAndData_update);
  32. // delay(10);
  33. // CLR_Trigger();
  34. // WriteToAD9106(InstruAndData_update);
  35. }
------------------------------------------------------------------------------------------------------------------------------ 参考其它电流互补输出DAC缓冲电路 QQ图片20170119120939.png IOUTP和IOUTN应该对地接一颗249电阻 官方原理图的R8和R9画PCB的时候忘画了 手里只有499的电阻,用2颗并联焊到板子上以后 QQ图片20170119121504.png RSET的任何设置都不会让波形变形了 QQ图片20170118223710.png 最终的缓冲电路仿真图 QQ图片20170119121239.png 本帖最后由 littleshrimp 于 2017-1-19 12:15 编辑
虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复评论 (52)

1 来自 2楼 littleshrimp 

测试程序
2..AD9102 map430fr5969.rar (13.73 KB)
(下载次数: 168, 2017-3-30 09:17 上传)

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞 (1) 2017-3-30 09:17
好东西……我也有两片,一直没时间玩儿,这是干嘛用的?另外……9106根9102很像? 本帖最后由 飞鸿浩劫 于 2017-1-17 23:23 编辑
点赞  2017-1-17 23:13
虾哥,我不算高手,算低手。没有用过这么高端的芯片暂时。O(∩_∩)O哈哈~谈几点我的看法: 1、我要吐槽下你的电路图,RESET低电平有效,CS低电平有效的表示方法如下: RESET 引脚.png 2、原理图画的时候,我个人的习惯是模块化,这样看起来更加容易和方便一些; 原理图模块化.png 3、你的设计是参考如下的网址? http://www.analog.com/cn/product ... oduct-evaluationkit 54444444.png https://wiki.analog.com/resources/eval/dpg/eval-ad9106 66666.png http://www.analog.com/media/cn/t ... heets/AD9102_cn.pdf 4、CLKN/P 和IOUTP/N这个看起来要走差分线了,不知道虾哥您有注意到么。 99999999999999.png 00000.png 5、这个片子我大概看了下,应该是SPI(SPI时钟配置不应该太低)往寄存器里面写值,从而来达到配置芯片功能的效果。 您需要留意下,这个spi配置寄存器,是不是少配置了啥。 而且看起来这玩意儿,还要用spi写片内的SRAM。 整个片子,真的是挺复杂的,多啃datasheet估计会理解的更加深入吧。 本帖最后由 huaiqiao 于 2017-1-18 11:05 编辑
点赞  2017-1-18 10:24
引用: 飞鸿浩劫 发表于 2017-1-17 23:13
好东西……我也有两片,一直没时间玩儿,这是干嘛用的?另外……9106根9102很像?

AD9106是4路输出12位
AD9102是1路输出14位

其它配置除了部分寄存器,其它基本相同
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2017-1-18 12:13
引用: huaiqiao 发表于 2017-1-18 10:24
虾哥,我不算高手,算低手。没有用过这么高端的芯片暂时。O(∩_∩)O哈哈~谈几点我的看法:
1、我要吐槽下 ...

昨天又试了一下官方的.regval
把示波器调到20mV档能够看到波形
和官方手册里的波形对照了一下
输出“波形”和官方的基本一样
虽然示波器的噪声非常大波形已经看不太清楚

I/V转换电路部分一直没弄明白
今天仿真了一下这个I/V转换电路
感觉有问题
仔细对照了一下官方的原理图,发现放大器2个输入端的1K上下接电阻是不用焊的
去掉3个1K电阻问题又解决一些

现在还有一个问题,就是RSET只能设置成1F
如果数值设置小了输出就会不正常
新建文件1.bmp

正常波形

新建文件0.bmp

RSET设置成小于1F后的波形


如果RSET设置成0x1F
数字增益设置成0x4000
REFIO内部参考电压为1V时
输出的锯齿波和正弦波都是+-1.0V
波形看起来没有什么问题

新建文件2.bmp


原理图这个封装是用Ultra Librarian Reader转的使用*号应该也可以代表低电平有效,就没改

数据手册里有一种使用CMOS时钟的方法
我是按照这种方法接的
QQ图片20170118121554.png

开始使用50MHz的有源晶振因为没测到输出才改成MSP430的PWM输出
刚才又换成晶振,波形输出也正常
看来主要问题还是放大器输入端那3颗上下接电阻
还有寄存器配置问题

RSET的问题和输出电压和设置的关系还没弄明白



虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2017-1-18 12:40
1、首先reset引脚的问题,我看引脚描述中,
引用: 低电平有效复位引脚。将寄存器复位至默认值

所以你说的RESET设置为0x1F,应该是将reset所在寄存器的bit位设置为默认0了。

2、我想问下,您有试过么?SPI单独的读和写是OK的么? 先得保证spi是通的哦。

3、我看它电路图上,一堆的ADxxx的片子,说实话没有仔细去考究。黑白的。。。。图。。。。。

不过我看它REFIO 这个引脚官方的设计上有加1K的电阻,估计是限流的吧,还是有别的用处
中文手册page26
7777777777777777777.png 估计你也是用内部的基准电压源模式吧。不过这个玩意儿,内部的这种情况,好像要对寄存器操作。

4、
还有你说的时钟的问题,就你回复的帖子中,我看这个地方只是针对我红色的圈中的型号吧,你的AD9102是不适用的吧。

888888888888888888.png


还有,你用PWM提供clk我不知道行不行。。。。还是用有源晶振,这个要参考下ADI的官方的设计。



5、我建议,这种带寄存器的片子,你单独新建一个H文件和C文件,H文件中,寄存器的设置用位移操作,在H文件中就像如下:
  1. #define DRV_CTRL_MODE_FULL_STP         (u16)(0 << 3)
  2. #define DRV_CTRL_MODE_2_STP                 (u16)(1 << 3)
  3. #define DRV_CTRL_MODE_4_STP                 (u16)(2 << 3)                //默认状态
  4. #define DRV_CTRL_MODE_8_STP                 (u16)(3 << 3)


在C文件中,可以如下:
  1. void DRV_Set_Index_Level(u16 step)
  2. {
  3.     u16 temp = 0;

  4.     temp = SPI1_ReadWriteByte(DRV_READ | DRV_CTRL_ADDR | DUMMY);
  5.     temp &= 0x0f87;         //清除高4位
  6.     temp |= step;
  7.     SPI1_ReadWriteByte(DRV_WRITE | DRV_CTRL_ADDR | temp);
  8. }



这样,在操作和配置寄存器的时候,直接调用函数就行了。这个招数,以前我没有学到,也是去年才学到的。说实话,以前我只是傻乎乎的往寄存器中写0x某某某的十六进制的方式去弄的。后来学到这样的招数后,挺管用的。

你看下我说的这种方法,对你操作和配置寄存器来说,好不好用。毕竟你如果用spi写的话,spi写的函数中的输入参数一堆的十六进制也不够直观,而且容易出错的。

以上,供参考。






点赞  2017-1-18 16:53
引用: huaiqiao 发表于 2017-1-18 16:53
1、首先reset引脚的问题,我看引脚描述中,

所以你说的RESET设置为0x1F,应该是将reset所在寄存器的bit ...

谢谢回复1、RSET指的是片内可调电阻的配置寄存器,不是RESET(复位),通过修改RSET的值来改变内部可调电阻的大小
不过RSET寄存器数据和电阻阻值的对应关系我在手册里还没有看到
QQ图片20170118173253.png
2、SPI好用的,之前通过修改BGDR寄存器可以改变REFIO的电平
3、他这个原理图我也看了好长时间才弄明白,估计是老工程师用土办法画的,不太好理解,我是使用的内部参考电压,默认也是开启的不需要设置,不太清楚他的外部1K电阻是用来干嘛的,可能是用来测量或者使用外部参考电压用的吧
4、官方建议使用他的时钟分配器,使用时钟分配器的好处是抖动和相位噪声这些参数比较好,在高频下能够实现更好的性能,使用COMS时钟在低频情况下影响也不是很大,因为现在我只是想确定板子的功能,以后还要用这种低抖动的时钟
5、你说的这种方法很好,以后可以用你这种方法,配置起来更灵活,看起来也比较直观,开始的时候不确定板子是不是有问题,就用官方提供的这种方法了,官方提供的.regval文件和WINDOWS下的配置文件都是使用这种格式
QQ图片20170118174255.png

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2017-1-18 17:54
引用: littleshrimp 发表于 2017-1-18 17:54
谢谢回复1、RSET指的是片内可调电阻的配置寄存器,不是RESET(复位),通过修改RSET的值来改变内部可调电 ...

1、这个RESET位,我本来表达的是,中文手册中page28中。如下的这个位。(可是后来我在编辑的时候,不小心将网页关闭了,数据恢复的时候,没有注意到,这个图片忘记贴了)

77777777777777.png

2、SPI没有问题就好。

3、时钟的问题,我表示我没看懂。。。。

4、原来ADI官网已经给出了寄存器的配置的工具了啊。那你就暂时先使用这堆十六进制吧。不过每次配置好这一堆十六进制数后,建议截图保存,然后在相应的SPI的写的函数中,增加注释模块中文说明下。否则,很有可能过几天就会忘记这个,O(∩_∩)O哈哈~
点赞  2017-1-18 18:13
引用: huaiqiao 发表于 2017-1-18 18:13
1、这个RESET位,我本来表达的是,中文手册中page28中。如下的这个位。(可是后来我在编辑的时候,不小心 ...

是有一个关于复位的RESET寄存器
怪我没把DAC_RSET寄存器名称写全

QQ图片20170118184331.png

QQ图片20170118184212.png

时钟方面我也是一知半解
ADI有相关的文章
AN-1067_cn.pdf (5.55 MB)
(下载次数: 266, 2017-1-18 20:04 上传)


ADI的评估工具如果使用官方的评估板可以直接将配置烧进去测试
自己做的就没这待遇了
只能把寄存器值取出来,用EXCEL弄成固定格式的数组再通过SPI发给AD9102
麻烦一些,不过不像自己写那样容易出错,调试的时候就怕不知道是软件毛病还是硬件毛病
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2017-1-18 20:07
引用: littleshrimp 发表于 2017-1-18 20:07
是有一个关于复位的RESET寄存器
怪我没把DAC_RSET寄存器名称写全





时钟方面我也是一知半解
A ...

如果官方的 那个评估工具不好用,只能就是像你说的通过数组的方式弄了,这个也是好办法。


时钟实在不行,就参考官方的设计来好了。不过,我看官方的这个CLKP和CLKN是来自AD9514BCPZ,这个搜了下是个时钟芯片。你没有用这个时钟芯片。

还有像我上面说的“REFIO 这个引脚官方的设计上有加1K的电阻”这种情况,你那个地方就放个电阻上去,实在不行,可以焊接成0欧姆的电阻啊。
看你的样子,这个又是自己弄了一块板子自己玩吧。O(∩_∩)O哈哈~
点赞  2017-1-18 21:07
两位都是高手,小弟佩服佩服~学习学习!有点复杂,看不懂
点赞  2017-2-3 15:19
项目要用这块芯片了,mark一下子.
点赞  2017-2-19 07:35
楼主,能贴一下您的代码吗?参考一下子.
点赞  2017-2-19 14:21


贴子里有啊
点赞  2017-2-19 15:07

好的,我刚看了一遍数据手册,准备再熟悉熟悉,然后参考哈你写的东西.
点赞  2017-2-19 16:40
累死宝宝了.
#define AD9102_SPICONFIG      0x00000000
#define AD9102_POWERCONFIG    0x00010000
#define AD9102_CLOCKCONFIG                0x00020000
#define AD9102_REFADJ                                        0x00030000
#define AD9102_DACAGAIN       0x00070000
#define AD9102_DACRANGE       0x00080000
#define AD9102_DACRSET        0x000C0000
#define AD9102_CALCONFIG                        0x000D0000
#define AD9102_COMPOFFSET                        0x000E0000
#define AD9102_RAMUPDATE      0x001D0000
#define AD9102_PAT_STATUS                        0x001E0000
#define AD9102_PAT_TYPE                                0x001F0000
#define AD9102_PATTERN_DLY    0x00200000
#define AD9102_DACDOF         0x00250000
#define AD9102_WAV_CONFIG     0x00270000
#define AD9102_PAT_TIMEBASE   0x00280000
#define AD9102_PAT_PERIOD           0x00290000
#define AD9102_DAC_PAT        0x002B0000
#define AD9102_DOUT_START                        0x002C0000
#define AD9102_DOUT_CONFIG                0x002D0000
#define AD9102_DAC_CST        0x00310000
#define AD9102_DAC_DGAIN      0x00350000
#define AD9102_SAW_CONFIG     0x00370000
#define AD9102_DDS_TW32       0x003E0000
#define AD9102_DDS_TW1        0x003F0000
#define AD9102_DDS_PW         0x00430000
#define AD9102_TRIG_TW_SEL                0x00440000
#define AD9102_DDS_CONFIG                        0x00450000
#define AD9102_TW_RAM_CONFIG  0x00470000
#define AD9102_START_DELAY    0x005C0000
#define AD9102_START_ADDR     0x005D0000
#define AD9102_STOP_ADDR                         0x005E0000   
#define AD9102_DDS_CYC                                0x005F0000
#define AD9102_CFG_ERROR      0x00600000
#define AD9102_SRAM_DATA      0x60000000
点赞  2017-2-22 23:17
引用: qq511950071 发表于 2017-2-22 23:17
累死宝宝了.
#define AD9102_SPICONFIG      0x00000000
#define AD9102_POWERCONFIG    0x00010000
#de ...

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2017-2-22 23:22
通过2天焊接、程序调试,终于完成了从SRAM中读取波形输出三角波的程序,刻意来感谢楼主的!没有楼主这预存波形的程序,可能要花很久.AD9102的手册特别坑爹,错误百出.甚至是寄存器描述都相当有问题。中文手册更是让人哭笑不得。推荐大家去AD官网看看相关帖子吧,我想此帖势必还会有更多人来看的。总之,感谢楼主.
点赞  2017-3-11 07:58
请问有人对AD9102的内部SRAM操作过吗?我想实现datasheet中图47显示4k × 14 SRAM中START_ADDR和STOP_ADDR所定义地址段中存储的波形由DAC输出。该波形在各模式周期中重复一次。在每个模式周期中,经过起始延迟后,从SRAM读出模式。不知道大家有没有用过这方面的内容。
点赞  2018-4-24 16:44
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复