完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首次写控制字到AD5752R时,A、B两通道输出的电压值与数字量不对应,得再次写入控制字或者主控芯片复位一次,输出电压就对了......
电路设计是参考EVAL-AD5754R评估板,程序是参考ExampleCode_DAC_AD5754.zip(根据AD5752R相应地修改),问题一直没有得到解决,不知道是哪出现的问题,求懂的前辈解答,谢谢! |
|
相关推荐
5个回答
|
|
|
|
|
|
回读不正确......第一句:上电之后,是否做了reset操作是什么概念,是指AD5752R芯片?
程序读写操作参照ExampleCode_DAC_AD5754.zip来写的,把AD5752R里不同的寄存器地址照着手册改了一下,这什么情况?求解答。 这是读写和配置代码: //DA_Delay; void DA_Delay(int length) { while (length >0) length--; } /******************************************************************************** Function that writes to the AD5754R via the SPI port. ********************************************************************************/ void WriteToAD57524RViaSpi(long int *RegisterData) { long int ValueToWrite = *RegisterData; int i; // SPI start IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SYNC_BASE,1);//SET_SYNC(); DA_Delay(10); IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SYNC_BASE,0);//CLR_SYNC(); //bring SYNC low DA_Delay(1); //Write out the 24 bit ControlWord for(i=0; i<24; i++) { IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SCLK_BASE,1);//SET_SCLK(); DA_Delay(5); if(0x800000 == (ValueToWrite & 0x800000))//MSB方式优先 { IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SDIN_BASE,1);//SET_SDIN(); //Send one to SDI pin } else { IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SDIN_BASE,0);//CLR_SDIN(); //Send zero to SDI pin } DA_Delay(5); IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SCLK_BASE,0);//CLR_SCLK(); DA_Delay(5); ValueToWrite <<= 1; //Rotate data DA_Delay(5); } // SPI ends IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SYNC_BASE,1);//SET_SYNC(); DA_Delay(10); } /******************************************************************************** Function that read from the AD5754R via the SPI port. ********************************************************************************/ void ReadFromAD57524RViaSpi(long int *RegisterData) { unsigned int i = 0; unsigned int iTemp = 0; unsigned long RotateData = 0; unsigned long Noop = Nop; // SPI start IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SYNC_BASE,1);//SET_SYNC(); DA_Delay(20); IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SYNC_BASE,0);//CLR_SYNC(); //bring SYNC low DA_Delay(2); for(i=0; i<24; i++) { IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SCLK_BASE,1);//SET_SCLK(); DA_Delay(5); ////////////////////////////////////////////////// if(0x800000 == (Noop & 0x800000)) { IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SDIN_BASE,1);//SET_SDIN(); //Send one to SDI pin } else { IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SDIN_BASE,0);//CLR_SDIN(); //Send zero to SDI pin } ////////////////////////////////////////////////// IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SCLK_BASE,0);//CLR_SCLK(); DA_Delay(5); iTemp = IORD_ALTERA_AVALON_PIO_DATA(PIO_DA_SDO_BASE);//iTemp = GP4DAT;//Read DIN of AD736, P4.4->SDout RotateData <<= 1; if(0x00000010 == (iTemp & 0x00000010)) { RotateData |= 1; } //Rotate data ////////////////////////////////////////////////// Noop <<= 1; ////////////////////////////////////////////////// DA_Delay(5); } // SPI ends IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_SYNC_BASE,1);//SET_SYNC(); DA_Delay(20); *RegisterData=RotateData; } //--------------------- //Configure AD5754R //--------------------- void ConfigAD57524R() { int i; long int *p; long int ins[2] = {0, 0}; /*IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_BIN_BASE,0); //双极性以二进制补码输出 IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_LDAC_BASE,0);//更新设置。在SYNC的上升沿更新所寻址的DAC寄存器 IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_CLR_BASE,1); //不使能清除为零平代码 */ IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_BIN_BASE,0); IOWR_ALTERA_AVALON_PIO_DATA(PIO_DA_LDAC_BASE,0); ins[1] = PowerCtrl_Reg | Power_RefShut; //上电设置,开A、B通道,关闭内部基准电压(使用外部基准2.048V) ins[0] = OutputRange_Reg | Channel_AB | Range4; //通道输出范围设置 p = ins; for(i=0; i<2; i++) { WriteToAD57524RViaSpi(p); DA_Delay(200); p++; } } 这是主程序里的代码:
WriteToAD57524RViaSpi(&cstr);
WriteToAD57524RViaSpi(&cstr); //DA反馈读取 cstr = Read | DAC_Reg | Channel_A; //the CommAssistant display WriteToAD57524RViaSpi(&cstr); //DA_Delay(20);
tx[2] = ((buf)&0xFF0000)>>16; tx[1] = ((buf)&0x00FF00)>>8; tx[0] = (buf)&0x000000FF; |
||
|
||
一般来说,DAC上电之后,需要reset寄存器, 但是由于AD5752R内置上电复位电路,所以不需要额外的操作了
把第一次写入的时序贴一下, 用示波器抓一下,好对比一下数据手册的时序图 |
|
|
|
看了看,第一次写入控制字,输出电压好像是按单极性输出的,主控芯片复位一次或者再次写入控制字就按双极性输出了......能不能从这再帮看看是什么原因?
主要是您说的示波器看时序,本人小白,不会 |
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
213 浏览 0 评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1299 浏览 2 评论
ADP5092 SYS端口为2.09V,但是REG_OUT为0是什么原因?
1896 浏览 1 评论
ad7193差分输入ain1与ain2差是正值时,读到电压与实际值误差小,但为负值值,误差就变的很大
4237 浏览 2 评论
8995 浏览 1 评论
ADC3442采集,分析数据出现有规则毛刺,请问是哪方面的问题啊?
1421浏览 3评论
AD7190状态寄存器一直是0x80,连续转换模式下RDY不拉低
1645浏览 2评论
1615浏览 2评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1299浏览 2评论
213浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 13:13 , Processed in 0.914815 second(s), Total 84, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号