博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于STM32F429的ADS1115驱动程序
阅读量:5109 次
发布时间:2019-06-13

本文共 9762 字,大约阅读时间需要 32 分钟。

1.ADS1115中文资料:https://wenku.baidu.com/view/8bab101feef9aef8941ea76e58fafab069dc44e7.html?rec_flag=default&sxts=1557987780920

2.IIC协议程序

IIC协议是大多数传感的通信协议,每个嵌入式工程师都要有自己的IIC底层协议

IIC可细分为7个函数

1.开始

2.读取

3.发送

4.结束

5.主机检测从机应答

6. 主机应答

7. 主机不应答

/******************************************************************************** * *                          Protocol  Part* * ****************************************************************************** *//******************************************************************************** Function Name  : vIIC_Start_Signal* Description    : Master Send Start Signal* Input          : None* Output         : None* Return         : None****************************************************************************** */void vIIC_Start_Signal(IIC_HandleTypedef * hIICx){        IIC_SDA_1                    (hIICx);                        //拉高数据线        IIC_SCL_1                    (hIICx);                        //拉高时钟线    vIIC_Delay_2us        (            );                        //延时    IIC_SDA_0                    (hIICx);                        //拉低数据线    vIIC_Delay_2us        (            );                        //延时    IIC_SCL_0                    (hIICx);                        //拉低时钟线    vIIC_Delay_2us        (            );                        //延时}/******************************************************************************** Function Name  : vIIC_SendByte* Description    : Master Send a Byte to Slave* Input          : Will Send Date* Output         : None* Return         : None****************************************************************************** */void vIIC_SendByte(IIC_HandleTypedef * hIICx,uint8_t uSendByte){                uint8_t i;        for (i=0; i<8; i++)             {                 if(uSendByte & 0X80)                    IIC_SDA_1                (hIICx);              else                    IIC_SDA_0                (hIICx);                uSendByte <<= 1;            vIIC_Delay_1us        (            );                                     IIC_SCL_1                    (hIICx);                      vIIC_Delay_2us        (            );                         IIC_SCL_0                    (hIICx);                      vIIC_Delay_1us        (            );                    }        }/******************************************************************************** Function Name  : uIIC_RecvByte* Description    : Master Reserive a Byte From Slave* Input          : None* Output         : None* Return         : Date From Slave ****************************************************************************** */uint8_t uIIC_RecvByte(IIC_HandleTypedef * hIICx){    uint8_t i,uReceiveByte = 0;        IIC_GPIO_MODE_Ipt (hIICx);    IIC_SDA_1                    (hIICx);    for(i=0;i<8;i++)    {        uReceiveByte <<= 1;                vIIC_Delay_1us    (            );                        IIC_SCL_1                (hIICx);                vIIC_Delay_1us    (            );                        if(IIC_SDA_R        (hIICx))        {            uReceiveByte |=0x01;        }                vIIC_Delay_1us    (            );            IIC_SCL_0                (hIICx);        vIIC_Delay_1us    (         );             }    IIC_GPIO_MODE_Opt (hIICx);        return uReceiveByte;    }/******************************************************************************** Function Name  : vIIC_Ack* Description    : Master Send Acknowledge Single* Input          : None* Output         : None* Return         : None****************************************************************************** */void vIIC_Ack(IIC_HandleTypedef * hIICx){    IIC_SDA_0                    (hIICx);                            //拉低数据位    vIIC_Delay_1us        (            );                            //延时        IIC_SCL_1                    (hIICx);                            //拉高时钟位    vIIC_Delay_2us        (     );                            //延时    IIC_SCL_0                    (hIICx);                            //拉低时钟位    vIIC_Delay_1us        (            );                            //延时    }/******************************************************************************** Function Name  : vProto_IIC_NAck* Description    : * Input          : None* Output         : None* Return         : None****************************************************************************** */void vIIC_NAck(IIC_HandleTypedef * hIICx){            IIC_SDA_1         (hIICx);                      //SDA拉高 不应答对方    vIIC_Delay_1us        (            );    IIC_SCL_1         (hIICx);    vIIC_Delay_2us        (            );    IIC_SCL_0         (hIICx);    vIIC_Delay_1us        (            );    }/******************************************************************************** Function Name  : bIIC_ReadACK* Description    : Master Reserive Slave Acknowledge Single* Input          : None* Output         : None* Return         : None****************************************************************************** */bool bIIC_ReadACK(IIC_HandleTypedef * hIICx) //返回为:=1有ACK,=0无ACK{                    IIC_GPIO_MODE_Ipt (hIICx);    IIC_SDA_1                    (hIICx);                            //拉高数据线    vIIC_Delay_1us        (            );                            //延时    IIC_SCL_1                    (hIICx);                    //拉高时钟线    vIIC_Delay_2us        (            );                            //延时        if(IIC_SDA_R(hIICx))    {        vIIC_Delay_1us(            );        IIC_SCL_0            (hIICx);        vIIC_Delay_1us(            );        IIC_GPIO_MODE_Opt(hIICx);        return FALSE; // 没有应答    }    else    {        vIIC_Delay_1us(            );        IIC_SCL_0            (hIICx);         vIIC_Delay_1us(            );        IIC_GPIO_MODE_Opt(hIICx);        return TRUE;    }                }/******************************************************************************** Function Name  : vIIC_Stop_Signal* Description    : Master Send Stop Signal* Input          : None* Output         : None* Return         : None****************************************************************************** */void vIIC_Stop_Signal(IIC_HandleTypedef * hIICx){    IIC_SDA_0                                (hIICx);                //拉低数据线    vIIC_Delay_2us                    (            );                //延时    IIC_SCL_1                                (hIICx);                //拉高时钟线    vIIC_Delay_2us                    (            );                //延时    IIC_SDA_1                                (hIICx);                //拉高数据线  vIIC_Delay_2us                    (            );                //延时    }

3.寄存器操作

ADS1115的ADDR引脚接地,则寄存器地址为0x90

 

ADS1115的操作只有3步

1.向配置寄存器0x01写入配置,先写高8位,再写低8位

void uSen_ADS1115_Confight(IIC_HandleTypedef * iicHandle){    vIIC_Start_Signal(iicHandle);                                 //1.  IIC_Start                 ;  起始信号                            vIIC_SendByte(iicHandle, Slave_Address);                            //2.  IIC_Send Device Address(W);  发送设备地址  0x90                                                                                       bIIC_ReadACK(iicHandle);      vIIC_SendByte(iicHandle, 0x01);                              //发送寄存器地址  0x01  bIIC_ReadACK(iicHandle);                                          vIIC_SendByte(iicHandle, 0xc0);                                     //具体如何配置看手册  bIIC_ReadACK(iicHandle);                                     vIIC_SendByte(iicHandle, 0x83);                         bIIC_ReadACK(iicHandle);      vIIC_Stop_Signal(iicHandle);                                  }

 

2. 写入指针寄存器0x00,准备读取电压

void uSen_ADS1115_PointRegister(IIC_HandleTypedef * iicHandle, uint8_t Register_Address){    vIIC_Start_Signal(iicHandle);                                 //1.  IIC_Start                 ;  起始信号                            vIIC_SendByte(iicHandle, Slave_Address);                        //2.  IIC_Send Device Address(W);  发送设备地址  0x90                                                                                              vIIC_Ack(iicHandle);              vIIC_SendByte(iicHandle, 0x00);                                //4.  IIC_Send Register Address ; 发送要操作的寄存器地址  vIIC_NAck(iicHandle);                                                                  vIIC_Stop_Signal(iicHandle);                                   //9.  IIC_Stop                  ; 结束信号}

 

3.读取电压数据

float uSen_ADS1115_Read_Date(IIC_HandleTypedef * iicHandle)      {    uint8_t uRev_Register_Data_H = 0x00,uRev_Register_Data_L = 0x00;  float  uRev_Register_Data = 0x00;         vIIC_Start_Signal(iicHandle);                                      //1.  IIC_Start                 ;  起始信号  vIIC_SendByte(iicHandle,0x91);                                     //7.  I2C_Send Device Address(R); 发送设备地址+1 准备读取  vIIC_Ack(iicHandle);                                               //8.  I2C_Ack                   ; 等待应答  uRev_Register_Data_H = uIIC_RecvByte(iicHandle);                   //9.  I2C_ReadByte              ; 读取高位数据  vIIC_Ack(iicHandle);                                                          uRev_Register_Data_L = uIIC_RecvByte(iicHandle);                   //9.  I2C_ReadByte              ; 读取低位数据  vIIC_NAck(iicHandle);                                                            //数据处理     vIIC_Stop_Signal(iicHandle);                                              uRev_Register_Data=uRev_Register_Data_H*256+uRev_Register_Data_L; //合取为16位数据        if(uRev_Register_Data>=0x8000)       uRev_Register_Data=((float)(0xffff-uRev_Register_Data)/32767.0)*4.096;  else     uRev_Register_Data=((float)uRev_Register_Data/32768.0)*4.096;
; return uRev_Register_Data; }

 4. 数据处理

(16位数据/2的15次方)*量程

即(uRev_Register_Data/32768)*4.096

注意有电压有正负

5.量程范围

VCC+/-量程

比如 0v+/-4.096

转载于:https://www.cnblogs.com/feiniaoliangtiangao/p/10896383.html

你可能感兴趣的文章
Activiti入门 -- 环境搭建和核心API简介
查看>>
struts.convention.classes.reload配置为true,tomcat启动报错
查看>>
MySQL的并行复制多线程复制MTS(Multi-Threaded Slaves)
查看>>
好玩的-记最近玩的几个经典ipad ios游戏
查看>>
PyQt5--EventSender
查看>>
Sql Server 中由数字转换为指定长度的字符串
查看>>
Java 多态 虚方法
查看>>
Unity之fragment shader中如何获得视口空间中的坐标
查看>>
万能的SQLHelper帮助类
查看>>
tmux的简单快捷键
查看>>
[Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II
查看>>
Html5 离线页面缓存
查看>>
《绿色·精简·性感·迷你版》易语言,小到不可想象
查看>>
Android打包key密码丢失找回
查看>>
VC6.0调试技巧(一)(转)
查看>>
类库与框架,强类型与弱类型的闲聊
查看>>
webView添加头视图
查看>>
php match_model的简单使用
查看>>
在NT中直接访问物理内存
查看>>
Intel HEX 文件格式
查看>>