问答

汇集网友智慧,解决技术难题

21ic问答首页 - 麻烦问一下AD7608可以输出负电压吗?

AD 电压 电平 os se

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

本帖最后由 二木不是猫 于 2020-9-29 10:01 编辑

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

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

时序图是按照这个区配的

回答 +关注 19
2249人浏览 25人回答问题 分享 举报
25 个回答

  • 嗯嗯 谢谢你 我再去找找问题
  • 二木不是猫 发表于 2020-9-30 13:37
    查过了 没找到有问题的地方 我已经在查第二遍了,这个电路busy和douta口需要加上拉电阻吗
    ...

    不需要
  • 00750 发表于 2020-9-30 10:54
    硬件部分查了吗?

    查过了 没找到有问题的地方 我已经在查第二遍了,这个电路busy和douta口需要加上拉电阻吗
  • 二木不是猫 发表于 2020-9-30 09:45
    话说 我其实很早就改过这里,然后没有效果。。。

    硬件部分查了吗?
  • 00750 发表于 2020-9-30 09:06
    把while(1)里面的for(8)改成for(1)或for(9)。你没看到每次循环都一个固定变量赋值吗? ...

    话说 我其实很早就改过这里,然后没有效果。。。
  • 二木不是猫 发表于 2020-9-29 15:39
    这个怎么改可以只读第一个通道的数据呀,我昨天睡了一觉醒来,今天就没有数据输出了。。头痛
    ...

    把while(1)里面的for(8)改成for(1)或for(9)。你没看到每次循环都一个固定变量赋值吗?
  • 00750 发表于 2020-9-29 15:04
    做为测试程序,这个程序流程是没问题的,但是只能读到最后一个通道的数据。你还得看一下这个模拟spi总线的 ...

    这个怎么改可以只读第一个通道的数据呀,我昨天睡了一觉醒来,今天就没有数据输出了。。头痛
  • 做为测试程序,这个程序流程是没问题的,但是只能读到最后一个通道的数据。你还得看一下这个模拟spi总线的时序是否满足ad7608的要求。从你前面的说明来看,能读回数据,而且也是线性变化的,只是测量值和真实值之间有误差,那你应该把主要精力集中在硬件上,软件出问题的可能性不大。
  • 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);
    }
123下一页

您需要登录后才可以回复 登录 | 注册