STM32传感器模块编程实践(十一) ADC模数转换模块ADS1115简介及驱动源码

文章目录

    • 一.概要
    • 二.ADS1115芯片介绍
    • 三.ADS1115芯片主要特性
    • 四.ADS1115模块接线说明
    • 五.ADS1115参考原理图
    • 六.通讯协议介绍
    • 七.STM32单片机与ADS1115模块实现电压采集实验
      • 1.硬件准备
      • 2.软件工程
      • 3.软件主要代码
      • 4.实验效果
    • 八.源代码工程下载
    • 九.小结

一.概要

ADC,全称为Analog-to-Digital Converter,即模数转换器,是一种将模拟信号转换为数字信号的电子设备。ADC广泛应用于工业控制、通信、医疗、音频和视频等领域。ADC的作用是将模拟信号转换成数字信号,数字信号可以更好地被储存和处理,进一步实现信号的分析与处理,提高信息的精度和可性,如在传感器信号采集中,比如温度,压力,声音,电压等信号,ADC转换器会将传感器输出的模拟信号转换为数字信号,以便进行数据采集、监控和控制,我们单片机的应用过程中,一般是采集电压信号。
我们常用的STM32F103单片机,单片机内部就带有12位的ADC。

关于12位,16位的概念,我们再以5V的ADC模块为例介绍:
8位的精度:把0~5V分成2^8份=256份,每份表示5/256=0.02V;
10位的精度:把0~5V分成2^10份=1024份,每份表示5/1024=0.005V;
12位的精度:把0~5V分成2^12份=4096份,每份表示5/4096=0.0012V;
16位的精度:把0~5V分成2^16份=65536份,每份表示5/65536=0.000076V;
24位的精度:把0~5V分成2^24份=16777215份,每份表示5/16777215=0.00000023V;
所以在考虑同样的温度影响下,位数越多,采集的电压值就越精确,精度越高,比如需要精确到1 mV的场合,我们单片机内部的ADC精度就不够了,就需要更高位数的ADC。

ADS1115是德州仪器(TI)推出的具有IIC接口的16位ADC转换器,可以实现四个单端输入或两个差分输入。可应用于电池电压电流检测,低速便携式仪表以及温度测量系统中。
在这里插入图片描述

二.ADS1115芯片介绍

芯片引脚
在这里插入图片描述
芯片内部框图
在这里插入图片描述
ADS1115 器件采用了低漂移电压基准和振荡器。ADS1115 还采用可编程增益放大器 (PGA) 和数字比较器。这些特性加以较宽的工作电源电压范围使得ADS1115非常适合功率受限和空间受限的传感器测量。

三.ADS1115芯片主要特性

1.芯片采用超小型X2QFN封装:2mm ×1.5mm × 0.4mm
2.宽电源电压:2.0V至5.5V
3.低流耗:150μA(连续转换模式)
4.可编程数据传输速率:8SPS 至860SPS
5.单周期稳定
6.内部低漂移电压基准
7.内部振荡器
8.I2C 接口:四个引脚可选地址
9.四个单端输入或两个差分输入(ADS1115)
10.可编程比较器(ADS1114和ADS1115)
11.工作温度范围:-40°C 至 +125°C
12.ADS1115 可在数据速率高达每秒860个样本(SPS)的情况下执行转换。PGA(用可编程增益放大器)可提供从±256mV到±6.144V 的输入范围,从而实现精准的大小信号测量。
13.ADS1115 既可在连续转换模式下工作,也可在单冲模式下工作。在单冲模式下,这些器件可在一次转换后自动断电;因此显著降低了空闲期间的功耗。

四.ADS1115模块接线说明

在这里插入图片描述
在这里插入图片描述

五.ADS1115参考原理图

ADS1115模块参考原理图

在这里插入图片描述

ADDR引脚的电压决定IIC从机的7位地址,如下图
在这里插入图片描述

用ADS1115芯片采样温度传感器模拟量的参考电路
在这里插入图片描述

六.通讯协议介绍

IIC时序
芯片采用标准的IIC接口,最高读写速度可以达3.4Mb/S。外部微控制器可以通过IIC接口对芯片进行配置,包括读写功能寄存器等,默认ADDR引脚是低电平,所以7位地址是1001000,通讯时还需要加最后1位读写位组成8位数据,所以根据下图时序,IIC通讯地址读数据是10010001(0x91),写数据地址是10010000(0x90)。

读操作:
在这里插入图片描述
写操作:
在这里插入图片描述

主要寄存器

转换寄存器(内部地址00H),主要是读取ADC采样的16位数据转换结果
在这里插入图片描述

配置寄存器(内部地址01H),主要是配置参数
在这里插入图片描述

OS
掉电状态下启动单次转换配置
在这里插入图片描述

MUX[2:0]
多路复用配置,用来配置采集哪一路,比如要用AIN0进行单端采样,MUX[2:0]就是100
在这里插入图片描述

PGA[2:0]:
就是用来配置不同的量程,不同量程最小有效位的电压值不同,一般配置成6.144V,如果采样的电压低,对精度要求高,可以降低最大量程配置

在这里插入图片描述
在这里插入图片描述

MODE:
用来配置连续采样还是单次采样模式
在这里插入图片描述

大致芯片操作流程:

1.配置寄存器 (01H)设置最大量程,采样通道,单次转换还是连续转换模式等。
2.等待配置完成。
3.读取转换寄存器(00H)的值。
4.根据读取转换寄存器(00H)的值结合LSB SIZE(最低有效位)计算出实际电压值,比如转换寄存器(00H)读到的值是0x1000,最大量程设置的是6.144V,采集到的电压值为:0x1000*0.0001875=0.768V。

七.STM32单片机与ADS1115模块实现电压采集实验

1.硬件准备

STLINK接STM32F103C8T6开发板,STLINK接电脑USB口。

模块与开发板相连:
在这里插入图片描述

模块VDD <---->板子3.3V
模块GND <---->板子GND
模块SCL <---->板子PB10
模块SDA <---->板子PB11
模块A0 <---->板子3.3V或者GND
模块A1 <---->板子3.3V

主要实现模块的A0和A1通道进行电压采集,两个引脚同时采样VCC电压或者一个引脚采集GND另一个采集VCC。

2.软件工程

在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述
配置IIC
在这里插入图片描述
配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加OLED显示相关代码
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

添加ADS1115相关代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.软件主要代码

#define ADS1115_DEV_ADDR_GND            0x90//ADDR接GND,ADS1115地址
#define ADS1115_DEV_ADDR_VDD            0x92//ADDR接VDD,ADS1115地址
#define ADS1115_DEV_ADDR_SDA            0x94//ADDR接SDA,ADS1115地址
#define ADS1115_DEV_ADDR_SCL            0x96//ADDR接SCL,ADS1115地址#define ADS1115_DEV_ADDR            	0x90//ADDR接GND决定ADS1115的7位地址,如果是写命令就是0x90,读命令就是0x91     #define ADS1115_Conversion        	 	 0x00  //转换寄存器地址
#define ADS1115_Config              	 0x01  //配置寄存器地址uint8_t BYTE_BUF[2];//读取转换寄存器的数组值/*********************************************************************************
描述:配置01H寄存器,实现单次转换,读取00H寄存器,实现电压采样,并转换成电压值
输入:channel:需要采集的通道号,ADS1115是4通道,所以是0~3,分别代表A0~A3通道
返回:浮点数,对应通道采集到的电压值,单位Vhttps://gzwelink.taobao.com
**********************************************************************************/
float ADS1115_Read_ADC(uint8_t channel)//选择一个通道的单次转换
{uint8_t ConfigBuff[2];uint8_t PGA;int16_t tempData;float voltage;//实际电压值PGA=0;//配置PGA[2:0]为000,采用FSR = ±6.144 Vswitch (channel){case 0:ConfigBuff[0] = (0xC1&0xf1)|(PGA<<1);    //bit[15]=OS=1:开始单次转换0xC1[单次]//bit[14:12]=MUX[2:0]=100 : AINP = AIN0 and AINN = GND,采集A0通道//bit[11:9]=PGA[2:0]=000 : FSR = ±6.144 V//bit[8]=MODE=1:单次模式或掉电状态break;case 1:ConfigBuff[0] =(0xD1&0xf1)|(PGA<<1) ;    //bit[15]=OS=1:开始单次转换0xD1[单次]//bit[14:12]=MUX[2:0]=101 : AINP = AIN1 and AINN = GND,采集A1通道//bit[11:9]=PGA[2:0]=000 : FSR = ±6.144 V//bit[8]=MODE=1:单次模式或掉电状态break;case 2:ConfigBuff[0] =(0xE1&0xf1)|(PGA<<1);    //bit[15]=OS=1:开始单次转换0xE1[单次]//bit[14:12]=MUX[2:0]=110 : AINP = AIN2 and AINN = GND,采集A2通道//bit[11:9]=PGA[2:0]=000 : FSR = ±6.144 V//bit[8]=MODE=1:单次模式或掉电状态break;case 3:ConfigBuff[0] =(0xF1&0xf1)|(PGA<<1);    //bit[15]=OS=1:开始单次转换0xF1[单次]//bit[14:12]=MUX[2:0]=111 : AINP = AIN3 and AINN = GND,采集A3通道//bit[11:9]=PGA[2:0]=000 : FSR = ±6.144 V//bit[8]=MODE=1:单次模式或掉电状态break;        }ConfigBuff[1] = 0xE3;     //bit[7:5]=DR[2:0]=111:860 SPS//bit[1:0]=COMP_QUE[1:0]=11:不使能比较器HAL_I2C_Mem_Write(&hi2c2,ADS1115_DEV_ADDR,ADS1115_Config,1,ConfigBuff,2,1000);//调用HAL库IIC写函数,按上面的参数,配置01H寄存器HAL_Delay(2);// 延时一定时间  HAL_I2C_Mem_Read(&hi2c2,ADS1115_DEV_ADDR,ADS1115_Conversion,1,BYTE_BUF,2,1000);//调用HAL库IIC读函数读取,00H寄存器的AD转换值,放入BYTE_BUFtempData = (int16_t)(BYTE_BUF[0] << 8) + (int16_t)BYTE_BUF[1];//FSR ±6.144 V,LSB 187.5 μV//FSR ±4.096 V,LSB 125 μV//FSR ±2.048 V,LSB 62.5 μV//FSR ±1.024 V,LSB 31.25 μV//FSR ±0.512 V,LSB 15.625 μV//FSR ±0.256 V,LSB 7.8125 μVswitch (PGA)//根据量程,采样值*LSB就是采集到的电压值{case 5:voltage = tempData * 0.0078125;//单位Vbreak;case 4:voltage = tempData * 0.015625;//单位Vbreak;case 3:voltage = tempData * 0.03125;//单位Vbreak;case 2:voltage = tempData * 0.0625;//单位Vbreak;case 1:voltage = tempData * 0.000125;//单位Vbreak;case 0:voltage = tempData * 0.0001875;//单位Vbreak;default:voltage = 0;break;}return voltage;}
/*********************************************************************************
描述:计算平均数
输入:channel:需要采集的通道号,ADS1115是4通道,所以是0~3,分别代表A0~A3通道
返回:浮点数,求平均后的电压,单位Vhttps://gzwelink.taobao.com
**********************************************************************************/
float ADS1115_Read_average_ADC(uint8_t channel)
{float sum[10],average;for(int i=0;i<10;i++){sum[i]=ADS1115_Read_ADC(channel);}average=(sum[3]+sum[4]+sum[5]+sum[6]+sum[7]+sum[8])/6;return average;
}float A0_Voltage,A1_Voltage;//A0通道,A1通道电压值int main(void)
{/* USER CODE BEGIN 1 */char buffer[]="";//显示存储数组/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();//8M外部晶振,72M系统主频/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_I2C2_Init();//配置IIC2,100K速度,PB10 SCL,PB11 SDA/* USER CODE BEGIN 2 */OLED_Init();//OLED初始化  OLED_Clear();//清屏/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */OLED_Clear();//清屏OLED_ShowCHinese(18,0,0);//光OLED_ShowCHinese(36,0,1);//子OLED_ShowCHinese(54,0,2);//物OLED_ShowCHinese(72,0,3);//联OLED_ShowCHinese(90,0,4);//网OLED_ShowString(6,2,(u8*)"ADS1115  TEST");//显示字符串 OLED_ShowString(20,4,(u8*)"A0:");//显示字符串 OLED_ShowString(20,6,(u8*)"A1:");//显示字符串 OLED_ShowString(100,4,(u8*)"V");//显示字符串 OLED_ShowString(100,6,(u8*)"V");//显示字符串 A0_Voltage=ADS1115_Read_average_ADC(0);	//读取A0通道输入的电压,选择6.144V最大量程	sprintf(buffer,"%5.3f",A0_Voltage);//浮点型数据转为指定格式的字符串,5位,3位小数点OLED_ShowString(50,4,(u8*)buffer);//显示A0通道电压值,单位VHAL_Delay(100);//等待100msA1_Voltage=ADS1115_Read_average_ADC(1);	//读取A1通道输入的电压,选择6.144V最大量程	sprintf(buffer,"%5.3f",A1_Voltage);//浮点型数据转为指定格式的字符串,5位,3位小数点OLED_ShowString(50,6,(u8*)buffer);//显示A1通道电压值,单位V HAL_Delay(2000);//等待2000ms}/* USER CODE END 3 */
}

4.实验效果

两个通道同时采集板子3.3V电压
在这里插入图片描述

A1通道采集3.3V,A0通道采集GND,采集到的电压与万用表比较
在这里插入图片描述

八.源代码工程下载

CSDN源代码下载

九.小结

ADS1115是一款精确的16位模数转换器,能够处理多路输入信号,支持差分和单端输入,可广泛应用于各种传感器的信号采集。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/457212.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认识和使用 Vite 环境变量配置,优化定制化开发体验

Vite 官方中文文档&#xff1a;https://cn.vitejs.dev/ 环境变量 Vite 内置的环境变量如下&#xff1a; {"MODE": "development", // 应用的运行环境"BASE_URL": "/", // 部署应用时使用的 URL 前缀"PROD": false, //应用…

JavaScript完整笔记

JS引入 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。 通过 script 标签将 JavaScript 代码引入到 HTML 中&#xff0c;有两种方式&#xff1a; 内部方式 通过 script 标签包裹 JavaScript 代码 我们将 &…

使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理方便内网网站访问)【使用frp搭建内网穿透】

FRP&#xff08;Fast Reverse Proxy&#xff09;是一个高性能的反向代理应用程序&#xff0c;主要用于内网穿透。它允许用户将内部网络服务暴露到外部网络&#xff0c;适用于 NAT 或防火墙环境下的服务访问。 他是一个开源的 服务 如果大家不想用 花生壳 软件&#xff0c;可以尝…

卷积神经网络评价指标

1.评价指标的作用 1. 性能评估&#xff1a;评价指标提供了一种量化的方式来衡量CNN模型的性能。通过这些指标&#xff0c;我们可以了解模型在特定任务上的表现&#xff0c;比如图像分类、目标检测或图像分割等。 2. 模型比较&#xff1a;不同的模型架构或训练策略可能会产生不…

基于SSM考研助手系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教学秘书管理&#xff0c;考研资讯管理&#xff0c;考研名师管理&#xff0c;考研信息管理&#xff0c;系统管理 教学秘书账号功能包括&#xff1a;系统首页&#xff0c;个人中心…

如何快速解决游戏提示系统中的emp.dll缺失问题

emp.dll是一个动态链接库&#xff08;Dynamic Link Library, DLL&#xff09;文件&#xff0c;这类文件在Windows操作系统中扮演着至关重要的角色。它们包含了可由多个程序同时使用的代码和数据&#xff0c;其主要目的是实现模块化&#xff0c;以便于程序的更新和动态链接。emp…

es实现自动补全

目录 自动补全 拼音分词器 安装拼音分词器 第一步&#xff1a;下载zip包&#xff0c;并解压缩 第二步&#xff1a;去docker找到es-plugins数据卷挂载的位置&#xff0c;并进入这个目录 第三步&#xff1a;把拼音分词器的安装包拖到这个目录下 第四步&#xff1a;重启es 第…

RV1126音视频学习(二)-----VI模块

文章目录 前言2.RV1126的视频输入vi模块2.1什么是VI模块2.3RV1126VI模块主要APIRK_MPI_SYS_Init()RK_MPI_VI_SetChnAttrRK_MPI_VI_EnableChnRK_S32 RK_MPI_VI_DisableChnRK_MPI_VI_StartStreamRK_MPI_SYS_GetMediaBufferRK_MPI_MB_GetPtrRK_MPI_MB_GetSizeRK_MPI_MB_ReleaseBuf…

【NOIP提高组】加分二叉树

【NOIP提高组】加分二叉树 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 设一个n个节点的二叉树tree的中序遍历为&#xff08;l,2,3,…,n&#xff09;&#xff0c;其中数字1,2,3,…,n为节点编号。每个节点都有一个分数&#xff08;均为正整…

读《认知觉醒》:浅谈费曼技巧

最近在阅读《认知觉醒》这本书&#xff0c;封面如下&#xff1a; 读到了里面对于费曼技巧的介绍&#xff08;在第八章&#xff09;&#xff0c;感觉受到了一些启发&#xff0c;在这里分享给大家。 其实之前很早就接触过了费曼技巧&#xff0c;但是并没有很好的应用起来&#x…

零代码快速开发智能体 |甘肃旅游通

零代码快速开发智能体 &#xff5c;甘肃旅游通 本文仅用于文心智能体的活动征文 参与人&#xff1a;mengbei_admin 文心智能体平台是人工智能领域的佼佼者。它拥有强大的语言理解与生成能力&#xff0c;能精准回应各种问题&#xff0c;出色完成文本创作、知识问答和翻译等任…

线性表之双向链表

链表花里胡哨&#xff0c;一应俱全 前言 在这之前&#xff0c;我们已经学习了单链表。我们发现这些链表都是一个接一个朝一个方向接下去&#xff0c;有时&#xff0c;我们想要查找某个结点的时候还得从头开始遍历查找&#xff0c;尽管我们已经学习了顺序表&#xff0c;查找某个…

免费PDF页面提取小工具

下载地址 https://download.csdn.net/download/woshichenpi/89922797 使用说明&#xff1a;PDF页面提取工具 1. 启动应用程序 双击程序的启动图标或者通过命令行运行程序。 2. 选择PDF文件 在应用程序窗口中找到“选择PDF”按钮并点击它。在弹出的文件选择对话框中&#x…

Windows server 2003服务器的安装

Windows server 2003服务器的安装 安装前的准备&#xff1a; 1.镜像SN序列号 图1-1 Windows server 2003的安装包非常人性化 2.指定一个安装位置 图1-2 选择好安装位置 3.启动虚拟机打开安装向导 图1-3 打开VMware17安装向导 图1-4 给虚拟光驱插入光盘镜像 图1-5 输入SN并…

Linux系统安装Redis详细操作步骤(二进制发布包安装方式)

安装方式介绍 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可rpm安装软件已经按照redhat的包管理规范进…

Redis 集群 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 集群 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 集群 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 集群…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中&#xff0c;每一层都会添加自己的头部信息&#xff0c;最终形成完整的数据包。具体来说&#xff1a; 应用层生成的应用程序…

Java--反射机制

前言&#xff1a; 反射与之前的知识的区别 1.面向对象中创建对象&#xff0c;调用指定结构(属性、方法)等功能&#xff0c;可以不使用反射&#xff0c;也可以使用反射。请问有什么区别? 不使用反射&#xff0c;我们需要考虑封装性。比如:出了自定义类之后&#xff0c;就不能…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples&#xff0c;新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

电池的主被动均衡

只有串联的电池需要进行电压均衡&#xff0c;并联的电池由于电压一致&#xff0c;所以并不需要进行均衡&#xff1a; 被动均衡有一个很明显的特征就是会看到很多大电阻&#xff0c;串联在MOS和电池之间&#xff1a;下图中的保护板就是被动均衡板子以及它的原理图&#xff1a; …