搜索

麻烦问一下AD7608可以输出负电压吗?

[复制链接]
403|26
 楼主 | 2020-9-24 11:33 | 显示全部楼层 |阅读模式
本帖最后由 二木不是猫 于 2020-9-29 10:01 编辑

看了几遍datasheet还是不太确定想要问一下ad7608可以输入输出负电压吗?
谢谢~

RAR/SER SEL--高电平
RANGE --高电平
REF_SEL--高电平
OS0--低电平
OS1--高电平
OS2--高电平
采样率选取的是:无过采样

时序图是按照这个区配的

时序

时序

电路

电路

使用特权

评论回复

评论

xmar 2020-9-29 09:55 回复TA
AD7608是A/D转换IC,可以输入模拟负电压,这个没有问题。但不能输出模拟电压。 
| 2020-9-24 11:47 | 显示全部楼层
模数转换器输入可以有负压,输出是数字量,应该没有。

使用特权

评论回复
 楼主 | 2020-9-24 11:58 | 显示全部楼层
@Kun 发表于 2020-9-24 11:47
模数转换器输入可以有负压,输出是数字量,应该没有。

我找了一个dac输出的负压接进去没有输出。。。看起来好像应该是不可以的。。。

使用特权

评论回复
| 2020-9-24 12:00 | 显示全部楼层
二木不是猫 发表于 2020-9-24 11:58
我找了一个dac输出的负压接进去没有输出。。。看起来好像应该是不可以的。。。 ...

需要双电源供电才可以

使用特权

评论回复
 楼主 | 2020-9-24 12:05 | 显示全部楼层
@Kun 发表于 2020-9-24 12:00
需要双电源供电才可以

好吧 那这样看应该是不行了。。

使用特权

评论回复
| 2020-9-25 09:12 | 显示全部楼层
478145f6d43bf484b4.png ,单5V供电,双极性输入。可以输入负电压,如果没有输出肯定是你的设计问题,好好查一下吧。

使用特权

评论回复
 楼主 | 2020-9-25 09:32 | 显示全部楼层
00750 发表于 2020-9-25 09:12
,单5V供电,双极性输入。可以输入负电压,如果没有输出肯定是你的设计问题,好好查一下吧。 ...

嗯嗯!是要改为差分模式~才可以

使用特权

评论回复
| 2020-9-25 16:55 | 显示全部楼层
二木不是猫 发表于 2020-9-25 09:32
嗯嗯!是要改为差分模式~才可以

这个器件是伪差分输入,负端接地即可。

使用特权

评论回复
 楼主 | 2020-9-25 18:14 | 显示全部楼层
00750 发表于 2020-9-25 16:55
这个器件是伪差分输入,负端接地即可。

还有就是我的输出值和输入值差距比较大 ,会有什么原因么。。

使用特权

评论回复
| 2020-9-26 09:38 | 显示全部楼层
这家伙是7606的弟弟?

使用特权

评论回复
| 2020-9-26 15:28 | 显示全部楼层
没接触过,都是高手,默默的路过看看各位大哥怎么说的。

使用特权

评论回复
| 2020-9-27 08:57 | 显示全部楼层
二木不是猫 发表于 2020-9-25 18:14
还有就是我的输出值和输入值差距比较大 ,会有什么原因么。。

首先确认一下,输入与输出是否呈线性关系,7608是18位ADC,如果设置正确不可能出现输入与输出差异较大的现象。着重查一下,输入范围设置、基准电压选的是内部基准还是外部基准、以及ADC前端的调理电路。这种器件还是比较容易使用的,按照参考电路来做基本不会有问题。

使用特权

评论回复
 楼主 | 2020-9-28 10:42 | 显示全部楼层
zchong 发表于 2020-9-26 09:38
这家伙是7606的弟弟?

是它哥哥。。

使用特权

评论回复
 楼主 | 2020-9-28 10:45 | 显示全部楼层
00750 发表于 2020-9-27 08:57
首先确认一下,输入与输出是否呈线性关系,7608是18位ADC,如果设置正确不可能出现输入与输出差异较大的 ...

是线性关系,配置也没有问题,用的内部基准;输入5V的话输出计算完只有4.7V左右。而且如果我的输出每隔很久才会输出一个数,采集部分看起来没有问题,打印也找不到问题,这个会和采样率有关系吗

使用特权

评论回复
| 2020-9-29 08:55 | 显示全部楼层
二木不是猫 发表于 2020-9-28 10:45
是线性关系,配置也没有问题,用的内部基准;输入5V的话输出计算完只有4.7V左右。而且如果我的输出每隔很 ...

最好上传一下电路图吧,顺便说下你的控制时序。

使用特权

评论回复
 楼主 | 2020-9-29 10:08 | 显示全部楼层
00750 发表于 2020-9-29 08:55
最好上传一下电路图吧,顺便说下你的控制时序。

CONVST_A/B上升沿
然后判断BUSY是否为高电平,如果是,保持。
CS下降沿,
SCLK下降沿,读取结束后,SCLK上升沿
然后打印完输出数据
CS上升沿,
CONVST_A/B由低变为高

嗯。。大概就是这样。图我贴在上面啦

使用特权

评论回复
| 2020-9-29 11:14 | 显示全部楼层
看了一下你发的图和控制时序。由于你的图不全,有几个地方需要注意一下:1.第42脚,需要一个不小于10uF的去耦电容,在你的原理图上没有看到。2.输入滤波那里,只是一个一阶低通吗?截止频率设置的多少?会不会对你的输入信号有衰减?3.OS0--低电平,OS1--高电平,OS2--高电平是有64倍过采样的,这个影响吞吐率。控制时序方面,应该在BUSY信号的下降沿之后读取数据,并且是一次性读取8个通道的数据。好的办法是设置BUSY信号下降沿触发你的CPU中断,在中断中进行数据读取。

使用特权

评论回复
 楼主 | 2020-9-29 11:47 | 显示全部楼层
00750 发表于 2020-9-29 11:14
看了一下你发的图和控制时序。由于你的图不全,有几个地方需要注意一下:1.第42脚,需要一个不小于10uF的去 ...

这个是我刚刚网上找了一份代码,这样写是可以的吧。



AD7608_SETOS(0X00);
  AD7608_RESET();
  AD7608_CONVST_A_H;
  AD7608_CONVST_B_H;
  
  
  while (1)
  {
    if(!AD7608_BUSY)
    {
      AD7608_CS_L;
      for(uint8_t i = 0;i < 8;i++)
      {
        datatemp=ad7606_ReadDATA();
      }
      AD7608_CS_H;
      AD7608_STARTCONV();
      while(AD7608_BUSY);
    }
  }
}

void AD7608_STARTCONV(void)
{
  AD7608_CONVST_A_L;
  AD7608_CONVST_B_L;
  Delay(0xF);
  AD7608_CONVST_A_H;
  AD7608_CONVST_B_H;
}

uint32_t ad7606_ReadDATA(void)
{
  uint32_t usData = 0;
  for (uint8_t i = 0; i < 18; i++)
  {
    AD7608_SCLK_L;
    usData = usData << 1;
    if(AD7608_DOUTA)
    {
      usData |= 0x0001;
    }
    AD7608_SCLK_H;
  }
  return usData;               
}

void AD7608_RESET(void)
{
  AD7608_RESET_H;
  Delay(0xFF);
  AD7608_RESET_L;
}

void AD7608_SETOS(uint8_t osv)
{
  switch(osv)
  {
  case 0://000
    AD7608OS0_L;
    AD7608OS1_L;
    AD7608OS2_L;
    break;
  case 1://001
    AD7608OS0_H;
    AD7608OS1_L;
    AD7608OS2_L;
    break;
  case 2://010
    AD7608OS0_L;
    AD7608OS1_H;
    AD7608OS2_L;
    break;
  case 3://011
    AD7608OS0_H;
    AD7608OS1_H;
    AD7608OS2_L;
    break;
  case 4://100
    AD7608OS0_L;
    AD7608OS1_L;
    AD7608OS2_H;
    break;
  case 5://101
    AD7608OS0_H;
    AD7608OS1_L;
    AD7608OS2_H;
    break;
  case 6://110
    AD7608OS0_L;
    AD7608OS1_H;
    AD7608OS2_H;
    break;
  }
}



配置
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_11|GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

使用特权

评论回复
| 2020-9-29 15:04 | 显示全部楼层
做为测试程序,这个程序流程是没问题的,但是只能读到最后一个通道的数据。你还得看一下这个模拟spi总线的时序是否满足ad7608的要求。从你前面的说明来看,能读回数据,而且也是线性变化的,只是测量值和真实值之间有误差,那你应该把主要精力集中在硬件上,软件出问题的可能性不大。

使用特权

评论回复
 楼主 | 2020-9-29 15:39 | 显示全部楼层
00750 发表于 2020-9-29 15:04
做为测试程序,这个程序流程是没问题的,但是只能读到最后一个通道的数据。你还得看一下这个模拟spi总线的 ...

这个怎么改可以只读第一个通道的数据呀,我昨天睡了一觉醒来,今天就没有数据输出了。。头痛

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /5 下一条

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