打印

读AD7193数据遇到的问题。

[复制链接]
3113|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
any012|  楼主 | 2016-2-22 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, se, Value, pi, IO
本帖最后由 any012 于 2016-2-22 11:49 编辑

AD7193相关的设置、读写函数,都是找的AD官网上的函数,然后把SPI通讯部分用IO口模拟SPI实现。
现在读取AD7193内部温度没问题,控制AD7193的GPIO也没问题。
读AD7193内部差分通道的数据,出错了。

主程序初始化部分,设置了AD7193配置,然后while循环里,每1s读取一次。
因为ad7193内部有8个通道或者是4个差分通道(此时用的是差分通道),应该先设置打开通道1,然后读取,分两个命令操作。

现在是如果打开通道1,再读取内部数据寄存器,读取的值是实际值的一半;
如果屏蔽掉打开通道1这个操作,直接读取内部数据寄存器,读取的值是正确的;
后来发现,不光是打开通道1,只要是涉及ad7193的操作,然后再读取寄存器值,读出来的都是实际值的一半。

int main(void)
{
        u32 value_temp;
        u8 send_value1, send_value2, send_value3, send_value4;

        GPIO_Config();                                                            
        SPI3_Init();                                                              
        USART1_Config();                                                      
        TIM3_Config(9999, 7199);                                       
        WriteToADT7310ViaSPI(0x01,0x00);                       
        AD7193_GPIO23_ENABLE(1);                                       
        
        ADG702_Set(1);                                                            
        AD5160_Set(100);                                                   
        ADG738_Set(0x02);                                                     
        AD7193_RangeSetup(1, AD7193_CONF_GAIN_8);      
        AD7193_ConfigSetup(1, 0);                                    
        AD7193_ChannelSelect(AD7193_CH_0);                        

        while(1)
        {
                if(flag_1ms == 1)
                {
                        flag_1ms = 0;
                        
                        AD7193_ChannelSelect(AD7193_CH_0);      
                        value_temp = AD7193_SingleConversion();                     
                        send_value1 = (value_temp * 502)/(0x1000000);                     
                                            
                        usart1_send(0xDD);
                        usart1_send(send_value1);
                }
        }
}

相关帖子

沙发
any012|  楼主 | 2016-2-22 11:53 | 只看该作者
在while循环外有AD7193_ChannelSelect(AD7193_CH_0);这句没事;
加在while循环里就不行。
不过是这句,只要是ad7193相关的函数,加在while循环里,最后读的数就出错。

使用特权

评论回复
板凳
songchenping| | 2016-2-22 12:26 | 只看该作者
最简单的你可以用GPIO口模拟SPI通信读取啊。

使用特权

评论回复
地板
any012|  楼主 | 2016-2-22 13:44 | 只看该作者
本帖最后由 any012 于 2016-2-22 13:46 编辑
songchenping 发表于 2016-2-22 12:26
最简单的你可以用GPIO口模拟SPI通信读取啊。

现在就是IO口模拟SPI读取。只不过是按ad官网给的函数来回调用。
你说的也是个办法,直接用spi函数发送对应数据。
谢谢。

使用特权

评论回复
5
any012|  楼主 | 2016-2-23 09:53 | 只看该作者
本帖最后由 any012 于 2016-2-23 10:01 编辑
while(1)
        {
                if(flag_1ms == 1)
                {
                        flag_1ms = 0;
                        
//                        AD7193_ChannelSelect(AD7193_CH_0);      
                        AD7193_SetRegisterValue(AD7193_REG_CONF, 0x10010B, 3, 1);
                        value_temp = AD7193_SingleConversion();                  
                        send_value1 = (value_temp * 502)/(0x1000000);        
                        
                        usart1_send(0xDD);
                        usart1_send(send_value1 >> 16);
                        usart1_send(send_value1 >> 8);
                        usart1_send(send_value1);
                }

原来是调用的设置通道函数,把设置通道发送的SPI数据通过串口发上来一看,是10011A,按前边设置,应该是10010B。
这样,AD7193内部放大器的增益就不对了,故数值变为理论值的一半。
直接用调用AD7193配置函数发送0x10010B,得到的结果是正确的。
----------------------------------------------------------------

AD7193_SetRegisterValue(AD7193_REG_CONF, 0x10010B, 3, 1);
                        AD7193_ChannelSelect(AD7193_CH_0);
                        value_temp = AD7193_SingleConversion();       
又测试了下,先调用AD7193的配置函数设置相应配置,此时放大器增益应已设为8了。
然后再调用下通道切换函数,该函数是先读取原来的配置寄存器数据,修改通道相关位后,再写入。
结果测量的数还是为理论值一半,应该是AD7193_ChannelSelect(AD7193_CH_0); 这个函数出了问题。

使用特权

评论回复
6
JeanneWen| | 2016-6-27 16:09 | 只看该作者
楼主,您好。请问一下,我在用AD7193这款芯片的时候,用的也是官方的库,怎么读它的ID寄存器都读不到呢?我的AD7193是28引脚封装的,电路是按参考电路设计的。谢谢~~

使用特权

评论回复
7
any012|  楼主 | 2016-7-11 15:54 | 只看该作者
本帖最后由 any012 于 2016-7-11 15:56 编辑
JeanneWen 发表于 2016-6-27 16:09
楼主,您好。请问一下,我在用AD7193这款芯片的时候,用的也是官方的库,怎么读它的ID寄存器都读不到呢?我 ...

最近一直没登录论坛,抱歉。
我没有读取ID寄存器,我是发送单次转换命令,然后等待转换完成后直接读数据寄存器。
官方的库,或多或少都要做些修改吧。

你可以先试下读取内部温度寄存器,这个貌似比较简单,我是从这里开始入手的。
如果不行的话,用示波器检测下SPI各管脚的波形是否正确吧。

使用特权

评论回复
8
yunmenshan865| | 2016-7-12 09:17 | 只看该作者
any012 发表于 2016-7-11 15:54
最近一直没登录论坛,抱歉。
我没有读取ID寄存器,我是发送单次转换命令,然后等待转换完成后直接读数据寄 ...

你好,我现在正在用AD7193,你说的官方的库 是从哪儿里 弄得,能告知下吗?

使用特权

评论回复
9
any012|  楼主 | 2016-7-14 09:33 | 只看该作者
yunmenshan865 发表于 2016-7-12 16:17
能 参考下 你的代码 吗?

希望对你有帮助...

//读AD7193内部温度寄存器值        
//                        AD7193_ConfigSetup(0, 0);
//                        value_temp1 = AD7193_TemperatureRead();



User.zip (4.95 KB)

使用特权

评论回复
10
yunmenshan865| | 2016-7-20 08:15 | 只看该作者
any012 发表于 2016-7-14 09:33
希望对你有帮助...

AD7193的失调寄存器 是干什么用的

使用特权

评论回复
11
any012|  楼主 | 2016-7-21 09:05 | 只看该作者
yunmenshan865 发表于 2016-7-20 08:15
AD7193的失调寄存器 是干什么用的

不知道,没仔细研究过。

使用特权

评论回复
12
yunmenshan865| | 2016-7-21 16:49 | 只看该作者
any012 发表于 2016-7-21 09:05
不知道,没仔细研究过。

AG702,ADG738,AD5201  这些设置的函数  你有吗

使用特权

评论回复
13
any012|  楼主 | 2016-7-22 09:15 | 只看该作者
本帖最后由 any012 于 2016-7-22 09:31 编辑
yunmenshan865 发表于 2016-7-21 16:49
AG702,ADG738,AD5201  这些设置的函数  你有吗

这些是我自己编的...
写的挺差的...
读ad7193内部温度寄存器数据的话,用不到以上这些设置。

void ADG702_Set(unsigned char value)
{
        SPI3_Delay();
        AD7193_CS(ON);
        
        AD7193_SetGPIO2(value);

        SPI3_Delay();
        AD7193_CS(ON);
}

我这里没有用AD5201,而是用的AD5160。按官网参考图的接法,片选是有AD7193的P3口控制的。
一开始我通过SPI发送完阻值后,再发送AD7193的P3控制命令,结果控制命令被当作AD5160当作有效数据处理了。我找不到解决办法,就飞了根线,用单片机多余的IO口来单独控制AD5160的CS引脚。
在ADI官方论坛上就这个问题发过求助帖,后来看到版主回复,有方法可以处理这个问题。你有兴趣的话可以去ADI中文论坛上搜一下。
#include "ad5160.h"

void AD5160_Set(unsigned char value)
{
        ERR(0);
        SPI3_ReadWriteByte(value);
        ERR(1);
}


AD738这个有点麻烦,这个板上的其他芯片的SPI的空闲电平,都是高电平,它这个是低电平。
如果是用单片机硬件SPI的话,需要转换模式,当时挺头疼的,现在改成IO口软件模拟SPI,这个问题就好说了。但是速度可能要慢。
现在我这板子一次转换完四路数据,目测要两三秒以上。想着以后有时间了再改成硬件SPI吧。

#include "adg738.h"

//¸ÃоƬÊÇϽµÑزÉÑù£¬¹ÊÐèÒª¸ü¸Ä¿ÕÏеçƽ
void ADG738_Set(unsigned char value)
{
//        unsigned char i;
        ADG738_SPI_WriteRead(value);
//        for(i = 0; i < 100; i++)
//                SPI3_Delay();
       
}

unsigned char ADG738_SPI_WriteRead(unsigned char TxData)
{
        unsigned char i, SDI;
        unsigned char Temp = 0x00;
        SPI3_SCK(0);
        SPI3_Delay();
        ADG738_CS(0);
        for(i = 0; i < 8; i++)
        {
                SPI3_SCK(1);
                if(TxData & 0x80)
                        SPI3_MOSI(1);
                else
                        SPI3_MOSI(0);
                TxData <<= 1;
                SPI3_Delay();
               
                SPI3_SCK(0);
                SDI = SPI3_MISO();
                if(SDI)
                        Temp++;
                SPI3_Delay();
        }
        ADG738_CS(1);
        SPI3_SCK(1);
        SPI3_Delay();
        return Temp;
}



使用特权

评论回复
14
醒心online| | 2016-12-29 09:49 | 只看该作者
JeanneWen 发表于 2016-6-27 16:09
楼主,您好。请问一下,我在用AD7193这款芯片的时候,用的也是官方的库,怎么读它的ID寄存器都读不到呢?我 ...

最近在调AD7193.读ID寄存器一直是0X00.MISO一直为低

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

232

帖子

6

粉丝