OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11770|回复: 11

ADS1115读回通道0和2值会颠倒

[复制链接]

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
发表于 2016-1-25 10:38:43 | 显示全部楼层 |阅读模式
1金钱
读参数是正常的,就是值跟管脚对不上,程序也是论友发布的[mw_shl_code=c,true]
#ifndef __ADS1115_H
#define __ADS1115_H
#include "stm32f10x_i2c.h"
#include "stm32f10x_gpio.h"
#define CMD_Write     0x90          //10010000
#define CMD_Read      0x91          //10010001
#define CMD_CONF_REG  0x01          //00000001
#define CMD_POINT_REG 0x00          
#define CONF_L        0x83          //11100011  10000011
#define channel_0      0                //表示选择通道0
#define channel_1      1                //表示选择通道1
#define channel_2      2                //表示选择通道2
#define channel_3      3                //表示选择通道2

u16 Get_ATOD (unsigned char channel);
void Confige1115(u8 channel);
void PointRegister (void) ;
u16 ReadData (unsigned char chn);
float display_ADS1(u8 cnt);
float display_ADS2(u8 cnt);

#endif[/mw_shl_code][mw_shl_code=c,true]#include "ads1115.h"
//#include "AD5420_IO.h"
#include "TWI.h"
#include "delay.h"

u16 value=0,value1=0;
u32 Limit_Avoid_filter(u32 last_value,u32 new_value);

//void Confige1115 (unsigned char port);
//void PointRegister (void);
//u16 ReadData (unsigned char chn);
unsigned char WriteIntBuf[4], WritepointBuf[2],ReadBuffer[2];

/*******************************************************************************
* Function Name  : Confige1115
* Description    : 延迟时间
* Input          : None
* Output         : None
* Return         : None
* Attention                 :获取ADS1115模拟转换结果
*******************************************************************************/
u16   data_get;
u16 dianya_value;
/*******************************************************************************
* Function Name  : Confige1115
* Description    : 延迟时间
* Input          : None
* Output         : None
* Return         : None
* Attention                 :配置ADS1115
*******************************************************************************/
void Confige1115 (unsigned char port)
{
    static unsigned char chnel, i;
    switch (port)
    {
      case 0:               //0通道
          chnel=0xC2;                //11000010
                                      break;
      
      case 1:               //1通道  
          chnel=0xD2;                 //11010010
                                      break;
         
      case 2:               //2通道  
          chnel=0xE2;                   //11100010
                                      break;
         
      case 3:               //3通道
          chnel=0xF2;                  //11110010
                                      break;
         
      default:
                                      break;       
    }
    WriteIntBuf[0] = CMD_Write;
    WriteIntBuf[1] = CMD_CONF_REG;
    WriteIntBuf[2] = chnel;
    WriteIntBuf[3] = CONF_L;
    if(!(TWI_START()))
    {
        for(i=0;i<4;i++)
        {
            TWI_SendByte(WriteIntBuf);
                 delay_us(1);
        }
    }
    TWI_STOP();

}
/*******************************************************************************
* Function Name  : PointRegister
* Description    : 延迟时间
* Input          : None
* Output         : None
* Return         : None
* Attention                 :指向ADS1115指针寄存器用于准备读取数据
*******************************************************************************/
void PointRegister (void)
{
    unsigned char i;
    WritepointBuf[0] = CMD_Write;                                        //90
    WritepointBuf[1] = CMD_POINT_REG;        //00
    if(!(TWI_START()))
    {
        for(i=0;i<2;i++)
        {
          TWI_SendByte(WritepointBuf);
          delay_us(1);
        }
    }
   TWI_STOP();
   
}
/*******************************************************************************
* Function Name  : I2C_delay
* Description    : 延迟时间
* Input          : None
* Output         : None
* Return         : None
* Attention                 :  CH1 PA4  CH2 PA7 CH3 PA6 CH4 PA5
*******************************************************************************/

u16 ReadData (unsigned char chn)
{  
   u16 data_rece;
   switch(chn)
   {
      case 0:               //0通道
        if(!(TWI_START()))
          {  
              TWI_SendByte(CMD_Read);
              delay_us(1);
              ReadBuffer[0] = TWI_ReceiveByte();
              TWI_SendACK();
              ReadBuffer[1] = TWI_ReceiveByte();
              TWI_SendACK();
              TWI_STOP();
                data_rece=ReadBuffer[0]*256+ReadBuffer[1];
          }
      break;
      
      case 1:               //1通道  
          if(!(TWI_START()))
          {   
                      TWI_SendByte(CMD_Read);
              delay_us(1);
              ReadBuffer[0] = TWI_ReceiveByte();
              TWI_SendACK();
              ReadBuffer[1] = TWI_ReceiveByte();
              TWI_SendACK();
              TWI_STOP();
                  data_rece=ReadBuffer[0]*256+ReadBuffer[1];
          }
      break;
         
      case 2:               //2通道  
         if(!(TWI_START()))
          {   
              TWI_SendByte(CMD_Read);
              delay_us(1);
              ReadBuffer[0] = TWI_ReceiveByte();
              TWI_SendACK();
              ReadBuffer[1] = TWI_ReceiveByte();
              TWI_SendACK();
              TWI_STOP();
                data_rece=ReadBuffer[0]*256+ReadBuffer[1];
          }
      break;
         
      case 3:               //3通道
        if(!(TWI_START()))
          {     
              TWI_SendByte(CMD_Read);
              delay_us(1);
              ReadBuffer[0] = TWI_ReceiveByte();
              TWI_SendACK();
              ReadBuffer[1] = TWI_ReceiveByte();
              TWI_SendACK();
              TWI_STOP();
                       data_rece=ReadBuffer[0]*256+ReadBuffer[1];
          }
      break;
         
      default:
      break;       
   }
                        return data_rece;
}

u16 Get_ATOD (unsigned char channel)
{
    unsigned char chn;
    chn = channel;  
    Confige1115(channel);
    delay_us(20);
    PointRegister();
    delay_us(20);
    data_get=ReadData(chn);
    delay_us(20);
        if(data_get>=0x8000)
        dianya_value=0x8000;
        else
        dianya_value=data_get;
        return dianya_value;   
}

float display_ADS1(u8 cnt)
{
        u32 temp_val=0;
        u8 t=0;

    float  temp;
        value= Get_ATOD(channel_0);

        for(t=0;t<cnt;t++)
        {
                temp_val+=value;
                delay_ms(5);
        }
        value =         temp_val / cnt;
        temp= ((float)(value)/32768.0)*4096;
        return          temp;
}

float display_ADS2(u8 cnt)
{
        u32 temp_val2=0;
        u8 t=0;       
   float  temp;
        value1=        Get_ATOD(channel_2);
                for(t=0;t<cnt;t++)
        {
                temp_val2+=value1;
                delay_ms(5);
        }
        value1 =         temp_val2 /  cnt;
        temp= ((float)(value1)/32768.0)*4096;
        return          temp;
}

#define A_N 8
#define A_A 50
//限幅值+消抖滤波
u32 Limit_Avoid_filter(u32 last_value,u32 new_value)
{
   static u32 result_value;
   if((new_value-last_value)>A_A||(last_value-new_value)>A_A) //消除局部小跳动
   {
                   result_value = last_value;
   }
   else
      result_value = new_value;
          return   result_value;

        }
[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

摸索了一天,找到问题了,配置寄存器后,要等待2ms以后才可以去读数据,不来就是错码
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
 楼主| 发表于 2016-1-25 10:38:44 | 显示全部楼层
摸索了一天,找到问题了,配置寄存器后,要等待2ms以后才可以去读数据,不来就是错码
回复

使用道具 举报

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
 楼主| 发表于 2016-1-25 11:06:38 | 显示全部楼层
单独读取数据没事,就是顺序读取就有问题了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-7-14
在线时间
0 小时
发表于 2016-7-14 15:48:40 | 显示全部楼层
赞一个,我的也是这问题
回复

使用道具 举报

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
 楼主| 发表于 2016-7-14 20:51:19 | 显示全部楼层
bobiniubi 发表于 2016-7-14 15:48
赞一个,我的也是这问题

读的时候加点延时就可以了,比如5ms就可以了
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2017-5-26
在线时间
17 小时
发表于 2017-5-29 12:34:46 | 显示全部楼层
赞一个,感谢
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2016-12-12
在线时间
11 小时
发表于 2017-7-26 15:06:09 | 显示全部楼层
请问楼主 解决了吗?
正在用楼主的程序,一点没改。用通道三采集的应该是对地的电压,但是采集出来是反的。
实际电压越小,显示数值越大。
回复

使用道具 举报

154

主题

289

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1067
金钱
1067
注册时间
2015-4-13
在线时间
189 小时
 楼主| 发表于 2017-9-3 08:22:13 | 显示全部楼层
奋斗的 发表于 2017-7-26 15:06
请问楼主 解决了吗?
正在用楼主的程序,一点没改。用通道三采集的应该是对地的电压,但是采集出来是反的 ...

这个芯片就不能对地,对地就会数据出错,建议加入偏置电压几mv
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2019-3-31
在线时间
14 小时
发表于 2019-3-31 20:47:49 | 显示全部楼层
jeraw 发表于 2016-1-25 10:38
摸索了一天,找到问题了,配置寄存器后,要等待2ms以后才可以去读数据,不来就是错码

楼主你好~想参考一下你的代码来着,可以跟我分享一下吗?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2021-4-30
在线时间
0 小时
发表于 2021-4-30 20:08:28 | 显示全部楼层
楼主您好,能否分享下您的代码,
回复

使用道具 举报

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2020-6-27
在线时间
23 小时
发表于 2022-6-15 14:41:42 | 显示全部楼层
楼主您好,能否分享下您的代码
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2024-6-1
在线时间
2 小时
发表于 2024-6-1 21:04:14 | 显示全部楼层

楼主您好,能否分享下您的代码,现在正在尝试驱动ADS1115
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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