ADI 技术
直播中

任娟娟

7年用户 195经验值
私信 关注
[问答]

ad7798/ad7799做精密AD转换停止转换

    我现在使用ad7798/ad7799做精密AD转换,信号经放大后送到ad7798/ad7799,一般情况下,如果信号强度缓慢变化,工作一直正常;但如果信号强度剧烈变化时,ad7798/ad7799就停止转换,即使信号很弱了,也不能恢复。我在软件中重置ad7798/ad7799都无法解决问题,只能重启设备。
    我想知道,这种情况该如何处理?还是我重置方法错了?文档中说如果出错,需要送四个0xff重置,但没有说如何检查出错。

ad7798/ad7799设置为连续转换,系统通过时钟中断检查转换结果。时钟中断5ms调用一次。check_ad7798在时钟中断中调用。


void check_ad7798(void)

{
    static uchar count = 0;
    if(PINB & BIT(PB3)){          //每5ms调用一次,10次则是50ms。 按123HZ的转换速率,每次应该是10ms以下。
      count++;                  //所以50ms还没有转换完的话,肯定是出问题了,需要重新初始化。
    if(count<10)
          return;
    init_ad7798();                        //重新初始化,送四个0xff
    init_ad7798_channel(CONF_CH1, 0);
    count = 0;
    return;   
    }

  //在这里读取数据
}

回帖(3)

杨军

2018-9-28 15:24:45
示波器把发软件reset的SPI波形截个图吧
 
另外输入剧烈变化具体是什么样
举报

任娟娟

2018-9-28 15:30:14
引用: 珠海易胜 发表于 2018-9-28 19:51
示波器把发软件reset的SPI波形截个图吧
 
另外输入剧烈变化具体是什么样

你好,我仔细检查了一下。
 
发现所谓停止转换是由于信号大于1.25V,再进一步检查,发现大于1.25V时,而小于1.25V时,结果为0x7fxx,刚好是最高位读不到。怀疑是PINB &BIT(PB3)屏蔽掉了。所以把  if(PINB & BIT(PB3)){ }整个IF块注释掉。
 
结果发现ad转换可以一直进行。但注释掉上面的if语句块,中间会冒出不正确值。
 
我现在采用的模式是连续转换,连续读的方式。
 
现在是明白了,如果DOUT/RDY线为低时,数据已经准备好,马上读不会出错。但DOUT/RDY为高时,也可能是数据已经转换好,可以读到,但也可能是没有准备好。
 
ad7798/ad7799文档中提到When DOUT/RDY goes low to indicate the end of a conversion, sufficient SCLK cycles must be applied to the ADC, and the data conversion is placed on the DOUT/RDY line. 就是说DOUT/RDY为0,还要送足够的SCLK到ADC,这样读到的数据才放在DOUT/RDY上。这个“sufficient SCLK cycles must be applied to the ADC” 中的sufficient是多少?如何操作?
举报

袁飞

2018-9-28 15:39:44
引用: djw200988 发表于 2018-9-28 19:57
你好,我仔细检查了一下。
 
发现所谓停止转换是由于信号大于1.25V,再进一步检查,发现大于1.25V时,而小于1.25V时,结果为0x7fxx,刚好是最高位读不到。怀疑是PINB &BIT(PB3)屏蔽掉了。所以把  if(PINB & BIT(PB3)){ }整个IF块注释掉。

看一下数据手册的figure3,需要时钟从MSB 到LSB
举报

更多回帖

发帖
×
20
完善资料,
赚取积分