OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3727|回复: 9

两个AD7705工作,每个AD的通道与数据颠倒?????

[复制链接]

7

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2017-3-28
在线时间
73 小时
发表于 2017-5-31 16:47:54 | 显示全部楼层 |阅读模式
1金钱
STM32F103RCT6与AD7705。之前使用一个AD芯片,通道1与通道2的数据是一一对应的;现在使用两个AD同时工作,每个AD芯片各自的通道1和通道2的数据正好颠倒了。请问有人遇到过这种问题吗?

最佳答案

查看完整内容[请看2#楼]

问题解决了,初始化通道的时候加了一个延时,选中数据寄存器的时候,又加了一个延时,读出来的数据就好了,AD真心不好调试啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2017-3-28
在线时间
73 小时
 楼主| 发表于 2017-5-31 16:47:55 | 显示全部楼层
问题解决了,初始化通道的时候加了一个延时,选中数据寄存器的时候,又加了一个延时,读出来的数据就好了,AD真心不好调试啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-31 21:13:11 | 显示全部楼层
帮顶
回复

使用道具 举报

7

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2017-3-28
在线时间
73 小时
 楼主| 发表于 2017-6-1 09:31:29 | 显示全部楼层
昨天说的有点不对,单个芯片工作,两个通道的数据也是颠倒的
回复

使用道具 举报

7

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2017-3-28
在线时间
73 小时
 楼主| 发表于 2017-6-1 09:36:53 | 显示全部楼层
void AD7705_1_WriteByte(u8 Dst_Addr1)   
{   
        CS1_LOW();
        delay_us(20);
        SPI1_ReadWriteByte(Dst_Addr1);
        delay_us(100);
        CS1_HIGH();
}

void Init_AD7705_1(u8 channel)
{
        u8 i;
        for(i=0;i<100;i++)                                                                                        //&#182;àóúá&#172;D&#248;32&#184;&#246;DIN=1ê1′&#174;&#191;ú&#184;′&#206;&#187;                                                                                                                               
        {
                AD7705_1_WriteByte(0xff);             //3&#214;D&#248;DIN&#184;&#223;μ&#231;&#198;&#189;D′2ù×÷£&#172;&#187;&#214;&#184;′AD7705&#189;ó&#191;ú
        }  
        delay_ms(1);                            //
        switch(channel)                         //í¨μà&#209;&#161;&#212;&#241;
        {
                case 1:
                        AD7705_1_WriteByte(0x20);           //D′í¨&#209;&#182;&#188;&#196;′&#230;&#198;÷£&#172;&#209;&#161;&#214;Dí¨μà1£&#187; DRDY RS2 RS1 RS0 RW STBY CH1 CH0
                                                      //&#209;&#161;&#212;&#241;ê±&#214;ó&#188;&#196;′&#230;&#198;÷£&#172;            0   0   1   0   0   0   0   0
                        AD7705_1_WriteByte(0x0b);           //D′ê±&#214;ó&#188;&#196;′&#230;&#198;÷éè&#214;&#195;&#184;üD&#194;&#203;ù&#194;ê&#206;a£o4.9152MHzê±&#214;ó£&#172;200HZêy&#190;Yê&#228;3&#246;&#184;üD&#194;&#203;ù&#194;ê
               
                        AD7705_1_WriteByte(0x10);           //D′í¨&#209;&#182;&#188;&#196;′&#230;&#198;÷£&#172;&#209;&#161;&#214;Dí¨μà1£&#187; DRDY RS2 RS1 RS0 RW STBY CH1 CH0
                                                      //&#209;&#161;&#212;&#241;éè&#214;&#195;&#188;&#196;′&#230;&#198;÷              0   0   0   1   0   0   0   0
                        AD7705_1_WriteByte(0x44);           //D′éè&#214;&#195;&#188;&#196;′&#230;&#198;÷£&#172;éè&#214;&#195;3é×&#212;D£×&#188;£&#172;&#212;&#246;ò&#230;&#206;a1£&#172;μ¥&#188;&#171;D&#212;£&#172;&#206;T&#187;o3&#229;£&#172;&#194;&#203;2¨&#198;÷1¤×÷
                       
                        break;
               
                case 2:
                        AD7705_1_WriteByte(0x21);         
                                                      //&#209;&#161;&#212;&#241;ê±&#214;ó&#188;&#196;′&#230;&#198;÷£&#172;            0   0   1   0   0   0   0   1
                        AD7705_1_WriteByte(0x0b);           
                       
                        AD7705_1_WriteByte(0x11);         
                        AD7705_1_WriteByte(0x44);         
                       
                        break;
               
                default:       
                        break;
        }
}

u16 GetData7705_1(u8 channel)
{
        u16 temp = 0;
        u16 DataH = 0;
        u16 DataL = 0;
        switch(channel)
        {
                case 1:
                        Init_AD7705_1(1);         
                        delay_ms(1);
                        AD7705_1_WriteByte(0x38);  
                        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1)  //′&#248;êy&#190;Y×&#188;±&#184;o&#195;  AdDrdy = 0
                        {
                                ;
                        }
                        CS1_LOW();                         //′ò&#191;aμúò&#187;&#184;&#246;ADμ&#196;&#198;&#172;&#209;&#161;
                        delay_us(20);
                        DataH = SPI1_ReadWriteByte(0xff);  //&#182;áè&#161;&#184;&#223;°&#203;&#206;&#187;êy&#190;Y
                        DataL = SPI1_ReadWriteByte(0xff);  //&#182;áè&#161;μí°&#203;&#206;&#187;êy&#190;Y
                        delay_us(200);
                        CS1_HIGH();                        //1&#216;±&#213;μúò&#187;&#184;&#246;ADμ&#196;&#198;&#172;&#209;&#161;
                        DataH = DataH<<8;
                        temp = DataH|DataL;                                         //×éo&#207;3é16&#206;&#187;μ&#196;êy&#190;Y
                       
                        break;
                       
                case 2:
                        Init_AD7705_1(2);                  //3&#245;ê&#188;&#187;ˉμúò&#187;&#184;&#246;ADμ&#196;í¨μà2
                        delay_ms(1);
                        AD7705_1_WriteByte(0x39);          //&#209;&#161;&#214;Dí¨μà1μ&#196;êy&#190;Y&#188;&#196;′&#230;&#198;÷&#182;á
                        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1)    //′&#248;êy&#190;Y×&#188;±&#184;o&#195;  AdDrdy = 0
                        {
                                ;
                        }
                        CS1_LOW();                         //′ò&#191;aμúò&#187;&#184;&#246;ADμ&#196;&#198;&#172;&#209;&#161;
                        delay_us(20);
                        DataH = SPI1_ReadWriteByte(0xff);  //&#182;áè&#161;&#184;&#223;°&#203;&#206;&#187;êy&#190;Y
                        DataL = SPI1_ReadWriteByte(0xff);  //&#182;áè&#161;μí°&#203;&#206;&#187;êy&#190;Y
                        delay_us(200);      
                        CS1_HIGH();                        //1&#216;±&#213;μúò&#187;&#184;&#246;ADμ&#196;&#198;&#172;&#209;&#161;
                        DataH = DataH<<8;
                        temp = DataH|DataL;                                   //×éo&#207;3é16&#206;&#187;μ&#196;êy&#190;Y       
                       
                        break;
        }
        return temp;                           //·μ&#187;&#216;&#182;áè&#161;μ&#189;μ&#196;êy&#190;Y
}
回复

使用道具 举报

7

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2017-3-28
在线时间
73 小时
 楼主| 发表于 2017-6-1 13:18:49 | 显示全部楼层
现在如果连续采集十次,第一次通道与数据是对应的,以后的都是相反的了
回复

使用道具 举报

7

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2017-3-28
在线时间
73 小时
 楼主| 发表于 2017-6-1 15:38:15 | 显示全部楼层
现在有个笨的方法解决了,就是每次切换通道前,先复位AD芯片,这样芯片的使用寿命会不会大大减少?
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2017-6-1 20:45:35 | 显示全部楼层
复位不会影响寿命
回复

使用道具 举报

7

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2017-3-28
在线时间
73 小时
 楼主| 发表于 2017-6-2 09:07:05 | 显示全部楼层
bucker 发表于 2017-6-1 20:45
复位不会影响寿命

那这样做,会不会有什么不妥?
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2017-6-2 22:26:10 | 显示全部楼层
ZHLGYN 发表于 2017-6-2 09:07
那这样做,会不会有什么不妥?

你都做了,还没看出妥不妥吗?AD7705在读数据之前需查询DRDY信号,不知你是否做了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-18 15:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表