ADS1115的使用教程(IIC)
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)相关推荐
- 郭天祥51单片机教程--- IIC总线
郭天祥51单片机教程- IIC总线 #include <reg52.h> #define uchar unsigned charsbit SDA = P2^0; //数据总线 sbit S ...
- ads1115寄存器操作
ADS1115的操作是IIC,主要分为三部分: 第一部分:write config register 1 0x90 最后一位是R/W位,高为读,低为写 2 0x01 指向配置寄存器 ...
- stm32驱动ssd1306配置_STM32 OLED 屏幕 驱动芯片SSD1306 IIC代码
#include "oled.h" #include "stdlib.h" #include "oledfont.h" #include & ...
- STM32 基础系列教程 14 - IIC
前言 学习stm32 IIC接口的使用,用IIC 接口实现与IIC设备的通信功能. 示例详解 基于硬件平台: STM32F103C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使 ...
- STM32cubemx教程及STM32入门(五)IIC
STM32cubemx教程及STM32入门(五)IIC 2022.8.25 前言 本章主要讲解IIC协议以及stm32cubemx配置和HAL库函数 简介 I2C(Inter-Integrated C ...
- 【乌拉喵.教程】IIC总线介绍及FPGA编程
最近将多年来收集到的教学视频.国内外图书.源码等整理整合拿出来,涉及arm.Linux.python.信号完整性.FPFA.DSP.算法.stm32.单片机.制图.电子模块.kali.出版社图书等.资 ...
- 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )
前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用. 但是 ...
- 【STM32】标准库与HAL库对照学习教程十三--软件IIC控制AT24C02
[STM32]标准库与HAL库对照学习教程十三--软件IIC控制AT24C02 一.前言 二.准备工作 三.AT24C02(EEPROM)介绍 1.AT24C02简介 2.引脚功能 3.设备地址 四. ...
- ads1115 IIC接口 stm32 解决
#include "stm32f0xx.h" #define WR_REG 0x90 #define RE_REG 0x91/*************************** ...
- 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 通信 ...
最新文章
- 用python画动图_用Python绘制会动的柱形竞赛图
- 反射型 DDoS 攻击的原理和防范措施
- 计算机屏幕怎么睡眠状态,解决办法:显示器进入睡眠状态时如何解决问题
- 【STM32】FreeRTOS编码风格
- vue 按钮删除input内容_Vue表单和v-model
- 修改表名的sql语句_SQL第一关——入门
- vue el-input输入框禁止输入空格
- 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_09-CMS服务端工程搭建-开发工具配置...
- AD09 覆铜步骤及设计规则
- matlab2010安装详细图解案例
- tumblr_使用Tumblr创建美丽且易于更新的博客
- 计算机找不到ie浏览器,ie浏览器不见了,教您ie浏览器不见了怎么办
- 充电识别过程及QC2.0
- 软件工程网络工程第二次训练(AC代码和详细解释)(C语言描述)
- 鸿蒙1030鸿蒙,鸿蒙系统申请
- 给在读研究生未来要读研同学们的一封受益匪浅的信
- 动态爱心和3D旋转烟花代码
- jmeter基础(二)-JMeter证书
- RNN、RNNCell
- @SuppressWarnings的使用、作用、用法
热门文章
- php微信客服接口,微信公众平台开发:多客服接口说明
- 互联网晚报 | 10月21日 星期四 | 微信支付上线品牌视频号;快手短剧日活用户达2.3亿;《长津湖》票房升至中国影史第三...
- 伽罗华域, 二维码和CRC
- 从jupyter转换为exe格式
- 搜集70个国外搜索引擎网站,供大家学习参考
- QQ空间 安卓App热补丁动态修复技术介绍
- 慕课软件工程(第五章.初始模块结构图的设计)
- 小游戏开发设计之塔防类游戏
- PxCook安装文件有问题处理办法
- 活动报名 | 保护儿童,保护未来!智源发布《面向儿童的人工智能北京共识》