STM32 驱动 ADS1015 单端 差分 多通道模式 ADC 转换

文章目录

  • 一、ADS1015简介
  • 二、引脚功能
  • 三、寄存器介绍
    • 1.Conversion Register 转化数据存放寄存器
    • 2.Config Register 配置寄存器
  • 四、IIC时序
    • 1.写寄存器
    • 2.读寄存器
  • 五、程序
  • 六、实验现象
    • 1.单端模式
    • 2.差分模式
    • 3.伪多通道模式


一、ADS1015简介

ADS1015 是一款由德州仪器(TI)推出的 12 位高精度模数转换器(ADC),通过 I²C 接口与主控设备通信。它提供 4 路单端输入或 2 路差分输入,内置可编程增益放大器(PGA),支持多种电压测量范围,最高采样率可达 3300 次每秒,广泛应用于传感器数据采集、电压监测、工业控制等场合。
在这里插入图片描述

二、引脚功能

ADDRIIC地址选择
ALERT/RDY比较器输出高低或转换就绪
GND电源地
AIN0-AIN3模拟量输入
VDD电源正
SDAIIC时钟线
SCLIIC数据线

ADS1015引脚ADDR用于设置器件的IIC地址, 该引脚可以连接到GND、VDD、SDA、SCL,从而选择四个不同的IIC地址。本文使用的模块ADDR引脚接在GND上,故从机地址为0x90/0x91。
在这里插入图片描述

三、寄存器介绍

(只说明需要用到的两个寄存器,其它的不做说明可自行查看手册)

1.Conversion Register 转化数据存放寄存器

16 位转换寄存器(Conversion register)包含上一次转换的结果,格式为二进制补码。上电后,转换寄存器被清零为 0000h,并保持该值,直到第一次转换完成。
在这里插入图片描述

由图表可知 AD 转换后的 AD 值存放于该寄存器15-4位,而 3-0 位保留为0,故读取数据只需高 12 位即可

2.Config Register 配置寄存器

16位配置寄存器用于控制操作模式、输入选择、数据速率、满量程范围和比较器模式。

Bit字段类型复位值描述
15OSR/W1h运行状态或单次转换启动该位决定设备的运行状态。
操作系统只能在下电状态下写入,在转换过程中没有作用。
写入:
0:没有效果
1:启动单次转换(在断电状态下)
读时:
0:设备当前正在执行转换
1:设备当前未执行转换
14:12MUX[2:0]R/W0h输入多路复用配置
000 : AINP = AIN0 and AINN = AIN1 (default)
001 : AINP = AIN0 and AINN = AIN3
010 : AINP = AIN1 and AINN = AIN3
011 : AINP = AIN2 and AINN = AIN3
100 : AINP = AIN0 and AINN = GND
101 : AINP = AIN1 and AINN = GND
110 : AINP = AIN2 and AINN = GND
111 : AINP = AIN3 and AINN = GND
11:9PGA[2:0]R/W2h可编程增益放大器配置
这些位设置可编程增益放大器的FSR
000 : FSR = ±6.144 V
001 : FSR = ±4.096 V
010 : FSR = ±2.048 V (default)
011 : FSR = ±1.024 V
100 : FSR = ±0.512 V
101 : FSR = ±0.256 V
110 : FSR = ±0.256 V
111 : FSR = ±0.256 V
8MODER/W1h设备运行方式
这个位控制操作模式。
0:连续转换模式
1:单次模式或掉电状态(默认)
7:5DR[2:0]R/W4h数据速率
这些位控制数据速率设置。
000 : 8 SPS
001 : 16 SPS
010 : 32 SPS
011 : 64 SPS
100 : 128 SPS (default)
101 : 250 SPS
110 : 475 SPS
111 : 860 SPS
4COMP_MODER/W0h比较器模式
该位控制比较器工作
0:传统比较器(默认)
1:窗口比较器
3COMP_POLR/W0h比较器极性
该位控制ALERT / RDY引脚的极性
0:低电平有效(默认)
1:高电平有效
2COMP_LATR/W0h锁存比较器
该位控制ALERT / RDY引脚在被置为有效后锁存,还是在转换后处于上限和下限阈值范围之内清零。
0:非锁存比较器。 置位后ALERT / RDY引脚不锁存(默认)
1:锁存比较器。 置为有效的ALERT / RDY引脚保持锁存状态,直到转换数据由主服务器或适当的SMBus警报响应读取由主机发送。 设备以其地址响应,它是最低的当前声明ALERT / RDY总线的地址。
1:0COMP_QUE[1:0]R/W3h比较器置位和禁用
这些位执行两个功能。 设置为11时,比较器被禁用,ALERT / RDY引脚被设置为高阻抗状态。 当设置为任何其他值时,将启用ALERT / RDY引脚和比较器功能,并且该设置值确定连续的转换次数超过在声明ALERT / RDY引脚之前所需的上限或下限阈值
00:一次转换后断言
01:两次转换后置位
10:四次转换后置位
11:禁用比较器并将ALERT / RDY引脚设置为高阻抗(默认)

四、IIC时序

1.写寄存器

在这里插入图片描述

2.读寄存器

在这里插入图片描述

五、程序

ADS1015.h
#ifndef __ADS1015_H
#define __ADS1015_H/*IIC 地址--------------------------------------------------------------------------*/
#define ADS1015_W 0x90
#define ADS1015_R 0x91
/*寄存器地址----------------------------------------------------------------------------*/
#define REG_Conversion 0x00
#define REG_config		 0x01
#define REG_L_thresh 	 0x02
#define REG_H_thresh 	 0x03
/* REG_config Bit15-4 ------------------------------------------------------------------*/
#define OS 				     1 		  //操作状态或单发转换启动  (1位)
#define MUX 			     0x04 	  //输入多路配置  通道0  (3位)
#define PGA 			     0x00	  //可编程增益放大器配置  量程 ±6.144  V  (3位)
#define MODE		         0x00	  //设备运行方式  连续转换模式  (1位)
#define DR				     0x03     //转换速率920SPS  (3位)
#define	COMP_MODE	         0 		  //比较器模式  传统比较器  (默认)(1位)
#define COMP_POL 	         0		  //比较器极性  低电平有效  (默认)(1位)
#define COMP_LAT	         0 		  //锁存比较器  非锁存比较器, 置位后ALERT / RDY引脚不锁存  (默认)(1位)
#define COMP_QUE	         0x03 	  //比较器置位和禁用  禁用 (默认)(2位)
#define config_MSB (OS << 7)|(MUX << 4)|(PGA << 1)|(MODE)
#define config_LSB (DR << 5)|(COMP_MODE << 4)|(COMP_POL << 3)|(COMP_LAT << 2)|(COMP_QUE)uint32_t ADS1015_ReadReg(uint8_t RegAddress);
void ADS1015_WriteReg(uint8_t RegAddress, uint8_t Data_H, uint8_t Data_L);
void ADS1015_Init(void);
int32_t ADS1015_GetVoltage(void);#endif
ADS1015.C
#include "stm32f10x.h"                   // Device header
#include "MyI2C.h"
#include "ADS1015.h"void ADS1015_WriteReg(uint8_t RegAddress, uint8_t Data_H, uint8_t Data_L)
{MyI2C_Start();						  //I2C起始MyI2C_SendByte(ADS1015_W);	          //发送从机地址,读写位为0,表示即将写入MyI2C_ReceiveAck();					  //接收应答MyI2C_SendByte(RegAddress);		      //发送寄存器地址MyI2C_ReceiveAck();					  //接收应答MyI2C_SendByte(Data_H);			      //发送要写入寄存器的数据高位MyI2C_ReceiveAck();					  //接收应答MyI2C_SendByte(Data_L);			      //发送要写入寄存器的数据低位MyI2C_ReceiveAck();					  //接收应答MyI2C_Stop();						  //I2C终止
}uint32_t ADS1015_ReadReg(uint8_t RegAddress)
{uint32_t Data=0;MyI2C_Start();						  //I2C起始MyI2C_SendByte(ADS1015_W);	          //发送从机地址MyI2C_ReceiveAck();					  //接收应答MyI2C_SendByte(RegAddress);	          //发送寄存器地址MyI2C_ReceiveAck();					  //接收应答MyI2C_Start();					   	  //I2C重复起始MyI2C_SendByte(ADS1015_R);	          //发送从机地址MyI2C_ReceiveAck();					  //接收应答Data = MyI2C_ReceiveByte();	          //接收指定寄存器的高位数据MyI2C_SendAck(0);				  	  //发送应答Data = (Data << 4) | ((MyI2C_ReceiveByte())>>4);//接收指定寄存器的低位数据MyI2C_SendAck(1);                     //发送非应答MyI2C_Stop();						  //I2C终止return Data;
}int32_t ADS1015_GetVoltage(void)//获取电压
{uint32_t AD=0;int32_t Voltage=0;AD = ADS1015_ReadReg(REG_Conversion);    //获取 AD 值if(AD > 0x7FF)                           //如果是负压{Voltage = 0-((0xFFF-AD)*(6144/2048));//分辨率:6.144V÷2^11=6144mV÷2048   电压=AD值*分辨率}else                                    //正压{Voltage = AD*(6144/2048);}return Voltage;
}void ADS1015_Init(void)
{ADS1015_WriteReg(REG_config,config_MSB,config_LSB);
}
main.C
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "ADS1015.h"
#include "MyI2C.h"int32_t Channel_0_voltage,Channel_1_voltage,Channel_2_voltage,Channel_3_voltage;//定义用于存放各个通道的电压数据void SingleVoltage_Show(void);
void MultipleChannels_Show(void);int main(void)
{Delay_ms(1000);//上电延时MyI2C_Init();ADS1015_Init();//配置寄存器初始化OLED_Init();Delay_ms(1000);SingleVoltage_Show();//单端模式//MultipleChannels_Show();//伪多通道模式
}void SingleVoltage_Show(void)//单端模式 IN0 输入模拟电压,需使用其它通道修改 ADS1015.h 头文件中的 MUX 字段
{while(1){Channel_0_voltage = ADS1015_GetVoltage();OLED_ShowString(1,1,"Channel0:");OLED_ShowSignedNum(1,10,Channel_0_voltage,4);OLED_ShowString(1,15,"mV");Delay_ms(1000);}
}//差分模式在单端模式基础上改一下 ADS1015.h 头文件中的 MUX 字段,修改输入通道模式即可void MultipleChannels_Show(void)//伪多通道模式,ADS1015只有一个ADC,不能真正同时多通道输入,采用时分复用方法,配置多个通道快速分时采集
{while(1){#define MUX 0x04 	    //使用通道0#define config_MSB (OS << 7)|(MUX << 4)|(PGA << 1)|(MODE)ADS1015_WriteReg(REG_config,config_MSB,config_LSB);Delay_ms(100);Channel_0_voltage = ADS1015_GetVoltage();#define MUX 0x05 	    //使用通道1#define config_MSB (OS << 7)|(MUX << 4)|(PGA << 1)|(MODE)ADS1015_WriteReg(REG_config,config_MSB,config_LSB);Delay_ms(100);Channel_1_voltage = ADS1015_GetVoltage();#define MUX 0x06 	    //使用通道2#define config_MSB (OS << 7)|(MUX << 4)|(PGA << 1)|(MODE)ADS1015_WriteReg(REG_config,config_MSB,config_LSB);Delay_ms(100);Channel_2_voltage = ADS1015_GetVoltage();#define MUX 0x07      //使用通道3#define config_MSB (OS << 7)|(MUX << 4)|(PGA << 1)|(MODE)ADS1015_WriteReg(REG_config,config_MSB,config_LSB);Delay_ms(100);Channel_3_voltage = ADS1015_GetVoltage();OLED_ShowString(1,1,"Channel0:");OLED_ShowSignedNum(1,10,Channel_0_voltage,4);OLED_ShowString(1,15,"mV");OLED_ShowString(2,1,"Channel1:");OLED_ShowSignedNum(2,10,Channel_1_voltage,4);OLED_ShowString(2,15,"mV");OLED_ShowString(3,1,"Channel2:");OLED_ShowSignedNum(3,10,Channel_2_voltage,4);OLED_ShowString(3,15,"mV");OLED_ShowString(4,1,"Channel3:");OLED_ShowSignedNum(4,10,Channel_3_voltage,4);OLED_ShowString(4,15,"mV");Delay_ms(500);}
}

六、实验现象

----------------------------------------------------OLED接线------------------------------------------------------
SCL-----PB8
SDA-----PB9
--------------------------------------------------ADS1015接线--------------------------------------------------
SCL-----PB10
SDA-----PB11

1.单端模式

main 里调用 SingleVoltage_Show(); 函数
AIN0 分别输入 1.8V 3.3V 5V

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

在这里插入图片描述

2.差分模式

差分模式在单端模式基础改一下 ADS1015.h 头文件中的 MUX 字段,修改输入通道模式即可
#define MUX 0x00 // AINP = AIN0 and AINN = AIN1 通道 0 1 差分输入

AIN 0 与 AIN 1 通道分别输入 1.8V 或者 3.3V ,显示压差 ± 1490

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

3.伪多通道模式

ADS1015只有一个ADC,不能真正同时多通道输入,采用时分复用方法,配置多个通道快速分时采集

main 里调用 MultipleChannels_Show(); 函数 ,注意 SingleVoltage_Show(); 需注释掉
四个通道 AIN 01234 分别输入 0V 1.8V 3.3V 5V

在这里插入图片描述

以上内容个人理解,如有不正欢迎指正,需要资料及工程可留言邮箱

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

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

相关文章

RabbitMQ 消费幂等性与消息重放实现

一、幂等性实现 1.1 什么是幂等性&#xff1f; 幂等性是指同一条消息无论被消费多少次&#xff0c;业务结果都只生效一次&#xff0c;防止重复扣款、重复发货等问题。 RabbitMQ 的投递模式是“至少一次交付”(at-least-once delivery)&#xff0c;如果消费者处理失败或者没有及…

【HarmonyOS 5】鸿蒙TEE(可信执行环境)详解

【HarmonyOS 5】鸿蒙TEE&#xff08;可信执行环境&#xff09;详解 一、TEE是什么&#xff1f; 1、TEE的定义&#xff1a; 可信执行环境&#xff08;Trusted Execution Environment&#xff09;&#xff0c;简称TEE&#xff0c;是存在于智能手机、平板或任意移动设备主处理器…

算法: 冒泡排序

冒泡排序是一种简单的排序算法&#xff0c;通过相邻元素的比较和交换&#xff0c;使较大的元素逐渐"浮"到数组末尾。 时间复杂度:最佳 O(n) | 平均 O(n) | 最差 O(n) 空间复杂度:O(1) 稳定性:稳定 应用场景/前提条件 适用于小规模数据对几乎已排序的数据效率较高…

基于SpringBoot的家电销售展示平台

源码编号&#xff1a;S567 源码名称&#xff1a;基于SpringBoot的家电销售展示平台 用户类型&#xff1a;双角色&#xff0c;用户、管理员 数据库表数量&#xff1a;14 张表 主要技术&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 运行环境&#xff1a;Windows/M…

java+vue+SpringBoo智慧旅游系统(程序+数据库+报告+部署教程+答辩指导)

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿ppt部署教程代码讲解代码时间修改工具 技术实现 开发语言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot数据库&#xff1a;mysql 开发工具 JDK版本&#xff1a;JDK1.…

Docker 入门教程(三):镜像操作命令

文章目录 &#x1f433; Docker 入门教程&#xff08;三&#xff09;&#xff1a;镜像操作命令获取镜像&#xff1a;docker pull查看镜像&#xff1a;docker images删除镜像&#xff1a;docker rmi搜索镜像&#xff1a;docker search镜像打标签&#xff1a;docker tag镜像详情与…

如何修改discuz文章标题字数限制 修改成255

在 Discuz! X3.5 中&#xff0c;文章&#xff08;主题&#xff09;标题字数的限制可以通过修改数据库结构以及后台配置来实现&#xff0c;以下是完整的修改方法&#xff0c;将标题长度限制改为 255 个字符&#xff1a; ✅ 一、修改数据库字段长度 Discuz 默认标题字段是 subje…

基于BP神经网络的26个英文字母识别

本课题旨在设计并实现一个基于BP&#xff08;反向传播&#xff09;神经网络的英文字母识别系统&#xff0c;实现对手写或打印的26个英文字母&#xff08;A-Z&#xff09;的自动分类识别。项目首先对字母图像进行预处理&#xff08;如灰度化、归一化、二值化和特征提取&#xff…

系统架构设计师论文分享-论云原生技术的应用

我的软考历程 摘要 2023年2月&#xff0c;我所在的公司做了开发纱线MES系统的决定&#xff0c;该系统为国内纱线工厂提供SAAS服务&#xff0c;旨在提高纱线工厂的智能化和数字化水平。我在该项目中被任命为系统架构设计师&#xff0c;全面掌管该项目的架构设计工作。该项目涉…

重置 MySQL root 密码

引言 在linux可能存在安装mysql安装失败&#xff0c;一直不出现默认密码 /usr/local/mysql/mysql-8.0.26/bin/mysqld --defaults-file/etc/my.cnf --usermysql --basedir/usr/local/mysql/mysql-8.0.26 --datadir/usr/local/mysql/mysql-8.0.26/data --lower-case-table-name…

面试八股---HTML

面试八股 1、HTML 1.1 src和href的区别 src 用于替换当前元素&#xff0c;href 用于在当前文档和引用资源之间确立联系。 核心区别在于 href 关联的资源&#xff08;主要是 CSS&#xff09;是用于描述页面外观的&#xff0c;浏览器可以先生成内容再应用样式&#xff0c;因此…

气候智能体:AI如何重构人类应对气候危机的决策体系?

前言 前些天发现了一个巨牛的人工智能免费学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 《气候智能体&#xff1a;AI如何重构人类应对气候危机的决策体系&#xff1f;》 展开全景式论述。文章结合2025年最新技术突破与…

UITableView的位置向下偏移, contentInsetAdjustmentBehavior使用详情

一.contentInsetAdjustmentBehavior 作用: 在iOS 11及以后&#xff0c;苹果引入了安全区域&#xff08;Safe Area&#xff09;的概念,当UITableView的frame超出了安全区域,系统会自定调整SafeAreaInsets的值,它可以自动调整内容的内边距&#xff0c;使得内容不会被导航栏遮挡。…

腾讯云RayData全新推出“行业解决方案模板”,一键快捷制作3D数据可视化作品

点击蓝字⬆ 关注我们 本文共计958字 预计阅读时长3分钟 腾讯云RayData Plus是一款专注于高视效的3D数据可视化的实时渲染工具。 功能全面&#xff1a;提供了三维、二维、动画、数据、交互逻辑等各类能力&#xff1b; 零代码制作&#xff1a;灵活的节点式创作&#xff0c;即便没…

深度解析基于贝叶斯的垃圾邮件分类

贝叶斯垃圾邮件分类的核心逻辑是基于贝叶斯定理&#xff0c;利用邮件中的特征&#xff08;通常是单词&#xff09;来计算该邮件属于“垃圾邮件”或“非垃圾邮件”的概率&#xff0c;并根据概率大小进行分类。它是一种朴素贝叶斯分类器&#xff0c;因其假设特征&#xff08;单词…

WPF 3D 开发全攻略:实现3D模型创建、旋转、平移、缩放

&#x1f3ae; WPF 3D 入门实战&#xff1a;从零打造一个可交互的立方体模型 标题&#xff1a; &#x1f680;《WPF 3D 开发全攻略&#xff1a;实现旋转、平移、缩放与法线显示》 &#x1f4a1; 引言 在现代图形应用中&#xff0c;3D 可视化已经成为不可或缺的一部分。WPF 提供…

Ruby 安装使用教程

一、Ruby 简介 Ruby 是一种简单快捷的面向对象脚本语言&#xff0c;以优雅、简洁、易读著称。它常被用于 Web 开发&#xff08;如 Ruby on Rails 框架&#xff09;、自动化脚本、DevOps、命令行工具等领域。 二、Ruby 安装教程 2.1 支持平台 Ruby 支持跨平台运行&#xff0c…

python | numpy小记(五):理解 NumPy 中的 `np.arccos`:反余弦函数

python | numpy小记&#xff08;五&#xff09;&#xff1a;理解 NumPy 中的 np.arccos&#xff1a;反余弦函数 一、函数签名与核心参数二、数学定义与取值范围三、基础使用示例四、与 Python 内建 math.acos 的对比五、常见问题与注意事项六、典型应用场景1. 三维向量夹角计算…

华为云Flexus+DeepSeek征文 | 华为云ModelArts与Reor的完美结合:创建高效本地AI笔记环境

华为云FlexusDeepSeek征文 | 华为云ModelArts与Reor的完美结合&#xff1a;创建高效本地AI笔记环境 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、Reor介绍Reor简介Reor主要特点 三、安装Reor工具下载Reor软件安装Reor工具 四、开…

【启发式算法】Dynamic A*(D*)算法详细介绍(Python)

&#x1f4e2;本篇文章是博主人工智能&#xff08;AI&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…