AD9102 DDS不输出(已解决)
本帖最后由 littleshrimp 于 2017-1-19 12:15 编辑AD9102 DDS 配置好以后没有输出
原理图我参考官方参考设计改的,只保留了放大器部分
我使用MSP430通过SPI配置AD9102
代码参考了官方的AD9106例程,地址都是按照AD9202修改的
现在的问题是这样
可以确定SPI通信正常
因为配置BGDR通过万用表可以测量到REFIO引脚的电平变化
和官方手册里一样
配置好以后IOUTP和IOUTN有电压,但是没有变化
无论是配置成DDS输出正弦波还是配置成三角波输出
IOUT都没有任何变化
配置RSET会影响IOUTP的电平
时钟输入原来有一个LMK61E2使用时发现坏了不输出
因为没有时钟源后来使用MSP430的PWM功能输出一个3.3V 2MHz 50%占空比的信号给CLKP
按照官方对CMOS时钟的要求,把CLKN对地接一个39k的电阻和100nF的电容
试了很长时间都没找出问题在哪里
求大神帮忙:surrender:
const uint32_t PAT_TYPE = 0x001F0000;//模式连续运行。
const uint32_t DACRSET = 0x000C8011;//DAC_RSET_EN,
//const uint32_t WAV_CONFIG= 0x00270031;//DDS输出,预存波形
const uint32_t WAV_CONFIG= 0x00270011;//锯齿波,预存波形
const uint32_t SAW_CONFIG= 0x003700FC;//上斜坡锯齿波
//const uint32_t DAC_DGAIN = 0x00354000;//Data=0x4000Very important,the maximum value is 0x4000
const uint32_t DDS_TW32 = 0x003E1999;//Register 0x3E, Data=0x0E38
const uint32_t DDS_TW1 = 0x003F9A00;//Register 0x3F, Data=0xE600 5MHz output,50MHz fsys
const uint32_t PAT_STATUS= 0x001E0001;//PAT_STATUS 0x1E, run bit=1 Very important
const uint32_t RAMUPDATE = 0x001D0001;//用新配置更新所有SPI设置(自清零)
void ad9102_init(void)
{
uint32_t i = 0;
CS_HI( );
TRIGGER_HI();
REST_LOW();
__delay_cycles(65500);
REST_HI();
//hal_spi_write_uint16(0x0003,0x001d);
//hal_spi_write_uint16(0x0003,0x0028);
hal_spi_write_uint32(0x0003001D);
hal_spi_write_uint32(0x00030028);
hal_spi_write_uint32(PAT_TYPE);
hal_spi_write_uint32(DACRSET);
hal_spi_write_uint32(WAV_CONFIG);
hal_spi_write_uint32(SAW_CONFIG);
//hal_spi_write_uint32(DAC_DGAIN);
hal_spi_write_uint32(DDS_TW32);
hal_spi_write_uint32(DDS_TW1);
hal_spi_write_uint32(RAMUPDATE);
hal_spi_write_uint32(PAT_STATUS);
hal_spi_write_uint32(RAMUPDATE);
__delay_cycles(65500);
TRIGGER_LOW();
hal_spi_write_uint32(RAMUPDATE);
//
//WriteToAD9106(InstruAndData_DDS4_PW);
//
//WriteToAD9106(InstruAndData_update);
//WriteToAD9106(InstruAndData_Run);
//WriteToAD9106(InstruAndData_update);
//delay(10);
//CLR_Trigger();
//WriteToAD9106(InstruAndData_update);
}
------------------------------------------------------------------------------------------------------------------------------
参考其它电流互补输出DAC缓冲电路
IOUTP和IOUTN应该对地接一颗249电阻
官方原理图的R8和R9画PCB的时候忘画了
手里只有499的电阻,用2颗并联焊到板子上以后
RSET的任何设置都不会让波形变形了
最终的缓冲电路仿真图
<div class='shownolgin' data-isdigest='no'>测试程序
</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> 本帖最后由 飞鸿浩劫 于 2017-1-17 23:23 编辑
好东西……我也有两片,一直没时间玩儿,这是干嘛用的?另外……9106根9102很像?
本帖最后由 huaiqiao 于 2017-1-18 11:05 编辑
虾哥,我不算高手,算低手。没有用过这么高端的芯片暂时。O(∩_∩)O哈哈~谈几点我的看法:
1、我要吐槽下你的电路图,RESET低电平有效,CS低电平有效的表示方法如下:
2、原理图画的时候,我个人的习惯是模块化,这样看起来更加容易和方便一些;
3、你的设计是参考如下的网址?
http://www.analog.com/cn/product ... oduct-evaluationkit
https://wiki.analog.com/resources/eval/dpg/eval-ad9106
http://www.analog.com/media/cn/t ... heets/AD9102_cn.pdf
4、CLKN/P 和IOUTP/N这个看起来要走差分线了,不知道虾哥您有注意到么。
5、这个片子我大概看了下,应该是SPI(SPI时钟配置不应该太低)往寄存器里面写值,从而来达到配置芯片功能的效果。
您需要留意下,这个spi配置寄存器,是不是少配置了啥。
而且看起来这玩意儿,还要用spi写片内的SRAM。
整个片子,真的是挺复杂的,多啃datasheet估计会理解的更加深入吧。
飞鸿浩劫 发表于 2017-1-17 23:13
好东西……我也有两片,一直没时间玩儿,这是干嘛用的?另外……9106根9102很像?
AD9106是4路输出12位
AD9102是1路输出14位
其它配置除了部分寄存器,其它基本相同 huaiqiao 发表于 2017-1-18 10:24
虾哥,我不算高手,算低手。没有用过这么高端的芯片暂时。O(∩_∩)O哈哈~谈几点我的看法:
1、我要吐槽下 ...
昨天又试了一下官方的.regval
把示波器调到20mV档能够看到波形
和官方手册里的波形对照了一下
输出“波形”和官方的基本一样
虽然示波器的噪声非常大波形已经看不太清楚
I/V转换电路部分一直没弄明白
今天仿真了一下这个I/V转换电路
感觉有问题
仔细对照了一下官方的原理图,发现放大器2个输入端的1K上下接电阻是不用焊的
去掉3个1K电阻问题又解决一些
现在还有一个问题,就是RSET只能设置成1F
如果数值设置小了输出就会不正常
正常波形
RSET设置成小于1F后的波形
如果RSET设置成0x1F
数字增益设置成0x4000
REFIO内部参考电压为1V时
输出的锯齿波和正弦波都是+-1.0V
波形看起来没有什么问题
原理图这个封装是用Ultra Librarian Reader转的使用*号应该也可以代表低电平有效,就没改
数据手册里有一种使用CMOS时钟的方法
我是按照这种方法接的
开始使用50MHz的有源晶振因为没测到输出才改成MSP430的PWM输出
刚才又换成晶振,波形输出也正常
看来主要问题还是放大器输入端那3颗上下接电阻
还有寄存器配置问题
RSET的问题和输出电压和设置的关系还没弄明白
1、首先reset引脚的问题,我看引脚描述中,
低电平有效复位引脚。将寄存器复位至默认值
所以你说的RESET设置为0x1F,应该是将reset所在寄存器的bit位设置为默认0了。
2、我想问下,您有试过么?SPI单独的读和写是OK的么? 先得保证spi是通的哦。
3、我看它电路图上,一堆的ADxxx的片子,说实话没有仔细去考究。黑白的。。。。图。。。。。
不过我看它REFIO 这个引脚官方的设计上有加1K的电阻,估计是限流的吧,还是有别的用处
中文手册page26
估计你也是用内部的基准电压源模式吧。不过这个玩意儿,内部的这种情况,好像要对寄存器操作。
4、
还有你说的时钟的问题,就你回复的帖子中,我看这个地方只是针对我红色的圈中的型号吧,你的AD9102是不适用的吧。
还有,你用PWM提供clk我不知道行不行。。。。还是用有源晶振,这个要参考下ADI的官方的设计。
5、我建议,这种带寄存器的片子,你单独新建一个H文件和C文件,H文件中,寄存器的设置用位移操作,在H文件中就像如下:
#define DRV_CTRL_MODE_FULL_STP (u16)(0 << 3)
#define DRV_CTRL_MODE_2_STP (u16)(1 << 3)
#define DRV_CTRL_MODE_4_STP (u16)(2 << 3) //默认状态
#define DRV_CTRL_MODE_8_STP (u16)(3 << 3)
在C文件中,可以如下:
void DRV_Set_Index_Level(u16 step)
{
u16 temp = 0;
temp = SPI1_ReadWriteByte(DRV_READ | DRV_CTRL_ADDR | DUMMY);
temp &= 0x0f87; //清除高4位
temp |= step;
SPI1_ReadWriteByte(DRV_WRITE | DRV_CTRL_ADDR | temp);
}
这样,在操作和配置寄存器的时候,直接调用函数就行了。这个招数,以前我没有学到,也是去年才学到的。说实话,以前我只是傻乎乎的往寄存器中写0x某某某的十六进制的方式去弄的。后来学到这样的招数后,挺管用的。
你看下我说的这种方法,对你操作和配置寄存器来说,好不好用。毕竟你如果用spi写的话,spi写的函数中的输入参数一堆的十六进制也不够直观,而且容易出错的。
以上,供参考。
<div class='shownolgin' data-isdigest='no'>huaiqiao 发表于 2017-1-18 16:53
1、首先reset引脚的问题,我看引脚描述中,
所以你说的RESET设置为0x1F,应该是将reset所在寄存器的bit ...
谢谢回复1、RSET指的是片内可调电阻的配置寄存器,不是RESET(复位),通过修改RSET的值来改变内部可调电阻的大小
不过RSET寄存器数据和电阻阻值的对应关系我在手册里还没有看到
2、SPI好用的,之前通过修改BGDR寄存器可以改变REFIO的电平
3、他这个原理图我也看了好长时间才弄明白,估计是老工程师用土办法画的,不太好理解,我是使用的内部参考电压,默认也是开启的不需要设置,不太清楚他的外部1K电阻是用来干嘛的,可能是用来测量或者使用外部参考电压用的吧
4、官方建议使用他的时钟分配器,使用时钟分配器的好处是抖动和相位噪声这些参数比较好,在高频下能够实现更好的性能,使用COMS时钟在低频情况下影响也不是很大,因为现在我只是想确定板子的功能,以后还要用这种低抖动的时钟
5、你说的这种方法很好,以后可以用你这种方法,配置起来更灵活,看起来也比较直观,开始的时候不确定板子是不是有问题,就用官方提供的这种方法了,官方提供的.regval文件和WINDOWS下的配置文件都是使用这种格式
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>littleshrimp 发表于 2017-1-18 17:54
谢谢回复1、RSET指的是片内可调电阻的配置寄存器,不是RESET(复位),通过修改RSET的值来改变内部可调电 ...
1、这个RESET位,我本来表达的是,中文手册中page28中。如下的这个位。(可是后来我在编辑的时候,不小心将网页关闭了,数据恢复的时候,没有注意到,这个图片忘记贴了)
2、SPI没有问题就好。
3、时钟的问题,我表示我没看懂。。。。
4、原来ADI官网已经给出了寄存器的配置的工具了啊。那你就暂时先使用这堆十六进制吧。不过每次配置好这一堆十六进制数后,建议截图保存,然后在相应的SPI的写的函数中,增加注释模块中文说明下。否则,很有可能过几天就会忘记这个,O(∩_∩)O哈哈~
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>huaiqiao 发表于 2017-1-18 18:13
1、这个RESET位,我本来表达的是,中文手册中page28中。如下的这个位。(可是后来我在编辑的时候,不小心 ...
是有一个关于复位的RESET寄存器
怪我没把DAC_RSET寄存器名称写全
时钟方面我也是一知半解
ADI有相关的文章
ADI的评估工具如果使用官方的评估板可以直接将配置烧进去测试
自己做的就没这待遇了
只能把寄存器值取出来,用EXCEL弄成固定格式的数组再通过SPI发给AD9102
麻烦一些,不过不像自己写那样容易出错,调试的时候就怕不知道是软件毛病还是硬件毛病
</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>littleshrimp 发表于 2017-1-18 20:07
是有一个关于复位的RESET寄存器
怪我没把DAC_RSET寄存器名称写全
时钟方面我也是一知半解
A ...
如果官方的 那个评估工具不好用,只能就是像你说的通过数组的方式弄了,这个也是好办法。
时钟实在不行,就参考官方的设计来好了。不过,我看官方的这个CLKP和CLKN是来自AD9514BCPZ,这个搜了下是个时钟芯片。你没有用这个时钟芯片。
还有像我上面说的“REFIO 这个引脚官方的设计上有加1K的电阻”这种情况,你那个地方就放个电阻上去,实在不行,可以焊接成0欧姆的电阻啊。
看你的样子,这个又是自己弄了一块板子自己玩吧。O(∩_∩)O哈哈~</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>两位都是高手,小弟佩服佩服~学习学习!有点复杂,看不懂:time:</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>项目要用这块芯片了,mark一下子.</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>楼主,能贴一下您的代码吗?参考一下子.</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>
贴子里有啊</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>littleshrimp 发表于 2017-2-19 15:07
贴子里有啊
好的,我刚看了一遍数据手册,准备再熟悉熟悉,然后参考哈你写的东西.</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>累死宝宝了.
#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_CONFIG0x00470000
#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</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>qq511950071 发表于 2017-2-22 23:17
累死宝宝了.
#define AD9102_SPICONFIG 0x00000000
#define AD9102_POWERCONFIG 0x00010000
#de ...
{:1_103:}</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>通过2天焊接、程序调试,终于完成了从SRAM中读取波形输出三角波的程序,刻意来感谢楼主的!没有楼主这预存波形的程序,可能要花很久.AD9102的手册特别坑爹,错误百出.甚至是寄存器描述都相当有问题。中文手册更是让人哭笑不得。推荐大家去AD官网看看相关帖子吧,我想此帖势必还会有更多人来看的。总之,感谢楼主.</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>请问有人对AD9102的内部SRAM操作过吗?我想实现datasheet中图47显示4k × 14 SRAM中START_ADDR和STOP_ADDR所定义地址段中存储的波形由DAC输出。该波形在各模式周期中重复一次。在每个模式周期中,经过起始延迟后,从SRAM读出模式。不知道大家有没有用过这方面的内容。</div><script>showreplylogin();</script>