文章目錄
- 一、ADS1015簡介
- 二、引腳功能
- 三、寄存器介紹
- 1.Conversion Register 轉化數據存放寄存器
- 2.Config Register 配置寄存器
- 四、IIC時序
- 1.寫寄存器
- 2.讀寄存器
- 五、程序
- 六、實驗現象
- 1.單端模式
- 2.差分模式
- 3.偽多通道模式
一、ADS1015簡介
ADS1015 是一款由德州儀器(TI)推出的 12 位高精度模數轉換器(ADC),通過 I2C 接口與主控設備通信。它提供 4 路單端輸入或 2 路差分輸入,內置可編程增益放大器(PGA),支持多種電壓測量范圍,最高采樣率可達 3300 次每秒,廣泛應用于傳感器數據采集、電壓監測、工業控制等場合。
二、引腳功能
ADDR | IIC地址選擇 |
---|---|
ALERT/RDY | 比較器輸出高低或轉換就緒 |
GND | 電源地 |
AIN0-AIN3 | 模擬量輸入 |
VDD | 電源正 |
SDA | IIC時鐘線 |
SCL | IIC數據線 |
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 | 字段 | 類型 | 復位值 | 描述 |
---|---|---|---|---|
15 | OS | R/W | 1h | 運行狀態或單次轉換啟動該位決定設備的運行狀態。 操作系統只能在下電狀態下寫入,在轉換過程中沒有作用。 寫入: 0:沒有效果 1:啟動單次轉換(在斷電狀態下) 讀時: 0:設備當前正在執行轉換 1:設備當前未執行轉換 |
14:12 | MUX[2:0] | R/W | 0h | 輸入多路復用配置 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:9 | PGA[2:0] | R/W | 2h | 可編程增益放大器配置 這些位設置可編程增益放大器的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 |
8 | MODE | R/W | 1h | 設備運行方式 這個位控制操作模式。 0:連續轉換模式 1:單次模式或掉電狀態(默認) |
7:5 | DR[2:0] | R/W | 4h | 數據速率 這些位控制數據速率設置。 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 |
4 | COMP_MODE | R/W | 0h | 比較器模式 該位控制比較器工作 0:傳統比較器(默認) 1:窗口比較器 |
3 | COMP_POL | R/W | 0h | 比較器極性 該位控制ALERT / RDY引腳的極性 0:低電平有效(默認) 1:高電平有效 |
2 | COMP_LAT | R/W | 0h | 鎖存比較器 該位控制ALERT / RDY引腳在被置為有效后鎖存,還是在轉換后處于上限和下限閾值范圍之內清零。 0:非鎖存比較器。 置位后ALERT / RDY引腳不鎖存(默認) 1:鎖存比較器。 置為有效的ALERT / RDY引腳保持鎖存狀態,直到轉換數據由主服務器或適當的SMBus警報響應讀取由主機發送。 設備以其地址響應,它是最低的當前聲明ALERT / RDY總線的地址。 |
1:0 | COMP_QUE[1:0] | R/W | 3h | 比較器置位和禁用 這些位執行兩個功能。 設置為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
以上內容個人理解,如有不正歡迎指正,需要資料及工程可留言郵箱