ADS1115使用及其驱动电路
ADS1115有QFP封装和SOC封装,使用非常方便,而且有4个通道,大大节约了电路控件,因此使用非常方便,
ADS1115.H文件
#ifndef __ADS115_H_
#define __ADS115_H_
#include "sys.h"/***************************************************************************************
*说明:当端输入时候正输入为输入信号,负输入为地但是输入信号不能为负电压(不能比地电位低)
* 双端输入时候正输入为输入信号,负输入为负输入输入信号的差值可以为负电压
****************************************************************************************/
#define SDA_A1 PCout(11)=1 //SDA输出
#define SDA_A0 PCout(11)=0
#define SCL_A1 PCout(12)=1 //SCL
#define SCL_A0 PCout(12)=0
#define SDA_AI PCin(11) //SDA读入//#define SDA_A21 PAout(10)=1 //SDA输出
//#define SDA_A20 PAout(10)=0
//#define SCL_A21 PAout(11)=1 //SCL
//#define SCL_A20 PAout(11)=0
//#define SDA_A2I PAin(10) //SDA读入//#define SDA_A31 PBout(10)=1 //SDA输出
//#define SDA_A30 PBout(10)=0
//#define SCL_A31 PBout(11)=1 //SCL
//#define SCL_A30 PBout(11)=0
//#define SDA_A3I PBin(10) //SDA读入//#define SDA_A41 PBout(12)=1 //SDA输出
//#define SDA_A40 PBout(12)=0
//#define SCL_A41 PBout(13)=1 //SCL
//#define SCL_A40 PBout(13)=0
//#define SDA_A4I PBin(12) //SDA读入//I2C地址以及读写设置
#define WR_REG 0x90 //写寄存器
#define RE_REG 0x91 //读寄存器/***********************************寄存器控制字**********************************************/
#define DATA_REG 0x00 //转换数据寄存器
#define CONF_REG 0x01 //控制字设置寄存器
#define LOTH_REG 0x02 //最低阀值寄存器
#define HITH_REG 0x03 //最高阀值寄存器#define ch0 0xc0 //通道0
#define ch1 0xd0 //通道1
#define ch2 0xe0 //通道2
#define ch3 0xf0 //通道3/***********************控制字申明*************************************************************
*| OS | MUX2 | MUX1 | MUX0 | PGA2 | PGA1 | PGA0 | MODE |------HCMD
*| DR2| DR1 | DR0 | COMP_MODE | COMP_POL | COMP_LAT | COMP_QUE1 | COMP_QUE0 |-----LCMD
***********************************************************************************************/
#define HCMD1 0x64 //AIN0单端输入 +-4.096量程 连续模式 01000100b
#define LCMD1 0xf0 //860sps 窗口比较器模式 输出低有效 不锁存信号至读 每周期检测阀值 11110000b/************************函数申明****************************/
static void ADS1115_delay(u16 D);
void delay_nms(u16 ms);
void delay_nus(u16 us);
void ADS1115_Init(void);
void I2CStart_A(void);
void I2CStop_A(void);
void I2CWriteByte_A(u8 DATA);
u8 I2CReadByte_A(void);
void ADS1115Config_A(u8 LCMD,u8 HCMD);
void SetThresHold_A(u16 L_TH,u16 H_TH); //高低阀门设置
u16 ReadAD_A(void);
u16 getad(u8 LCMD,u8 HCMD);
u16 lvbo(u8 LCMD,u8 HCMD);#endif
ADS1115.C文件
#include "sys.h"
#include "stm32f10x_i2c.h"
#include "ads1115.h"static void ADS1115_delay(u16 D)
{while(--D);
}void delay_nms(u16 ms)
{u16 i;u32 M = 0;//720Wfor(i = 0;i < ms; i++)for(M=12000;M > 0;M--);
}void delay_nus(u16 us)
{u16 i;u16 M = 0;//720Wfor(i = 0;i < us; i++)for(M=72;M > 0;M--);
}/PA8 SDAPA9 SCL///
void ADS1115_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC ,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;//A SCL SDAGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);SDA_A1;SCL_A1;delay_nms(5);}//I2C总线启动
void I2CStart_A(void)
{SDA_A1;ADS1115_delay(5);SCL_A1;ADS1115_delay(5);SDA_A0;ADS1115_delay(5);//MIN 160nsSCL_A0;ADS1115_delay(5);
}//I2C停止总线
void I2CStop_A(void)
{SDA_A0;ADS1115_delay(5);SCL_A1;ADS1115_delay(5);SDA_A1;ADS1115_delay(5);//MIN 160ns
}//I2C 写一字节
void I2CWriteByte_A(u8 DATA)
{u8 i;SCL_A0;for(i = 0;i < 8; i++){if(DATA&0x80){SDA_A1;}else{SDA_A0;}SCL_A1;//按照手册不需延时ADS1115_delay(5);SCL_A0;ADS1115_delay(5);DATA = DATA << 1; }SDA_A1;SCL_A1;ADS1115_delay(5);SCL_A0;
}//I2C 读一字节
u8 I2CReadByte_A(void)
{u8 TData=0,i;for(i=0;i<8;i++){SCL_A1;ADS1115_delay(5);TData=TData<<1;if(SDA_AI){TData|=0x01;}SCL_A0;ADS1115_delay(5);}SCL_A0;ADS1115_delay(5);SDA_A0;ADS1115_delay(5);SCL_A1;ADS1115_delay(5);SCL_A0;ADS1115_delay(5);SDA_A1;return TData;
}/*********************************************************************
*函数名称: ADS1115Config
*描 述: 设置ADS1115包括通道配置,采样时间等等
*参 数: HCMD :命令字高8位(通道,量程,转换模式)LCMD : 命令字低8位(采样率设置 比较模式 有效电平 信号输出锁存)
*返 回; 无
********************************************************************/
void ADS1115Config_A(u8 LCMD,u8 HCMD)
{u8 i=0;u8 Initdata[4];Initdata[0] = 0x90; // 地址0x90 器件ADR接地 写寄存器Initdata[1] = 0x01;// 配置寄存器Initdata[2] = HCMD; // 配置字高字节Initdata[3] = LCMD; // 配置字低字节SCL_A1;I2CStart_A(); //开启for(i=0;i<4;i++){I2CWriteByte_A(Initdata[i]);ADS1115_delay(10);}I2CStop_A(); //关闭
}void SetThresHold_A(u16 L_TH,u16 H_TH) //高低阀门设置
{SCL_A1;I2CStart_A(); // 开启I2CWriteByte_A(0x90);I2CWriteByte_A(0x02);//最低阀值寄存器I2CWriteByte_A((L_TH>>8));I2CWriteByte_A(L_TH);I2CStop_A(); //关闭I2CStart_A(); //开启I2CWriteByte_A(0x90);I2CWriteByte_A(0x03);//最高阀值寄存器I2CWriteByte_A((H_TH>>8));I2CWriteByte_A(H_TH);I2CStop_A(); //关闭
}/*******************************************************************
*函数名称: ReadAD_A
*描 述: 获取AD转换的值
*参 数: 获取的值为在前面设置的那个通道
*返 回; 无
********************************************************************/
u16 ReadAD_A(void)
{u16 Data[2]={0,0};
//转换指向寄存器SCL_A1;I2CStart_A();I2CWriteByte_A(0x90);I2CWriteByte_A(0x00);I2CStop_A(); I2CStart_A();I2CWriteByte_A(0x91);Data[0] = I2CReadByte_A();Data[1] = I2CReadByte_A();I2CStop_A();Data[0] = Data[0]<<8 | Data[1];return (Data[0]);//&0x7fff
}u16 getad(u8 LCMD,u8 HCMD)
{u16 value=0;ADS1115Config_A(LCMD,HCMD); //配置通道delay_nms(5); // 延时一定时间,防止通道切换互相影响 value=ReadAD_A();return value;
}u16 lvbo(u8 LCMD,u8 HCMD) //求30个值的平均值
{u8 k;u32 U=0, temp; //u32 给够叠加空间 或者float、double亦可 for(k=0;k<30;k++){U+=getad(LCMD,HCMD); }temp=U;U=0;return ((float)temp/30); //带上小数点
}
main.c文件
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "ads1115.h"float aa; int main(void){ float t1; u16 t,result;u8 key;u16 i=0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2delay_init(); uart_init(9600); //串口初始化为9600LED_Init(); //LCD_Init(); KEY_Init(); //IIC初始化 ADS1115_Init();while(1){key=KEY_Scan(0);if(key==WKUP_PRES){ result=lvbo(0xeb,0x82); //A0 A1为差分输入测试端 低八位+高八位1111 1011,1000 0010if(result >= 0x8000 && result <= 0xffff)result = 0xffff - result; //差值为负取绝对值,使得A0 A1正反接都行else if(result >= 0xffff)result = 0;t1=4.096*2*result/65535; //转换成电压printf("量程为4.096V,A0-A1之间电压 = %f V\r\n",t1);//打印if(result == 0x7fff || result == 0x8000){printf("已超量程!\r\n\r\n");}else{printf("读取正常!\r\n\r\n");} }if(key==KEY0_PRES){ result=lvbo(0xe3,0xb2); //A2 A3为差分输入测试端 低八位+高八位 1111 0011,1011 0010if(result >= 0x8000)result = 0xffff - result; //差值为负取绝对值,使得A2 A3正反接都行t1=4.096*2*result/65535; //转换成电压printf("量程为4.096V,A2-A3之间电压 = %f V\r\n",t1); //打印if(result == 0x7fff || result == 0x8000) //超过最大值或者低于最小值{printf("已超量程!\r\n\r\n");}else{printf("读取正常!\r\n\r\n");} } if(key == KEY1_PRES){result=lvbo(0xe3,0xb4); //A2 A3为差分输入测试端 低八位+高八位 1111 0011,1011 0100if((result >= 0x8000) && (result <= 0xffff))result = 0xffff - result; //差值为负取绝对值,使得A0 A1正反接都行else if(result >= 0xffff)result = 0;t1=2.048*2*result/65535; //转换成电压printf("量程为2.048V,A0-A1之间电压 = %f V\r\n",t1);//打印if(result == 0x7fff || result == 0x8000){printf("已超量程!\r\n\r\n");}else{printf("读取正常!\r\n\r\n");}}i++;delay_ms(10);if(i==20){LED0=!LED0;//提示系统正在运行 i=0;} }
}
ADS1115使用及其驱动电路相关推荐
- st7789v tft 驱动电路_图解宁波博信出品的KEEWAY摩托车数字仪表盘,附测绘的电路图...
背景介绍: 摩托车仪表盘是用来显示摩托车运行状态的,比如里程.车速.发动机转速.变速器档位.大灯转向灯各灯状态指示等,作用和汽车仪表盘一样早期摩托车仪表盘显示内容简单,车速等多为机械式,中期已经电子化 ...
- 小型蜂鸣器内部驱动电路
➤01 蜂鸣器内部结构 在博文 DH1766线性三路可编程直流电源 中对于一款经常使用到的有源蜂鸣器测试它的伏安特性.可以看到,它从0.8V开始就能够工作,知道工作电压10V都可以安全工作. 那么它的 ...
- 小型荧光驱动电路实验电路
➤01 荧光灯驱动电路(Electronic Ballast) 在如下两个博文中,对于小型的荧光灯进行的分析: 小功率荧光灯拆解分析 小功率电子镇流荧光灯相关实验 其中驱动电路大都采用 高压小功率三极 ...
- mos管电路_【鼎阳硬件智库原创︱电源】 MOS管驱动电路的设计
吴恒 鼎阳硬件设计与测试智库专家组成员 引 言 对于开关电源来说,驱动电路作为控制电路和功率电路的接口,其作用至关重要,本文就将详细探讨开关电源的驱动电路的参数设计以及驱动芯片的选型. 常用的mos管 ...
- st7789v tft 驱动电路_OLED显示屏,行驱动电路设计,单片机AT89C51与和显示屏的硬件接线...
随着科学技术与电子业技术的不断发展更迭,有机发光二极管如何简易并且有效的实现显示均匀.大面积发光.高亮度高分辨率发光.以及延长有机发光二极管寿命等当前亟需解决的问题,是我们未来要面对的技术挑战.今天小 ...
- 继电器rc吸收电路取值_一文读懂继电器的工作原理以及驱动电路
继电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种"自动开关".故在电路中起 ...
- MOS管驱动电路总结
在使用MOS管设计开关电源或者马达驱动电路的时候,大部分人都会考虑MOS的导通电阻,最大电压等,最大电流等,也有很多人仅仅考虑这些因素.这样的电路也许是可以工作的,但并不是优秀的,作为正式的产品设计也 ...
- 电容降压LED驱动电路
电容降压电路具有体积小.成本低.电流相对稳定等优点,可应用于小功率的LED驱动电路中,本文主要介绍了电容降压电路的基本电路 图一: 电容降压式简易电源的基本原理如图一所示,C3为降压电容器:D4为半波 ...
- 继电器rc吸收电路取值_继电器的工作原理以及驱动电路解析
继电器是具有隔离功能的自动开关元件,广泛应用于遥控.遥测.通讯.自动控制.机电一体化及电力电了设备中,是最重要的控制元件之一.继电器实际上是用较小的电流去控制较大电流的一种"自动开关&quo ...
- stm32驱动_STM32直流电机启动(一)驱动电路的介绍
驱动电路 典型的H桥驱动电路如下: 要使电机旋转只需导通对角线上的两个三极管即可,如导通Q1,Q4,关闭Q2,Q4即可驱动电机正转: 若想电机反向转动,即导通三极管Q2,Q3,关闭Q1,Q4. 此时电 ...
最新文章
- 使用Netty如何做到单机秒级接收35万个对象
- linux升级OpenSSL
- LeetCode 236. 二叉树的最近公共祖先
- 转另一个获取硬盘序列号的方法
- 升级Hbase,解决bug问题
- C++ 堆、栈、自由存储区、全局静态存储区和常量存储区
- LeetCode 1955. 统计特殊子序列的数目
- 什么是WEB?如何学习web
- java web 中Integer.valueof()与integer.parseint()
- 动态规划实战1-leetcode 983.Minimum Cost For Tickets
- java代码转python代码(需要手动调整)
- keil5破解安装包下载及STM32固件包下载
- 看单片机原理图-外部FLASHW25Q64
- Could not instantiate the executor. Make sure a planner module is on the classpath
- 大数据背后的无奈与焦虑:“128元连衣裙”划分矮穷挫与白富美?
- 《MATLAB 神经网络43个案例分析》:第14章 基于SVM的数据分类预测——意大利葡萄酒种类识别
- Java并发指南6:Java内存模型JMM总结
- Attention is all you need 论文精读笔记 Transformer
- 利用编程游戏来学习编程
- 手持SLAM年终杂谈
热门文章
- php后台您没有权限访问该页面,登陆微信公共平台提示没有权限访问该页面请点击返回首页现象的解决办法...
- 实现点击桌面的一个图标打开多个选择画面
- web-页面body添加背景图片
- 【机器学习】网络表征学习、网络嵌入必读论文
- A股市场周内效应研究
- web前端开发工程师的三种级别
- 37.0.概率论与数理统计-常用统计量及其分布,次序统计量,(样本均值,样本方差,样本标准差,样本k阶矩,样本k阶中心矩)
- GeoTools-WKT\GeoJson相互转换
- 如何生成SSH key?
- 第四章软件项目进度管理