STM32, ADS1115

来源:互联网 发布:淘宝网的用户体验 编辑:程序博客网 时间:2024/05/17 04:33

STM32F103利用模拟I2C驱动ADS1115

标签: c语言stm32开源f1
 416人阅读 评论(0) 收藏 举报
 分类:
 

ADS1115通过模拟I2C驱动:(部分代码借鉴了网络上的几个,并且根据引脚进行了配置,都没有运行成功,今天调了一天,终于在晚上调了出来)

注意:本部分代码需要只是ADS1115的部分程序(一些用到的数组在此没有写),模拟II2C的各程序并未给出,大家根据需要进行裁剪,代码完全开源,希望能帮到大家,也希望大家乐于分享。

   调试时需特别注意I2C的通信问题,特别是应答信号的使用需要特别关注,本人的程序之前出错全是因为从机的应答信号的未使用造成。

           如有其它问题,欢迎指正批评,第一次写博客,感谢!


收获:对于I2C通信协议的理解更加深刻,对ADS1115也能进行单通道的使用。I2C的开始、发送/读写、应答、结束等一定要严格按照时序操作,ADS的操作还有所欠缺,仅仅会配置单通道,对于其他配置并没有关注,最近要把多通道的和阈值的配置也写好,到时再更新


附录代码:

#define CMD_Write      0x90                   ////写入命令 1001 0000  前7位表示ADS1115地址,最后1位0表示写
#define CMD_Read       0x91      ////读取命令  1001 001   前7位表示ADS1115地址,最后1位1表示读
#define CMD_POINT_REG  0x00         ////指向寄存器配置
#define CMD_CONF_REG   0x01        /////配置寄存器配置
#define CONF_L    0xe3        ////低8位
#define ADS1115_ADDR   0x90   /* ADS1115的设备地址,需配置 */

/*******************************************************************************
* Function Name  : Confige1115
* 参数           : 通道0/1/2/3
* Attention :配置ADS1115,根据需要的通道进行配置
*******************************************************************************/

static void Confige1115 (unsigned char port)
{
    static unsigned char chnel, i;
    switch (port)
    {
      case 0:               //0通道
          chnel=0xC2;
      break;
      
      case 1:               //1通道  
          chnel=0xD2;
      break;
          
      case 2:               //2通道  
          chnel=0xE2;
      break;
          
      case 3:               //3通道
          chnel=0xF2;
      break;
          
      default:
      break;
    }
    WriteIntBuf[0] = CMD_Write;                  //0x90
    WriteIntBuf[1] = CMD_CONF_REG;     //0x01
    WriteIntBuf[2] = chnel;  // 写入要配置的通道
    WriteIntBuf[3] = CONF_L;                       //0xe3

    i2c_Start();   /////开启I2C
    
for(i=0;i<4;i++)
{
i2c_SendByte(WriteIntBuf[i]);    /////发送寄存器配置信息
ads1115_delay(20);
        i2c_WaitAck();            ////注意,此处在最初调试时没有,读出数据一直不变,加上后正常
}
    
       i2c_Stop();   /////停止I2C
}

/*******************************************************************************
* Function Name  : PointRegister
* Attention   :  指向ADS1115指针寄存器用于准备读取数据
*******************************************************************************/
static void PointRegister (void)
{
    unsigned char i;
    WritepointBuf[0] = CMD_Write; //90
    WritepointBuf[1] = CMD_POINT_REG; //00

   i2c_Start();     /////开启I2C
   for(i=0;i<2;i++)
   {
i2c_SendByte(WritepointBuf[i]);   /////发送寄存器配置信息
i2c_WaitAck();
ads1115_delay(20);
   }
    i2c_Stop();  /////停止I2C
}

/*******************************************************************************
* 读取ADS1115的16位数据
*******************************************************************************/

static uint16_t ReadData (unsigned char chnnal1)
{  

uint16_t  data;

i2c_Start();     /////开启I2C 

i2c_SendByte(CMD_Read);   /////发送读命令
        ads1115_delay(20);
i2c_WaitAck();      ////注意,加上此句后程序正常,不加时我测试的读错数据,大家可能没事

ReadBuffer[0] = i2c_ReadByte();   ////读取数据高位
i2c_Ack();   /////主机向ADS1115发送应答信号
ads1115_delay(200);

ReadBuffer[1] = i2c_ReadByte();////读取数据低位
i2c_Ack();  /////主机向ADS1115发送应答信号
ads1115_delay(200);

i2c_Stop();   ////发送停止信号
data = ReadBuffer[0]*256+ReadBuffer[1];  ////数据处理   

       return data;
}

/*******************************************************************************
* Function Name  : Get_ATOD
* Attention :获取ADS1115模拟转换结果
*******************************************************************************/
float Get_ATOD (unsigned char channel)
{
        static unsigned char chn; 

chn = channel; 

  Confige1115(channel); ////配置ADS1115转换通道
      ads1115_delay(1000);

        PointRegister();  ////指向ADS1115指针寄存器用于准备读取数据
        ads1115_delay(1000);
        data_get = ReadData(chn);  ////从通道中读数据
        ads1115_delay(1000);
/**用于测量负电压,负电压从8000~ffff,负电压与正关于0有类似对称关系,按位取反后+1相同**/
if(data_get>=0x8000)  
dianya=((float)(0xffff-data_get)/32768.0)*4.096;
else
dianya=((float)data_get/32768.0)*4.096;

return dianya;    

}



ads1115寄存器操作

标签: tabledelay
 4374人阅读 评论(2) 收藏 举报
 分类:
ADS1115的操作是IIC,主要分为三部分:
第一部分:write config register
1   0x90   最后一位是R/W位,高为读,低为写
2   0x01    指向配置寄存器
3   开始设置配置寄存器的参数,根据自己的需要
第二部分:write to pointer register
1  0x90  同上
2  0x00  指向转换寄存器
第三部分:read conversion register
1 0x91  同上
2 应答转换寄存器的MSB
3 应答转换寄存器的LSB
 
具体程序如下:
//配置ads1115
void Confige1115 ()
{
    unsigned char  i;
    table[0] = 0x90;    //CMD_Write;
    table[1] = 0x01;    //指向配置寄存器
    table[2] = 0xc2;    //设置配置寄存器的高八位1100 0101,即AINp=AIN0,AINn=GND;满量程FS=+-4.096;连续转换模式
    table[3] = 0xe3;    //设置配置寄存器的低八位1100 0101,即
    start();                   //发送起始信号
    for(i=0;i<4;i++)
    {   
      shout(table[i]);   //将table里面的数写入ads1115
      delay(15);
    }
    stop();                   //发送停止信号
}
//指向ADS1115指针寄存器用于准备读取数据
void PointRegister (void)
{
    unsigned char i;
    table[0] = 0x90;//写指令
    table[1] = 0x00;//指针指向转换寄存器
    start();//发送起始信号
    for(i=0;i<2;i++)
    {
      shout(table[i]);//将table里面的数写入ads1115
      delay(15);
    }
    stop();//发送停止信号
}
//读转换寄存器里面的值
uint read()
{  
    uint result,resulth,resultl;
    start(); 
    delay(10);
    shout(0x91); //读指令
    resulth = shin();  //高八位赋给resulth               
    resultl = shin(); //底八位赋给resultl
    stop(); 
    result=(resulth)<<8|resultl;//高八位右移8与上底八位组成16位result
    return result;    
}
//获取最终模数转换之后的结果
uint getad()
{
    uint value;
    Confige1115();  
    delay(20);
    PointRegister();
    delay(20);
    value=read();
    return value;
}
最后通过getad()读取转换的值即可



STM32F103控制ADS1115采集模拟信号

标签: STM32F103ADS1115
 1422人阅读 评论(0) 收藏 举报
 分类:

程序已经通过

0、定义通道

#define TongDao0 0xc2e3       
#define TongDao1 0xd2e3
#define TongDao2 0xe2e3
#define TongDao3 0xf2e3


1、STM32F103的IIC端口初始化

void ads1115_io_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;

// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD;

GPIO_Init(GPIOB,&GPIO_InitStruct);

}
2、IIC起始位
void I2C_Start(void)
{
//SCL_LOW;
SDAOUT();
//SDA_LOW;
SDA_HIGH;
SCL_HIGH;

ads1115_Delay();

SDA_LOW;
ads1115_Delay();

SCL_LOW;



}
3、IIC停止位
void I2C_Stop(void)
{
/*SCL_LOW;
SDAOUT();
SDA_HIGH;
SCL_HIGH;



ads1115_Delay();
SDA_LOW;
ads1115_Delay();

//SCL_LOW;*/

SCL_LOW;

SDAOUT();
SDA_LOW;



SCL_HIGH;



ads1115_Delay();
SDA_HIGH;
ads1115_Delay();
//ads1115_Delay();
//ads1115_Delay();

}
4、IIC校验位
void I2C_ACK()
{
SCL_LOW;
SDAOUT();
SDA_LOW;

//ads1115_Delay();

//systick_us(2);
ads1115_Delay();
SCL_HIGH;
//systick_us(2);
ads1115_Delay();
SCL_LOW;
}
5、IIC等待校验位
u8 I2C_Wait_ACK()
{
u8 count=0;
SDAIN();

SCL_HIGH;//ÊÍ·Å×ÜÏß 
//systick_us(1);
ads1115_Delay();
SDA_HIGH; //À­¸ßSDA 
// systick_us(1);
ads1115_Delay();

while(SDA) //¶ÁÈ¡SDA״̬£¬0ΪӦ´ð
{
count++;
if(count>50)
{
return 1;
}
}
SCL_LOW;
// ACK++;    //¼Ç¼оƬ¸øµÄÓ¦¸Ã´ÎÊý£¬µ÷ÊÔÓÃ
return 0;
}


6、IIC写数据
void I2C_WriteByte(u8 cmd)
{
u8 i;
SDAOUT();
SCL_LOW;         //scl=0,ÔÊÐíÊý¾Ý±ä»¯
// SysTick_us(5);
for(i=0;i<8;i++)
{
if(cmd&0x80)SDA_HIGH;
else SDA_LOW;
cmd<<=1;
//systick_us(2);
ads1115_Delay();

SCL_HIGH;    //SCL=1,Êý¾Ý±£³Ö
//systick_us(2);
ads1115_Delay();

SCL_LOW;
//systick_us(1);
//ads1115_Delay();
}
}
7、IIC读数据
u8 I2C_ReadByte()
{
u8 i,ans=0;
SDAIN();
SDA_HIGH;
for(i=0;i<8;i++)
{
SCL_LOW;    //ÔÊÐíÊý¾Ý±ä»¯
//systick_us(2);
ads1115_Delay();

SCL_HIGH;   //±£³ÖÊý¾Ý²»±ä
//systick_us(1);
ads1115_Delay();

ans<<=1;     //
if(SDA)ans++;
//systick_us(1);
//ads1115_Delay();
}
SCL_LOW;
I2C_ACK();

ads1115_Delay();

return ans;
}
8、ADS1115配置参数
void ads1115_config(u16 config)
{
I2C_Start();

I2C_WriteByte(0x90);  //дÐźÅ
I2C_Wait_ACK();

I2C_WriteByte(0x01);  //Ö¸ÏòÅäÖüĴæÆ÷
I2C_Wait_ACK();

I2C_WriteByte(config>>8);
I2C_Wait_ACK();


I2C_WriteByte(config);
I2C_Wait_ACK();

I2C_Stop();
}


9、ADS1115
s16 ads1115_readreg(u8 reg)
{
s16 value_h=0;
//s16 x=0;
s16 ConversionResult=0;
u8 value_l=0;
//int count = 0;

I2C_Start();

I2C_WriteByte(0x90);  //дÐźÅ
ads1115_Delay();
I2C_Wait_ACK();

I2C_WriteByte(reg);  //Ö¸ÏòÅäÖüĴæÆ÷
ads1115_Delay();
ads1115_Delay();
I2C_Wait_ACK();
ads1115_Delay();
I2C_Stop();//////////
ads1115_Delay();
I2C_Start();

I2C_WriteByte(0x91);  //¶ÁÐźÅ
ads1115_Delay();
I2C_Wait_ACK();
ads1115_Delay();

value_h=I2C_ReadByte();


value_l=I2C_ReadByte();



//I2C_Wait_ACK();
I2C_Stop();//////////

ConversionResult=value_h*256+value_l;
return ConversionResult;

}

10、ADS1115获取数据
s16 ads1115_getvalue()
{
s16 value=0;
value=ads1115_readreg(CONVER_REG); //CONVER_REG==0;
//delay_uss(100);/////////////////////////////
return value;
}



11、ADS1115切换采集通道

s16 Get_ADS1115_Reture(u8 channel)
{
ADS1115_Reture=0;

switch(channel)
{
case 0:  
//ads1115_config(TongDao0);
//Delay_Ms(5);
//ADS1115_Reture=ads1115_getvalue();
//Delay_Ms(5);
break;
case 1:
  ads1115_config(TongDao1);//TongDao1
Delay_Ms(7);
//delay_uss(10000);
ADS1115_Reture=ads1115_getvalue();
//Delay_Ms(3);
break;
case 2:  
 ads1115_config(TongDao2);//TongDao2
 Delay_Ms(7);
//delay_uss(10000);
ADS1115_Reture=ads1115_getvalue();
//Delay_Ms(3);
break;
case 3:  
 ads1115_config(TongDao3);//TongDao3
Delay_Ms(7);
//delay_uss(10000);
ADS1115_Reture=ads1115_getvalue();
//Delay_Ms(3);//ÑÓʱһ¶¨Òª¼Ó
ads1115counter ++;
break;
default:
break;


}
//ADS1115_Reture=0x8000;
//channel=0;
return ADS1115_Reture;
}

12、数据量转换为模拟量

V1=volt*(8.192/65536.0);




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为手机老卡怎么办 小米手机慢卡怎么办 华为指纹识别不灵敏了怎么办 金立手机信号不好怎么办 手机边框坏了怎么办 手机保护膜划了怎么办 车膜贴的有气泡怎么办 手机膜进气泡怎么办 贴的手机膜翘角怎么办 全屏膜出现气泡怎么办 手机膜的气泡怎么办 透明手机壳气泡怎么办 钢化膜边缘有气泡怎么办 贴钢化膜边缘有气泡怎么办 钢化膜边上有泡泡怎么办 贴钢化膜周边有气泡怎么办 钢化膜里面有气泡怎么办 手机保护膜破了怎么办 手机触摸屏没反应怎么办 苹果手机触屏坏了怎么办 手机边缘有气泡怎么办 手机膜有空气怎么办 电脑膜有气泡怎么办 汽车贴膜起泡怎么办 汽车玻璃膜用久了起泡怎么办 车窗玻璃膜起泡怎么办 新车贴膜气泡怎么办 贴手机钢化膜有灰尘怎么办 戒指砖石掉了怎么办 寄手机没有包装怎么办 手机背面有划痕怎么办 oopo手机声音小怎么办 手机屏幕被划了怎么办 oppo手机组装屏卡顿怎么办 金立手机卡顿怎么办 vivo手机有点卡怎么办 oppo手机有点卡怎么办 mx6指纹不匹配怎么办 小米手机cpu太高好烫怎么办 魅族mx6卡顿怎么办 魅族mx5反应慢怎么办