找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 258|回复: 6
打印 上一主题 下一主题
收起左侧

关于ad1255输出数值一直抖动

[复制链接]
跳转到指定楼层
楼主
ID:1108750 发表于 2024-7-22 21:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬,我用AD1255采集电压,再通过SPI通信传给C8T6,但是读数结果一直变化,没有规律。想问问会是什么原因?
ad初始化函数:
void ads1255_init(void)
{
  SPI2_CS_RESET;
  delay_ms(500);
  /**************/
    while(DRDY==1);
    ads1255_selfcal();
    delay_ms(5000);
    ads1255_wakeup();
    delay_ms(2000);
    ads1255_reset();
    delay_ms(3000);
   ads1255_write_reg(ADS1256_STATUS,0x06);  //使用缓冲
   ads1255_write_reg(ADS1256_IO,0x00);//AIN0是正的,单端测量
   ads1255_write_reg(ADS1256_ADCON,ADS1256_GAIN_1);//时钟输出和传感器检测电流源功能关闭,PGA为1
   ads1255_write_reg(ADS1256_DRATE,ADS1256_DRATE_1000SPS);//数据速度1000SPS
    ads1255_selfcal();
    delay_ms(5000);
    SPI2_CS_SET;
}

AD读取函数:
float get_ad24_data(void)
{   
  SPI2_CS_RESET;
  delay_ms(5);
  while(DRDY==1);
  delay_us(200);
        ads1255_write_reg(ADS1256_MUX,ADS1256_MUXP_AIN0);   //读取通道0
  ads1255_rdata();
        ads1255_rdata();
        ads1255_rdata();
  delay_ms(5);
  retdata=ads1255_read();                       //读取
  delay_us(5);
  SPI2_CS_SET;
        if (retdata>0x7FFFFF)                                                           // if MSB=1,
        {
                retdata -= 0x800000;                                                       //do 2's complement               
        }       
        return retdata;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:280298 发表于 2024-7-23 07:15 | 只看该作者
1. PGA增益多少?
2. 测量的目标电压多少?
3. 模拟量,实际情况下,都是有波动的,具体的幅度视工况而定;
回复

使用道具 举报

板凳
ID:878236 发表于 2024-7-23 11:26 | 只看该作者
我这个ads1256使用的是差分模式、PGA1、sps2.5、buffer off、自整定 开,在读吉时利2401输出的50uV电压只会偏差3uV,跳动在1uV左右,如果你对读取速率不是要求很高可以降低速率
回复

使用道具 举报

地板
ID:1108750 发表于 2024-7-23 14:15 | 只看该作者
ag26259 发表于 2024-7-23 11:26
我这个ads1256使用的是差分模式、PGA1、sps2.5、buffer off、自整定 开,在读吉时利2401输出的50uV电压只会 ...

我需要1000sps的采样速率,现在就是读数抖动很大,都不是小范围那种误差
回复

使用道具 举报

5#
ID:1108750 发表于 2024-7-23 14:15 | 只看该作者
xo37 发表于 2024-7-23 07:15
1. PGA增益多少?
2. 测量的目标电压多少?
3. 模拟量,实际情况下,都是有波动的,具体的幅度视工况而定 ...

PGA1,测量电压2.5V,参考电压2.5V,读数在0-5v之间跳变,很不正常
回复

使用道具 举报

6#
ID:878236 发表于 2024-7-23 16:00 | 只看该作者
hc2002 发表于 2024-7-23 14:15
我需要1000sps的采样速率,现在就是读数抖动很大,都不是小范围那种误差

你这个跳动,给我感觉是你寄存器配置有问题,再加上没有在正确的时刻的读取转换完成的值,你在每次初始化的时候有没有去拉低一下PDWN引脚,再拉高后执行自校准命令,还有你读数据代码里面的读三个8位数据,为什么连着读3次又延时5ms再读一次,你再延时5ms已经过了你前面DRDY转换好的状态到第二次转换里面了,你再根据datasheet去修改一下你的驱动我这里有个1256的部分代码,基本没什么区别。不过你读取电压2.5V,应该不需要24位这种精度的ADC吧
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: ADS1256_ReadData
  4. *        功能说明: 读ADC数据
  5. *        形    参: 无
  6. *        返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static int32_t ADS1256_ReadData(void)
  10. {
  11.         uint32_t read = 0;

  12.         CS_0();        /* SPI片选 = 0 */

  13.         ADS1256_Send8Bit(CMD_RDATA);        /* 读数据的命令 */
  14.         
  15.         ADS1256_DelayDATA();        /* 必须延迟才能读取芯片返回数据 最小延迟 6.5uS, 此处取10us */

  16.         /* 读采样结果,3个字节,高字节在前 */
  17.         read = ((uint32_t)ADS1256_Recive8Bit()&0xff) << 16;
  18.         read |= ((uint32_t)ADS1256_Recive8Bit()&0xff)<< 8;
  19.         read |= ((uint32_t)ADS1256_Recive8Bit()&0xff) << 0;

  20.         CS_1();        /* SPI片选 = 1 */
  21.         
  22.         /* 负数进行扩展。24位有符号数扩展为32位有符号数 */
  23.         if (read & 0x800000)
  24.         {
  25.                 read += 0xFF000000;
  26.         }
  27.         
  28.         return (int32_t)read;
  29. }
  30. /*
  31. *********************************************************************************************************
  32. *        函 数 名: ADS1256_ReadAdc
  33. *        功能说明: 读指定通道的ADC数据
  34. *        形    参: 无
  35. *        返 回 值: 无
  36. *********************************************************************************************************
  37. */
  38. int32_t ADS1256_ReadAdc(uint8_t _ch)
  39. {
  40.         /* ADS1256 数据手册第21页 */
  41.         ADS1256_WaitDRDY();                /* 等待 DRDY = 0 */
  42.         switchChannel(_ch);        /* 切换模拟通道 */        
  43.         delay_us(2);
  44.         ADS1256_WriteCmd(CMD_SYNC);
  45.         delay_us(2);
  46.         ADS1256_WriteCmd(CMD_WAKEUP);
  47.         delay_us(5);
  48.         return (int32_t)ADS1256_ReadData();
  49. #endif        
  50. }
复制代码



回复

使用道具 举报

7#
ID:1108750 发表于 2024-7-23 22:27 | 只看该作者
ag26259 发表于 2024-7-23 16:00
你这个跳动,给我感觉是你寄存器配置有问题,再加上没有在正确的时刻的读取转换完成的值,你在每次初始化 ...

好的,谢谢您!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表