读AD7193数据遇到的问题。

[复制链接]
3429|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的操作,然后再读取寄存器值,读出来的都是实际值的一半。

  1. int main(void)
  2. {
  3.         u32 value_temp;
  4.         u8 send_value1, send_value2, send_value3, send_value4;

  5.         GPIO_Config();                                                            
  6.         SPI3_Init();                                                              
  7.         USART1_Config();                                                      
  8.         TIM3_Config(9999, 7199);                                       
  9.         WriteToADT7310ViaSPI(0x01,0x00);                       
  10.         AD7193_GPIO23_ENABLE(1);                                       
  11.         
  12.         ADG702_Set(1);                                                            
  13.         AD5160_Set(100);                                                   
  14.         ADG738_Set(0x02);                                                     
  15.         AD7193_RangeSetup(1, AD7193_CONF_GAIN_8);      
  16.         AD7193_ConfigSetup(1, 0);                                    
  17.         AD7193_ChannelSelect(AD7193_CH_0);                        

  18.         while(1)
  19.         {
  20.                 if(flag_1ms == 1)
  21.                 {
  22.                         flag_1ms = 0;
  23.                         
  24.                         AD7193_ChannelSelect(AD7193_CH_0);      
  25.                         value_temp = AD7193_SingleConversion();                     
  26.                         send_value1 = (value_temp * 502)/(0x1000000);                     
  27.                                             
  28.                         usart1_send(0xDD);
  29.                         usart1_send(send_value1);
  30.                 }
  31.         }
  32. }

 楼主| 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函数发送对应数据。
谢谢。

 楼主| any012 发表于 2016-2-23 09:53 | 显示全部楼层
本帖最后由 any012 于 2016-2-23 10:01 编辑
  1. while(1)
  2.         {
  3.                 if(flag_1ms == 1)
  4.                 {
  5.                         flag_1ms = 0;
  6.                         
  7. //                        AD7193_ChannelSelect(AD7193_CH_0);      
  8.                         AD7193_SetRegisterValue(AD7193_REG_CONF, 0x10010B, 3, 1);
  9.                         value_temp = AD7193_SingleConversion();                  
  10.                         send_value1 = (value_temp * 502)/(0x1000000);        
  11.                         
  12.                         usart1_send(0xDD);
  13.                         usart1_send(send_value1 >> 16);
  14.                         usart1_send(send_value1 >> 8);
  15.                         usart1_send(send_value1);
  16.                 }

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

  1. AD7193_SetRegisterValue(AD7193_REG_CONF, 0x10010B, 3, 1);
  2.                         AD7193_ChannelSelect(AD7193_CH_0);
  3.                         value_temp = AD7193_SingleConversion();       
又测试了下,先调用AD7193的配置函数设置相应配置,此时放大器增益应已设为8了。
然后再调用下通道切换函数,该函数是先读取原来的配置寄存器数据,修改通道相关位后,再写入。
结果测量的数还是为理论值一半,应该是AD7193_ChannelSelect(AD7193_CH_0); 这个函数出了问题。
JeanneWen 发表于 2016-6-27 16:09 | 显示全部楼层
楼主,您好。请问一下,我在用AD7193这款芯片的时候,用的也是官方的库,怎么读它的ID寄存器都读不到呢?我的AD7193是28引脚封装的,电路是按参考电路设计的。谢谢~~
 楼主| any012 发表于 2016-7-11 15:54 | 显示全部楼层
本帖最后由 any012 于 2016-7-11 15:56 编辑
JeanneWen 发表于 2016-6-27 16:09
楼主,您好。请问一下,我在用AD7193这款芯片的时候,用的也是官方的库,怎么读它的ID寄存器都读不到呢?我 ...

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

你可以先试下读取内部温度寄存器,这个貌似比较简单,我是从这里开始入手的。
如果不行的话,用示波器检测下SPI各管脚的波形是否正确吧。
yunmenshan865 发表于 2016-7-12 09:17 | 显示全部楼层
any012 发表于 2016-7-11 15:54
最近一直没登录论坛,抱歉。
我没有读取ID寄存器,我是发送单次转换命令,然后等待转换完成后直接读数据寄 ...

你好,我现在正在用AD7193,你说的官方的库 是从哪儿里 弄得,能告知下吗?
 楼主| any012 发表于 2016-7-14 09:33 | 显示全部楼层
yunmenshan865 发表于 2016-7-12 16:17
能 参考下 你的代码 吗?

希望对你有帮助...

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




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yunmenshan865 发表于 2016-7-20 08:15 | 显示全部楼层
any012 发表于 2016-7-14 09:33
希望对你有帮助...

AD7193的失调寄存器 是干什么用的
 楼主| any012 发表于 2016-7-21 09:05 | 显示全部楼层
yunmenshan865 发表于 2016-7-20 08:15
AD7193的失调寄存器 是干什么用的

不知道,没仔细研究过。
yunmenshan865 发表于 2016-7-21 16:49 | 显示全部楼层
any012 发表于 2016-7-21 09:05
不知道,没仔细研究过。

AG702,ADG738,AD5201  这些设置的函数  你有吗
 楼主| any012 发表于 2016-7-22 09:15 | 显示全部楼层
本帖最后由 any012 于 2016-7-22 09:31 编辑
yunmenshan865 发表于 2016-7-21 16:49
AG702,ADG738,AD5201  这些设置的函数  你有吗

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

  1. void ADG702_Set(unsigned char value)
  2. {
  3.         SPI3_Delay();
  4.         AD7193_CS(ON);
  5.         
  6.         AD7193_SetGPIO2(value);

  7.         SPI3_Delay();
  8.         AD7193_CS(ON);
  9. }

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

  2. void AD5160_Set(unsigned char value)
  3. {
  4.         ERR(0);
  5.         SPI3_ReadWriteByte(value);
  6.         ERR(1);
  7. }


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

  1. #include "adg738.h"

  2. //¸ÃоƬÊÇϽµÑزÉÑù£¬¹ÊÐèÒª¸ü¸Ä¿ÕÏÐµçÆ½
  3. void ADG738_Set(unsigned char value)
  4. {
  5. //        unsigned char i;
  6.         ADG738_SPI_WriteRead(value);
  7. //        for(i = 0; i < 100; i++)
  8. //                SPI3_Delay();
  9.        
  10. }

  11. unsigned char ADG738_SPI_WriteRead(unsigned char TxData)
  12. {
  13.         unsigned char i, SDI;
  14.         unsigned char Temp = 0x00;
  15.         SPI3_SCK(0);
  16.         SPI3_Delay();
  17.         ADG738_CS(0);
  18.         for(i = 0; i < 8; i++)
  19.         {
  20.                 SPI3_SCK(1);
  21.                 if(TxData & 0x80)
  22.                         SPI3_MOSI(1);
  23.                 else
  24.                         SPI3_MOSI(0);
  25.                 TxData <<= 1;
  26.                 SPI3_Delay();
  27.                
  28.                 SPI3_SCK(0);
  29.                 SDI = SPI3_MISO();
  30.                 if(SDI)
  31.                         Temp++;
  32.                 SPI3_Delay();
  33.         }
  34.         ADG738_CS(1);
  35.         SPI3_SCK(1);
  36.         SPI3_Delay();
  37.         return Temp;
  38. }



醒心online 发表于 2016-12-29 09:49 | 显示全部楼层
JeanneWen 发表于 2016-6-27 16:09
楼主,您好。请问一下,我在用AD7193这款芯片的时候,用的也是官方的库,怎么读它的ID寄存器都读不到呢?我 ...

最近在调AD7193.读ID寄存器一直是0X00.MISO一直为低
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

232

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部