(十)IIC总线-PCF8591-ADC/DAC

文章目录

  • IIC总线篇
    • 起始,终止信号
    • 应答信号
    • 发送,读取数据
    • IIC通讯规则
  • PCF8591-ADC-DAC篇
    • 特性
    • 一般说明
    • 地址
    • Control byte(控制字)
    • 简单了解一下DAC电阻分隔链
    • 应用为王
      • DAC的应用
        • 如何设置DAC输出
        • 如何调用DAC功能
      • ADC的应用
        • ADC采集特点
        • ADC读模式
        • 如何设置ADC采集
        • 如何调用ADC功能
      • ADC现象演示
      • DAC现象演示


IIC总线篇

IIC底层驱动资源包

起始,终止信号

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

说人话:在SCL保持高电平的时候。SDA从电平跳变到电平就是起始信号,从电平跳变到电平

void IIC_Start()
{
	sda = 1;
	scl = 1;
	_nop_();
	sda = 0;
	_nop_();
}
void IIC_Stop()
{
	sda = 0;
	scl = 1;
	_nop_();
	sda = 1;
	_nop_();
}

应答信号

在这里插入图片描述

发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。

应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;

应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

char IIC_ACK()
{
	char flag;
	sda = 1;//在时钟脉冲9期间 释放数据线
	_nop_();
	scl = 1;
	_nop_();
	flag = sda;
	_nop_();
	scl = 0;
	_nop_();
	
	return flag;
}

发送,读取数据

在这里插入图片描述
说人话:在SCL为高电平期间数据不可以变化,在SCL为低电平期间数据才可以变化

发送时序:在这里插入图片描述

void IIC_Send_Byte(char dataSend)
{
	int i;
	
	for(i = 0;i<8;i++){
		scl = 0;//scl拉低,让sda做好数据准备
		sda = dataSend & 0x80;//1000 0000获得dataSend的最高位,给sda
		_nop_();//发送数据建立时间
		scl = 1;//scl拉高开始发送
		_nop_();//数据发送时间
		scl = 0;//发送完毕拉低
		_nop_();//
		dataSend = dataSend << 1;
	}
}

读取数据

unsigned char IIC_Read_Byte(char dataRead)
{
	unsigned char dataRead;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;//scl拉高,准备去读数据
		_nop_();//读取时间
		dataRead <<= 1;//读取进来数据
		if(dataRead) //判断读的是1吗?	
			dataRead |= 0x01;
		scl = 0;	//读取完毕 拉低
		_nop_();
	}
	return dataRead;    
}

IIC通讯规则

在这里插入图片描述

在写模式下,通过发送,下一个数据传输的停止条件或开始条件来终止数据传输。
我的理解是:在写完地址,和控制字以后,不必IIC_Stop,可以直接IIC_Start,写其他的指令

PCF8591-ADC-DAC篇

以下内容全部来自芯片数据手册节选 以及 个人理解总结

特性

重点黄色
在这里插入图片描述
说人话:
1.通过I2C总线串行输入/输出
2.地址由3个硬件地址引脚组成
3.采样速率取决于I2C 总线速度
4.4 个模拟输入可编程为单端或差分输入
5.自动增量通道选择
6.模拟电压范围:VSS~VDD

一般说明

在这里插入图片描述
说人话:
1.地址引脚A0、A1和A2
2.允许使用最多8个连接到i2c总线的设备,
3.通过两行双向I2c总线串行传输。
4.该设备的功能包括模拟输入多路复用、片上跟踪和保持功能、8位模数转换和8位数模转换。

地址

在这里插入图片描述
结合CT107D原理图:
在这里插入图片描述
地址 写指令:0x90,读指令:0x91;

地址部分说明:
在这里插入图片描述
说人话:
1.IIC主设备,通过IIC总线必须发送一个有效的地址来激活设备;
2.有效的地址由固定和可编程部分组成;
3.可编程部分必须根据地址引脚A0,A1,A2进行设置;
4.地址指令,必须是启动条件后的第一个字节进行发送
5。地址指令的最后一位也就是(R/W)设置数据传输的方向是读还是写;

Control byte(控制字)

在这里插入图片描述
说人话:
第6位:是否使能DAC,1-开启DAC输出功能 0-不开启
第5,4位:选择ADC输入采取什么样的方式,默认四个单端输入(00)
第3位:ADC通道是否要开启自动增加 1-自动增加 0-不自动增加
第2,1位:选择采集的ADC通道

简单了解一下DAC电阻分隔链

在这里插入图片描述

说人话:通过控制寄存器D7-D0位 进而 控制256个选择开关,达到控制电阻分压,进而输出对应的电压
比如: D7-D1全赋值 1,则就输出5v电压;全赋0,就是输出0v
对应关系就是:0v-5v 对应 0x00-0xff

应用为王

DAC的应用

本身就是一路写到底模式,不必要注意IIC通讯规则

在这里插入图片描述

如何设置DAC输出
void DacOut(u8 val)
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x40);
	I2CWaitAck();	
	I2CSendByte(val);
	I2CWaitAck();	
	I2CStop();
}
如何调用DAC功能
u8 dac_cnt =0 ;
void DacTask()
{
	if(dac_cnt>=102){
		dac_cnt =0 ;
		DacOut(51*3);
	}
}

ADC的应用

ADC采集特点

在这里插入图片描述
说人话:就是开启一次读指令,A/D就一直开始周期性转换了

ADC读模式

要结合博文开头的IIC通讯规则
因为要先写地址,再写控制字,再写地址)
(顺序就是 ADDRESS(写)->contrl word->ADDRESS(读))

个人理解:前面介绍到iic_start后面必须写ADDRESS指令,而我发完control word 必须要再次启动iic_start,才能去写ADDRESS(读),又因为本身就在写模式,再写完control word 不需要iic_stop,直接iic_start即可

注意这里写通道的时候写0x4~(为了和DAC功能同时作用)

步骤:启动->地址(写指令的)->WaitACK->控制字(包含选哪个通道)->WaitAck->再次启动->地址(读指令的)->WaitAck->读数值->发送应答->停止总线

这里测的是电位器通道是0x43,光敏是0x41(为了同时开启ADC和DAC功能,默认使能dac)

如何设置ADC采集
u8 ReadAdc(u8 ch)
{
	u8 tmp ;
	
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(ch);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x91);	
	I2CWaitAck();
	tmp = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	
	return tmp;
}
如何调用ADC功能

连续读取多通道的细节问题(数据实时性问题)
PCF8591
每读出一次,它启动一次转换
转换的结果,在下次,才能读出
所以连续读俩次,第一次空读,数据扔掉

u8 adc_cnt =0 ;
u8 adc_val = 0;
u16 adc_dis = 0;//volt 扩大了 100
u16 adc_dis1 = 0;//lighting 
void AdcTask()
{
	if(adc_cnt>=101){
		adc_cnt = 0;
		ReadAdc(0x43);		//iic总线上读取的数据,是adc
		adc_dis = (u16)(ReadAdc(0x43)*100.f/51);//(寄存器数值)*100.f/51 = x.xx xxx
		ReadAdc(0x41);
		adc_dis1 = ReadAdc(0x41);		
	}
}

ADC现象演示

(十)IIC总线-PCF8591-ADC/DAC

DAC现象演示

自行用电压表测量



----- 如有错误欢迎大家批评指正!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【群晖NAS】记一次FRP报错:login to server failed: connection write timeout

报错如下&#xff1a; rongfuDS224plus:~/fff/frp$ ./frpc -c ./frpc.toml 2024/01/12 23:08:31 [I] [root.go:139] start frpc service for config file [./frpc.toml] 2024/01/12 23:08:41 [W] [service.go:131] login to server failed: i/o deadline reached 2024/01/12 2…

Java中的栈和队列操作,相互实现(力扣 232, 225)

栈和队列&#xff08;Java&#xff09; Java中的 栈 & 队列 操作栈的使用队列的使用 LeetCode 232. 用栈实现队列我的代码 LeetCode 225. 用队列实现栈我的代码 Java中的 栈 & 队列 操作 栈的使用 栈的方法功能Stack()构造一个空的栈E push(E e)将e入栈&#xff0c;并…

缓存学习实战篇

缓存练习题&#xff08;用户查询操作&#xff09; public List<ShopType> queryAllType() throws JsonProcessingException {//从缓存中查数据String shopTypeJson stringRedisTemplate.opsForValue().get("cache:shopType");//如果缓存命中&#xff0c;if (S…

基于stm32f4的蓝牙控制小车

1. 引言 蓝牙的创始人是瑞典爱立信公司&#xff0c;蓝牙技术是一种无限数据与语音通信的开放性全球规范&#xff0c;它以低成本的近距离无线连接为基础&#xff0c;为固定与移动设备通信环境建立一个特别连接。手机之间通过蓝牙实现数据共享成为常理&#xff0c;将手机变为遥…

【前后端的那些事】前后端环境搭建+树形结构表格实现

文章目录 1. 前后端项目环境搭建2. table-tree2.1 后端准备2.2 前端准备 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能&#xff0c;想写文章&#xff0c;录视频把这些内容记录下。但这些功能太零碎&#xff0c;如果为每个功能都单独搭建一个项目&#xff0…

NAND SCA接口对性能影响有多大?

在多LUN场景下&#xff0c;SCA接口尤其有助于提高随机读取性能。通过合理安排读取命令和等待时间&#xff08;如tR&#xff09;&#xff0c;SCA接口可以在一个LUN完成读取后立即开始另一个LUN的读取操作&#xff0c;而无需等待整个DQ总线空闲&#xff0c;从而减少了延迟和提高了…

选中图层为什么不能建立3D模型---模大狮模型网

在Photoshop CC 2021(也就是PS6)中&#xff0c;要将选中的图层转换为3D模型&#xff0c;需要满足以下几个条件&#xff1a; 图层类型支持&#xff1a;只有特定类型的图层可以被转换为3D模型。通常&#xff0c;普通的像素图层、矢量图层和形状图层都可以进行转换。但是&#xff…

网络层协议及IP编址与IP路由基础华为ICT网络赛道

目录 4.网络层协议及IP编址 4.1.网络层协议 4.2.IPv4地址介绍 4.3.子网划分 4.4.ICMP协议 4.5.IPv4地址配置及基本应用 5.IP路由基础 5.1.路由概述 5.2.静态路由 5.3.动态路由 5.4.路由高阶特性 4.网络层协议及IP编址 4.1.网络层协议 IPv4(Internet Protocol Versi…

Tomcat性能优化学习

Tomcat 服务器是一个开源的轻量级Web应用服务器&#xff0c;在中小型系统和并发量小的场合下被普遍使用&#xff0c;是开发和调试Servlet、JSP 程序的首选。相信大家对于 Tomcat 已经是非常熟悉了&#xff0c;本篇将介绍tomcat的常见优化。那么为什么要对tomcat进行优化呢。因为…

大数据毕业设计:房屋数据分析可视化系统 预测算法 可视化 商品房数据 Flask框架(源码+讲解视频)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

从vue小白到高手,从一个内容管理网站开始实战开发第八天,登录功能后台功能设计--业务逻辑层基础接口和基础服务实现

上一篇我们介绍了项目后续要使用到的工具类,关于工具类的创建可以查看 从vue小白到高手,从一个内容管理网站开始实战开发第七天,登录功能后台功能设计--通用分页、枚举以及相关工具类-CSDN博客文章浏览阅读2次。本次内容主要介绍了项目后续用到的部分工具类,这些工具类,在…

HDFS WebHDFS 读写文件分析及HTTP Chunk Transfer Coding相关问题探究

文章目录 前言需要回答的问题DataNode端基于Netty的WebHDFS Service的实现 基于重定向的文件写入流程写入一个大文件时WebHDFS和Hadoop Native的块分布差异 基于重定向的数据读取流程尝试读取一个小文件尝试读取一个大文件 读写过程中的Chunk Transfer-Encoding支持写文件使用C…

Java多线程:初识多线程!左手画方,右手画圆

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、线程与进程二、创建线程方法1、继承Thread类2、实现Runnable接口3、两者区别4、举个栗子5、简洁写法Ⅰ、Thread匿名内部类写…

Django(七)

Django(六) 4.编辑用户 点击编辑&#xff0c;跳转到编辑页面&#xff08;将编辑行的ID携带过去&#xff09;。编辑页面&#xff08;默认数据&#xff0c;根据ID获取并设置到页面中&#xff09;提交&#xff1a; 错误提示数据校验在数据库更新 user_edit.html {% exte…

php 字符串常用函数

目录 1.一些常用函数 2.代码示例 1.一些常用函数 函数名描述trim()删除字符串两端空行或其它预定义符rtrim()删除字符串右边空行或其它预定义符ltrim()删除字符串左边空行或其它预定义符dirname()返回路径中的目录部分str_split()把字符串分割到数组里explode()使用一个字符串…

2024,传统鞋服的“高端梦”该醒了

文 | 螳螂观察 作者 | 图霖 “一千块都不要的波司登&#xff0c;宝贝们还不冲吗&#xff1f;” 入夜&#xff0c;一位身着羽绒服的美女主播在灯火通明的直播间正声嘶力竭地反复呐喊。 一群不知是托还是真实消费者的用户在评论区敲出自己的身高体重&#xff0c;想从主播那得…

给定n个字符串s[1...n], 求有多少个数对(i, j), 满足i < j 且 s[i] + s[j] == s[j] + s[i]?

题目 思路&#xff1a; 对于字符串a&#xff0c;b, (a.size() < b.size()), 考虑对字符串b满足什么条件&#xff1a; 由1、3可知a是b的前后缀&#xff0c;由2知b有一个周期是3&#xff0c;即a.size()&#xff0c;所以b是用多个a拼接而成的&#xff0c;有因为a是b的前后缀&…

基于Java SSM框架实现雁门关风景区宣传网站项目【项目源码】计算机毕业设计

基于java的SSM框架实现雁门关风景区宣传网站演示 Java技术 Java技术它是一个容易让人学会和使用的一门服务器语言。它在编程的过程当中只需要很少的知识就能建立起一个真正的交互站点。对于这个教程来说它并不需要你完全去了解这种语言&#xff0c;只要能快速融入web站点就可以…

基于博弈树的开源五子棋AI教程[3 极大极小搜索]

基于博弈树的开源五子棋AI教程[3 极大极小搜索] 引子极大极小搜索原理alpha-beta剪枝负极大搜索尾记 引子 极大极小搜索是博弈树搜索中最常用的算法&#xff0c;广泛应用于各类零和游戏中&#xff0c;例如象棋&#xff0c;围棋等棋类游戏。算法思想也是合乎人类的思考逻辑的&a…

【100个 Unity实用技能】☀️ | UGUI中 判断屏幕中某个坐标点的位置是否在指定UI区域内

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…