打印
[数据转换器-信号链]

ADS1216Y操作过程请教

[复制链接]
1923|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HUA_WIND|  楼主 | 2015-9-10 09:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 HUA_WIND 于 2015-9-11 20:07 编辑

我想请大侠帮忙看一下我的ad转换软件过程有没有错误,急等。谢谢。
硬件说明:用的是AIN0,1差分,参考是内部2.5V,同步DSYNC及DRDY引脚悬空用软件控制。
软件读写寄存器正确,AD转换读出来的数据随机,不正确。(差分输入端短路时读出的数据也是随机的)

void AD_Convert(void)
{
  BYTE temp;  
  SPI_CSN_CLR;
  DrvSYS_Delay(3000);//选择ADS1216Y

SpiTxRxByte(0xfe);
DrvSYS_Delay(100);//复位ADS1216寄存器
  SpiTxRxByte(0x50);
  SpiTxRxByte(0x02);
  SpiTxRxByte(0x0e);//配置SETUP寄存器,内部参考2.5V,允许BUFFER
  SpiTxRxByte(0x01);//差分AIN0+,AIN1-
  SpiTxRxByte(0x00);//动态范围5V(增益设置)
DrvSYS_Delay(100);
//test    读寄存器ok
//  SpiTxRxByte(0x19);
//  SpiTxRxByte(0x00);
//  AD0_VALUE[0] = SpiTxRxByte(0);
//test  
  SpiTxRxByte(0x58);
  SpiTxRxByte(0x01);
  SpiTxRxByte(0x80);//设置采样频率0x780
  SpiTxRxByte(0x07);
DrvSYS_Delay(100);
  SpiTxRxByte(0x57);//配置IO全为输出
  SpiTxRxByte(0x00);
  SpiTxRxByte(0x00);
DrvSYS_Delay(100);

  SpiTxRxByte(0x5D);//配置满刻度寄存器
  SpiTxRxByte(0x02);
  SpiTxRxByte(0xFF);
  SpiTxRxByte(0xFF);
  SpiTxRxByte(0xFF);
DrvSYS_Delay(100);

  SpiTxRxByte(0x59);
  SpiTxRxByte(0x00);
  SpiTxRxByte(0x37);//选择SINC3滤波器,双极性输出
DrvSYS_Delay(100);

  SpiTxRxByte(0x56);
  SpiTxRxByte(0x00);
  SpiTxRxByte(0x08);//08h选择外部输入(硬件上选择差分对)
DrvSYS_Delay(1000);

SpiTxRxByte(0xfc);//发DSYNC命令

DrvSYS_Delay(500);
wait:    SpiTxRxByte(0x19);//读DRDY标志
SpiTxRxByte(0x00);
  temp=SpiTxRxByte(0);
  temp=temp&0x80;
if(temp)goto wait;//等待转换数据准备好

  SpiTxRxByte(0x01);//发RDATA命令
  DrvSYS_Delay(100);
SpiTxRx3Byte(0);//连续读三字节子程序(读寄存器的子程序读一字节)
  SPI_CSN_SET;
}

以下是连续读3字节子程序(看TI的RDATA过程好像每读一个字节要发一个虚拟命令0xff,但看手册没这个要求,晕了)
void SpiTxRx3Byte(BYTE dat)
{
BYTE i,j,temp;
temp = 0;
SPI_SCK_CLR;

for(j=0;j<3;j++)
{
for(i=0; i<8; i++)
{
  if(dat & 0x80)
  {
        SPI_DIN_SET;
  }
  else
  {
     SPI_DIN_CLR;
  }
  
  dat <<= 1;
  SPI_SCK_SET;
  
   Spi_nop();
   Spi_nop();
   Spi_nop();
   Spi_nop();
   Spi_nop();
  temp <<= 1;
  
  if(SPI_MISO)  /* CPU_IN */
  {
   temp++;
  }
  
  SPI_SCK_CLR;

    Spi_nop();
   Spi_nop();
   Spi_nop();
   Spi_nop();
   Spi_nop();
}
AD0_VALUE[j]=temp;temp=0;
   }
}


相关帖子

沙发
airwill| | 2015-9-10 11:47 | 只看该作者
用什么 MCU, 怎么连接都没有说明. 你也不能急成这样啊.
我看这段程序还是底层数据接口部分的. 应该还需要时序验证吧, 不如请出你的示波器帮忙吧

使用特权

评论回复
板凳
HUA_WIND|  楼主 | 2015-9-10 12:20 | 只看该作者
airwill 发表于 2015-9-10 11:47
用什么 MCU, 怎么连接都没有说明. 你也不能急成这样啊.
我看这段程序还是底层数据接口部分的. 应该还需要时 ...

抱歉,忘了说了,读写寄存器正确,AD转换读出来的数据随机,不正确。我想让大侠看看AD过程有什么不对,硬件上核查过了没问题。我用的IO模拟SPI。谢谢

使用特权

评论回复
地板
shenmu2012| | 2015-9-10 19:47 | 只看该作者
使用SPI总线来实现的,比较好。

使用特权

评论回复
5
airwill| | 2015-9-10 20:50 | 只看该作者
软件读写寄存器正确,AD转换读出来的数据随机,不正确。
比较奇怪, 软件读写寄存器正确, 应该时序上没有问题了.
但是AD转换读出来的数据随机,不正确!你应该关注一下同步DSYNC及DRDY引脚的信号, 从手册看, ADC 的数据要在 DRDY 信号条件下输出的.

使用特权

评论回复
6
xyz549040622| | 2015-9-11 08:03 | 只看该作者
读写寄存器正确,读数据错误,你测试下你的AD读VCC和地也是随机的错误么?

使用特权

评论回复
7
309030106| | 2015-9-18 19:49 | 只看该作者
ADC 的数据要在 DRDY 信号条件下输出的

使用特权

评论回复
8
jianghuailiang| | 2019-8-19 14:45 | 只看该作者
解决了吗,我调了一个板子也是读写寄存器正确,AD转换读出来的数据随机

使用特权

评论回复
9
jianghuailiang| | 2019-8-19 14:46 | 只看该作者
写完寄存器后再读出来写的值是对的,通信是可以的,读转换值是乱的,代码如下,不知道配置后直接写读数据对不对

write_byte(0xfe); //¸复位
delay_us(100);

write_byte(0x50); //写配置
write_byte(0x02);
write_byte(0x0e);//内部参考电压2.5V
write_byte(0x02);//Ain0+ Ain2-
write_byte(0x05);//PGA 32

delay_us(100);
write_byte(0x59);
write_byte(0x00);
write_byte(0x07);

。。。。

while(DRDY);//
write_byte(0x01); //写命令读数据
delay_us(1);
read_24bit(VALUE);

读的值

FF EE 24
FF F6 77
00 04 2A
00 02 AC
FF F0 1A
00 12 11

使用特权

评论回复
10
conjunction| | 2019-8-21 19:46 | 只看该作者
你的输入信号两条线电压范围是不是在芯片允许输入范围内

使用特权

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

本版积分规则

73

主题

89

帖子

0

粉丝