STM32 驅動 ADS1015 單端 差分 多通道模式 ADC 轉換

文章目錄

  • 一、ADS1015簡介
  • 二、引腳功能
  • 三、寄存器介紹
    • 1.Conversion Register 轉化數據存放寄存器
    • 2.Config Register 配置寄存器
  • 四、IIC時序
    • 1.寫寄存器
    • 2.讀寄存器
  • 五、程序
  • 六、實驗現象
    • 1.單端模式
    • 2.差分模式
    • 3.偽多通道模式


一、ADS1015簡介

ADS1015 是一款由德州儀器(TI)推出的 12 位高精度模數轉換器(ADC),通過 I2C 接口與主控設備通信。它提供 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
英文地址,請注明出處:http://en.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;還望諒…