文章目录
- 一.概要
- 二.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位模数转换器,能够处理多路输入信号,支持差分和单端输入,可广泛应用于各种传感器的信号采集。