ADS1115可以测量ADC,能够测量单端对地电压和差分对输入的电压,测量范围是0-6V。

上代码:

main.c:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "ads1115.h"float aa;    int main(void){ float t1; u16 t,result;u8 key;u16 i=0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2delay_init();             uart_init(9600);         //串口初始化为9600LED_Init();                  //LCD_Init();    KEY_Init();                 //IIC初始化 ADS1115_Init();while(1){key=KEY_Scan(0);if(key==WKUP_PRES){                result=lvbo(0xeb,0x82);    //A0 A1为差分输入测试端  低八位+高八位1111 1011,1000 0010if(result >= 0x8000 && result <= 0xffff)result = 0xffff - result;   //差值为负取绝对值,使得A0 A1正反接都行else if(result >= 0xffff)result = 0;t1=4.096*2*result/65535;     //转换成电压printf("量程为4.096V,A0-A1之间电压 = %f V\r\n",t1);//打印if(result == 0x7fff || result == 0x8000){printf("已超量程!\r\n\r\n");}else{printf("读取正常!\r\n\r\n");}    }if(key==KEY0_PRES){                 result=lvbo(0xe3,0xb2); //A2 A3为差分输入测试端  低八位+高八位 1111 0011,1011 0010if(result >= 0x8000)result = 0xffff - result; //差值为负取绝对值,使得A2 A3正反接都行t1=4.096*2*result/65535;     //转换成电压printf("量程为4.096V,A2-A3之间电压 = %f V\r\n",t1); //打印if(result == 0x7fff || result == 0x8000) //超过最大值或者低于最小值{printf("已超量程!\r\n\r\n");}else{printf("读取正常!\r\n\r\n");}    }    if(key == KEY1_PRES){result=lvbo(0xe3,0xb4);    //A2 A3为差分输入测试端 低八位+高八位 1111 0011,1011 0100if((result >= 0x8000) && (result <= 0xffff))result = 0xffff - result;   //差值为负取绝对值,使得A0 A1正反接都行else if(result >= 0xffff)result = 0;t1=2.048*2*result/65535;     //转换成电压printf("量程为2.048V,A0-A1之间电压 = %f V\r\n",t1);//打印if(result == 0x7fff || result == 0x8000){printf("已超量程!\r\n\r\n");}else{printf("读取正常!\r\n\r\n");}}i++;delay_ms(10);if(i==20){LED0=!LED0;//提示系统正在运行    i=0;}           }
}

View Code

ADS1115.c:

#include "sys.h"
#include "stm32f10x_i2c.h"
#include "ads1115.h"static void ADS1115_delay(u16 D)
{while(--D);
}void delay_nms(u16 ms)
{u16 i;u32 M = 0;//720Wfor(i = 0;i < ms; i++)for(M=12000;M > 0;M--);
}void delay_nus(u16 us)
{u16 i;u16 M = 0;//720Wfor(i = 0;i < us; i++)for(M=72;M > 0;M--);
}/////PA8 SDA////PA9 SCL///
void ADS1115_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;//A SCL SDAGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);SDA_A1;SCL_A1;delay_nms(5);}//I2C总线启动
void I2CStart_A(void)
{SDA_A1;ADS1115_delay(5);SCL_A1;ADS1115_delay(5);SDA_A0;ADS1115_delay(5);//MIN 160nsSCL_A0;ADS1115_delay(5);
}//I2C停止总线
void I2CStop_A(void)
{SDA_A0;ADS1115_delay(5);SCL_A1;ADS1115_delay(5);SDA_A1;ADS1115_delay(5);//MIN 160ns
}//I2C 写一字节
void I2CWriteByte_A(u8 DATA)
{u8 i;SCL_A0;for(i = 0;i < 8; i++){if(DATA&0x80){SDA_A1;}else{SDA_A0;}SCL_A1;//按照手册不需延时ADS1115_delay(5);SCL_A0;ADS1115_delay(5);DATA    = DATA << 1;  }SDA_A1;SCL_A1;ADS1115_delay(5);SCL_A0;
}//I2C 读一字节
u8 I2CReadByte_A(void)
{u8 TData=0,i;for(i=0;i<8;i++){SCL_A1;ADS1115_delay(5);TData=TData<<1;if(SDA_AI){TData|=0x01;}SCL_A0;ADS1115_delay(5);}SCL_A0;ADS1115_delay(5);SDA_A0;ADS1115_delay(5);SCL_A1;ADS1115_delay(5);SCL_A0;ADS1115_delay(5);SDA_A1;return TData;
}/*********************************************************************
*函数名称:  ADS1115Config
*描       述: 设置ADS1115包括通道配置,采样时间等等
*参       数: HCMD :命令字高8位(通道,量程,转换模式)LCMD : 命令字低8位(采样率设置 比较模式 有效电平 信号输出锁存)
*返       回; 无
********************************************************************/
void ADS1115Config_A(u8 LCMD,u8 HCMD)
{u8 i=0;u8 Initdata[4];Initdata[0] = 0x90;  // 地址0x90  器件ADR接地 写寄存器Initdata[1] = 0x01;// 配置寄存器Initdata[2] = HCMD;    // 配置字高字节Initdata[3] = LCMD;    // 配置字低字节SCL_A1;I2CStart_A();        //开启for(i=0;i<4;i++){I2CWriteByte_A(Initdata[i]);ADS1115_delay(10);}I2CStop_A();         //关闭
}void SetThresHold_A(u16 L_TH,u16 H_TH)        //高低阀门设置
{SCL_A1;I2CStart_A();      // 开启I2CWriteByte_A(0x90);I2CWriteByte_A(0x02);//最低阀值寄存器I2CWriteByte_A((L_TH>>8));I2CWriteByte_A(L_TH);I2CStop_A();       //关闭I2CStart_A();     //开启I2CWriteByte_A(0x90);I2CWriteByte_A(0x03);//最高阀值寄存器I2CWriteByte_A((H_TH>>8));I2CWriteByte_A(H_TH);I2CStop_A();      //关闭
}/*******************************************************************
*函数名称:  ReadAD_A
*描       述: 获取AD转换的值
*参       数: 获取的值为在前面设置的那个通道
*返       回; 无
********************************************************************/
u16 ReadAD_A(void)
{u16 Data[2]={0,0};
//转换指向寄存器SCL_A1;I2CStart_A();I2CWriteByte_A(0x90);I2CWriteByte_A(0x00);I2CStop_A();                        I2CStart_A();I2CWriteByte_A(0x91);Data[0] = I2CReadByte_A();Data[1] = I2CReadByte_A();I2CStop_A();Data[0] = Data[0]<<8 | Data[1];return  (Data[0]);//&0x7fff
}u16 getad(u8 LCMD,u8 HCMD)
{u16 value=0;ADS1115Config_A(LCMD,HCMD);          //配置通道delay_nms(5); // 延时一定时间,防止通道切换互相影响        value=ReadAD_A();return value;
}u16 lvbo(u8 LCMD,u8 HCMD)        //求30个值的平均值
{u8 k;u32 U=0, temp;   //u32 给够叠加空间 或者float、double亦可 for(k=0;k<30;k++){U+=getad(LCMD,HCMD);    }temp=U;U=0;return ((float)temp/30);    //带上小数点
}

View Code

ADS1115.h:

#ifndef  __ADS115_H_
#define  __ADS115_H_
#include "sys.h"/***************************************************************************************
*说明:当端输入时候正输入为输入信号,负输入为地但是输入信号不能为负电压(不能比地电位低)
*       双端输入时候正输入为输入信号,负输入为负输入输入信号的差值可以为负电压
****************************************************************************************/
#define     SDA_A1     PCout(11)=1   //SDA输出
#define     SDA_A0     PCout(11)=0
#define     SCL_A1        PCout(12)=1    //SCL
#define     SCL_A0        PCout(12)=0
#define     SDA_AI        PCin(11)   //SDA读入//#define     SDA_A21     PAout(10)=1   //SDA输出
//#define     SDA_A20     PAout(10)=0
//#define     SCL_A21       PAout(11)=1    //SCL
//#define     SCL_A20       PAout(11)=0
//#define     SDA_A2I       PAin(10)   //SDA读入//#define     SDA_A31     PBout(10)=1   //SDA输出
//#define     SDA_A30     PBout(10)=0
//#define     SCL_A31       PBout(11)=1    //SCL
//#define     SCL_A30       PBout(11)=0
//#define     SDA_A3I       PBin(10)   //SDA读入//#define     SDA_A41     PBout(12)=1   //SDA输出
//#define     SDA_A40     PBout(12)=0
//#define     SCL_A41       PBout(13)=1    //SCL
//#define     SCL_A40       PBout(13)=0
//#define     SDA_A4I       PBin(12)   //SDA读入//I2C地址以及读写设置
#define  WR_REG 0x90       //写寄存器
#define  RE_REG 0x91       //读寄存器/***********************************寄存器控制字**********************************************/
#define  DATA_REG  0x00        //转换数据寄存器
#define  CONF_REG  0x01     //控制字设置寄存器
#define  LOTH_REG  0x02        //最低阀值寄存器
#define  HITH_REG  0x03        //最高阀值寄存器#define  ch0  0xc0       //通道0
#define  ch1  0xd0       //通道1
#define  ch2  0xe0       //通道2
#define  ch3  0xf0       //通道3/***********************控制字申明*************************************************************
*|  OS | MUX2 | MUX1 | MUX0 | PGA2 | PGA1 | PGA0 | MODE  |------HCMD
*|  DR2| DR1  | DR0  | COMP_MODE | COMP_POL | COMP_LAT |  COMP_QUE1 | COMP_QUE0 |-----LCMD
***********************************************************************************************/
#define  HCMD1    0x64   //AIN0单端输入 +-4.096量程  连续模式  01000100b
#define  LCMD1      0xf0     //860sps 窗口比较器模式 输出低有效  不锁存信号至读 每周期检测阀值 11110000b/************************函数申明****************************/
static void ADS1115_delay(u16 D);
void delay_nms(u16 ms);
void delay_nus(u16 us);
void ADS1115_Init(void);
void I2CStart_A(void);
void I2CStop_A(void);
void I2CWriteByte_A(u8 DATA);
u8 I2CReadByte_A(void);
void ADS1115Config_A(u8 LCMD,u8 HCMD);
void SetThresHold_A(u16 L_TH,u16 H_TH);        //高低阀门设置
u16 ReadAD_A(void);
u16 getad(u8 LCMD,u8 HCMD);
u16 lvbo(u8 LCMD,u8 HCMD);#endif        

View Code

判断量程高低由数据手册寄存器决定。

程序实现:

    if(result == 0x7fff || result == 0x8000){printf("已超量程!\r\n\r\n");}else{printf("读取正常!\r\n\r\n");}    

View Code

实际电路接法:

ADS1115的使用教程(IIC)相关推荐

  1. 郭天祥51单片机教程--- IIC总线

    郭天祥51单片机教程- IIC总线 #include <reg52.h> #define uchar unsigned charsbit SDA = P2^0; //数据总线 sbit S ...

  2. ads1115寄存器操作

    ADS1115的操作是IIC,主要分为三部分: 第一部分:write config register 1   0x90   最后一位是R/W位,高为读,低为写 2   0x01    指向配置寄存器 ...

  3. stm32驱动ssd1306配置_STM32 OLED 屏幕 驱动芯片SSD1306 IIC代码

    #include "oled.h" #include "stdlib.h" #include "oledfont.h" #include & ...

  4. STM32 基础系列教程 14 - IIC

    前言 学习stm32 IIC接口的使用,用IIC 接口实现与IIC设备的通信功能. 示例详解 基于硬件平台: STM32F103C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使 ...

  5. STM32cubemx教程及STM32入门(五)IIC

    STM32cubemx教程及STM32入门(五)IIC 2022.8.25 前言 本章主要讲解IIC协议以及stm32cubemx配置和HAL库函数 简介 I2C(Inter-Integrated C ...

  6. 【乌拉喵.教程】IIC总线介绍及FPGA编程

    最近将多年来收集到的教学视频.国内外图书.源码等整理整合拿出来,涉及arm.Linux.python.信号完整性.FPFA.DSP.算法.stm32.单片机.制图.电子模块.kali.出版社图书等.资 ...

  7. 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用. 但是 ...

  8. 【STM32】标准库与HAL库对照学习教程十三--软件IIC控制AT24C02

    [STM32]标准库与HAL库对照学习教程十三--软件IIC控制AT24C02 一.前言 二.准备工作 三.AT24C02(EEPROM)介绍 1.AT24C02简介 2.引脚功能 3.设备地址 四. ...

  9. ads1115 IIC接口 stm32 解决

    #include "stm32f0xx.h" #define WR_REG 0x90 #define RE_REG 0x91/*************************** ...

  10. OLED显示屏 IIC/I²C/I2C通信 128*64分辨率 SH1106 / SSD1306 驱动教程

    OLED显示屏 IIC/I²C/I2C通信 128*64分辨率 SH1106 / SSD1306 驱动教程 一.OLED液晶屏 二.SH1106 I2C 驱动 1.SH1106 简介 2.I2C 通信 ...

最新文章

  1. 用python画动图_用Python绘制会动的柱形竞赛图
  2. 反射型 DDoS 攻击的原理和防范措施
  3. 计算机屏幕怎么睡眠状态,解决办法:显示器进入睡眠状态时如何解决问题
  4. 【STM32】FreeRTOS编码风格
  5. vue 按钮删除input内容_Vue表单和v-model
  6. 修改表名的sql语句_SQL第一关——入门
  7. vue el-input输入框禁止输入空格
  8. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_09-CMS服务端工程搭建-开发工具配置...
  9. AD09 覆铜步骤及设计规则
  10. matlab2010安装详细图解案例
  11. tumblr_使用Tumblr创建美丽且易于更新的博客
  12. 计算机找不到ie浏览器,ie浏览器不见了,教您ie浏览器不见了怎么办
  13. 充电识别过程及QC2.0
  14. 软件工程网络工程第二次训练(AC代码和详细解释)(C语言描述)
  15. 鸿蒙1030鸿蒙,鸿蒙系统申请
  16. 给在读研究生未来要读研同学们的一封受益匪浅的信
  17. 动态爱心和3D旋转烟花代码
  18. jmeter基础(二)-JMeter证书
  19. RNN、RNNCell
  20. @SuppressWarnings的使用、作用、用法

热门文章

  1. php微信客服接口,微信公众平台开发:多客服接口说明
  2. 互联网晚报 | 10月21日 星期四 | 微信支付上线品牌视频号;快手短剧日活用户达2.3亿;《长津湖》票房升至中国影史第三...
  3. 伽罗华域, 二维码和CRC
  4. 从jupyter转换为exe格式
  5. 搜集70个国外搜索引擎网站,供大家学习参考
  6. QQ空间 安卓App热补丁动态修复技术介绍
  7. 慕课软件工程(第五章.初始模块结构图的设计)
  8. 小游戏开发设计之塔防类游戏
  9. PxCook安装文件有问题处理办法
  10. 活动报名 | 保护儿童,保护未来!智源发布《面向儿童的人工智能北京共识》