热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ADS1115--已调通(附源码)

本文主要介绍关于stm32,嵌入式的知识点,对【ADS1115--已调通(附源码)】和【】有兴趣的朋友可以看下由【俗世老道】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的嵌入式STM32相关技术

本文主要介绍关于stm32,嵌入式的知识点,对【ADS1115--已调通(附源码)】和【】有兴趣的朋友可以看下由【俗世老道】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的嵌入式STM32相关技术问题。

ADS1115模块--文尾附STM32工程 前言简介工作流程寄存器讲解源码源码讲解资源链接

前言

最近做项目用到了ADS1115,一款常用的16位ADC,下面说说本人的理解

简介


对于用户来说我们能从上面这张框图GET到以下几点:

adc类型为16位∑-Δ型,意味着精度还是比较高了

MUX为输入多路复用器,作用可以理解为对输入方式进行选择,比如是用差分还是单端输入

PGA为可编程增益放大器,根据需要负责把模拟量进行放大

此款adc采用了IIC通信,与IIC相关的引脚为SCL,SDA,ADDR,其中ADDR为从机地址选择引脚

ADS1115--已调通(附源码)


本文ADDR直接接地,所以从机地址为0x90

Comparator为可编程比较器,作用是在配置好相应的寄存机阈值后进行报警输出(本文未涉及)

工作流程

ADS1115--已调通(附源码)


上图是ADS1115读的时序逻辑:主机发送开始信号->主机发送从机地址->等待从机应答->主机发送需要操作的寄存器(这里是 Conversion register 里面装着转换好的数字量)->等待从机应答->主机发送停止信号->主机发送开始信号->主机发送从机地址->等待从机应答->主机读取高八位数字量->等待从机应答->主机读取低八位数字量->等待从机应答->主机发送停止信号

ADS1115--已调通(附源码)


上图是ADS1115写的时序逻辑:主机发送开始信号->主机发送从机地址->等待从机应答->主机发送需要操作的寄存器(这里是 Config register 配置ADS1115的一些参数,后面会分析)->等待从机应答->主机发送配置数据的高八位->等待从机应答->主机发送配置数据的低八位->等待从机应答->主机发送停止信号

寄存器讲解

ADS1115--已调通(附源码)

ADS1115有4个寄存器,分别是前面提到的Conversion register(16位)、Config register(16位)与两个设置阈值的寄存器(使能比较模式时用)

宏定义四个寄存器的地址

#define REG_Conversion   0x00
#define REG_config		 0x01
#define REG_L_thresh 	 0x02
#define REG_H_thresh 	 0x03

下面详细说说Config register

ADS1115--已调通(附源码)


ADS1115--已调通(附源码)

/*****************Config Register**********/
#define OS 		1 		//Operational status or single-shot conversion start
#define MUX 	0x04 	//[2:0]Input multiplexer configuration
#define PGA 	0x01	//Programmable gain amplifier configuration
#define MODE  0x00	//Device operating mode

#define DR				0x04//Data rate
#define	COMP_MODE	0 	// Comparator mode
#define COMP_POL 	0		//Comparator polarity
#define COMP_LAT	0 	//Latching comparator
#define COMP_QUE	0x3	//Comparator queue and disable

#define config_MSB (OS << 7)|(MUX << 4)|(PGA << 1)|(MODE)//0xC2
#define config_LSB (DR << 5)|(COMP_MODE << 4)|(COMP_POL << 3)|(COMP_LAT << 2)|(COMP_QUE)//

第15位:OS读操作可以知道当前设备的工作状态,写操作可以设置单次转换(必须为断电模式下,当对OS写1时,设备会进入上电模式并完成一次数据转换,然后会自动将OS置0)下面是数据手册的解释

ADS1115--已调通(附源码)


第14-12位:MUX2为输入多路复用器,对输入模式进行选择,如上图有八种输入模式,分别是四种差分与四种单端输入,本文配置为A0单端输入(0x04)
第11-9位:PGA为可编程增益放大器,设置FSR(满刻度的范围),本文配置为-4.096V-4.096V(0x01)后面电压计算公式与这个有关
第8位:MODE选择持续转换模式与单拍模式(单排模式需要OS位触发),本文配置为连续转换模式(0x00)
第7-5位:DR配置data rate数据传输速率,本文配置为128SPS(0x04)
第4-2位:对比较器的配置(由于本文未涉及,在这就不多说了)
第1-0位:本位配置为关闭比较器并将ALERT/RDY引脚设置为高阻抗模式(0x3)

源码
//ads1115.h
#ifndef ADS1115_H
#define ADS1115_H
#include "i2c.h"
/******************************************************************************* ADDR--GND SLAVE ADDRESS 0X90 *******************************************************************************/  

/*****************Pointer Register*************/
#define REG_Conversion   0x00
#define REG_config		 0x01
#define REG_L_thresh 	 0x02
#define REG_H_thresh 	 0x03

/*****************Conversion Register**********/
//存放着16位结果

/*****************Config Register**********/
#define OS 		1 		//Operational status or single-shot conversion start
#define MUX 	0x04 	//[2:0]Input multiplexer configuration
#define PGA 	0x01	//Programmable gain amplifier configuration
#define MODE  0x00	//Device operating mode

 

#define DR				0x04//Data rate
#define	COMP_MODE	0 	// Comparator mode
#define COMP_POL 	0		//Comparator polarity
#define COMP_LAT	0 	//Latching comparator
#define COMP_QUE	0x3	//Comparator queue and disable

#define config_MSB (OS << 7)|(MUX << 4)|(PGA << 1)|(MODE)//0xC2
#define config_LSB (DR << 5)|(COMP_MODE << 4)|(COMP_POL << 3)|(COMP_LAT << 2)|(COMP_QUE)//0x83

/*****************Lo_thresh Register**********/
#define Lo_thresh	0x8000	// Low threshold value
#define Hi_thresh 0x7FFF	// High threshold value

void ADS1115_Write(u8 Reg , u8 reg_MSB , u8 reg_LSB);
float ADS1115_ReadAD(void);
void ADS115_config(void);
#endif


//ads1115.c
#include "ads1115.h"
#include "SysTick.h"

void ADS1115_Write(u8 Reg , u8 reg_MSB , u8 reg_LSB)
{
   	
	I2C_Start();
	I2C_SendByte(0x90+0);//0x90地址+0写位
	while(I2C_WaitAck());
	I2C_SendByte(Reg);
	while(I2C_WaitAck());
	I2C_SendByte(reg_MSB);
	while(I2C_WaitAck());
	I2C_SendByte(reg_LSB);
	while(I2C_WaitAck());
	I2C_Stop();
}
float ADS1115_ReadAD()
{
   
	float ret;
	
	uint16_t data;
	I2C_Start();
	I2C_SendByte(0x90+0);//0x90地址+0写位
	while(I2C_WaitAck());
	I2C_SendByte(REG_Conversion);
	while(I2C_WaitAck());
	I2C_Stop();
	delay_us(5);
	I2C_Start();
	I2C_SendByte(0x90+1);//0x90地址+1读位
	while(I2C_WaitAck());
	data = I2C_ReadByte(1);
	data = (data <<	8)&0xff00;//前8位
	data+=	I2C_ReadByte(1);//后8位
	I2C_Stop();
	//数值计算取决于PGA配置
	if(data>0x8000)
		ret=((float)(0xffff-data)/32768.0)*4.096;
	else
		ret=((float)data/32768.0)*4.096;
	
	return ret;
	
}

void ADS115_config()
{
   

	ADS1115_Write(REG_config, config_MSB ,config_LSB);
}
源码讲解

代码中主要有void ADS115_config()与float ADS1115_ReadAD()两个函数
其中ADS115_config()配置函数的功能是对Config register寄存器进行配置,写入的值为0xC2(config_MSB )0x83(config_LSB)
ADS1115_ReadAD()函数返回的值为转换好的电压值
这两个函数的逻辑完全是按照上方的工作流程来写

资源链接

链接:https://pan.baidu.com/s/1OzdbtXzelk2rutXFWvmooA
提取码:5iqt

本文《ADS1115--已调通(附源码)》版权归俗世老道所有,引用ADS1115--已调通(附源码)需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
author-avatar
阿思翠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有