基于蓝桥杯的单片机模块练习——PCF8591芯片

基于蓝桥杯的单片机模块练习——PCF8591芯片

相关知识点

1.特点
(1)8位模数和数模转换器
(2)通过IIC总线的串行输入/输出
(3)模拟电压范围从VSS到VDD
(4)8位逐次逼近模数转换
2.总体描述
在这里插入图片描述
PCF8591是一款单芯片、单电源、低功耗、8位CMOS数据采集设备,具有四个模拟输入、一个模拟输出和一个串行I2C总线接口。三个地址引脚A0、A1和A2用于对硬件地址进行编程,允许使用多达八个连接到I2C总线的设备,而无需额外的硬件。进出设备的地址、控制和数据通过双线双向I2C总线串行传输。该器件的功能包括模拟输入多路复用、片内采样保持功能、8位模数转换和8位数模转换。最大转化率由I2C总线的最大速度给出。

3.设备寻址
I2C总线系统中的每个PCF8591设备都是通过向设备发送有效地址来激活的。地址由固定部分和可编程部分组成。可编程部分必须根据地址引脚A0、A1和A2进行设置。在I2C总线协议中,地址总是作为起始条件后的第一个字节发送。地址字节的最后一位是读/写位,它设置了后续数据传输的方向。
在这里插入图片描述
4.控制字节
在这里插入图片描述
发送到PCF8591设备的第二个字节将存储在其控制寄存器中,并且是控制设备功能所必需的。控制寄存器的高半字节用于使能模拟输出,并将模拟输入编程为单端或差分输入。低半字节选择由高半字节定义的模拟输入通道之一。
如果设置了自动递增标志,通道号在每次模数转换后自动递增。如果在使用内部振荡器的应用中需要自动递增模式,则应设置控制字节(位6)中的模拟输出使能标志。这允许内部振荡器连续运行,从而防止振荡器启动延迟导致的转换错误。模拟输出使能标志可以在其他时间复位,以降低静态功耗。对不存在的输入频道的选择导致分配最高的可用频道号。因此,如果设置了自动递增标志,下一个选定的通道将始终是通道0。
两个半字节的最高有效位都为将来的功能保留,必须设置为逻辑0。在上电复位条件后,控制寄存器的所有位都复位到逻辑0。为了省电,数模转换器和振荡器被禁用。模拟输出切换到高阻抗状态。
5.D/A输出
发送到PCF8591器件的第三个字节存储在数模转换器数据寄存器中,并使用片内数模转换器转换为相应的模拟电压。
模拟输出电压由自动归零单位增益放大器缓冲。该缓冲放大器可以通过设置控制寄存器的模拟输出使能标志来开启或关闭。在激活状态下,输出电压保持不变,直到发送另一个数据字节。
提供给模拟输出AOUT的输出电压:在这里插入图片描述

数模转换序列:在这里插入图片描述
写模式、数模转换的总线协议:在这里插入图片描述

 void Send_AOUT(unsigned char value)
{

	IIC_Start(); 
	IIC_SendByte(0x90);
	IIC_WaitAck();
  IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(value);
	IIC_WaitAck();
	IIC_Stop(); 
	
}
Send_AOUT(V * 5.1);//V是希望输出的电压*10;比如输出2.3V,那么就V = 23;

■这两个图我没理解明白,有没有大佬能在评论区解释一下,抱拳了

6.A/D输入
模数转换周期总是在向PCF8591设备发送有效的读取模式地址后开始。模数转换周期在确认时钟脉冲的后沿触发,并在传输前一次转换的结果时执行。
是不是就是说我们现在读到的电压是上一次转换的结果???
在这里插入图片描述

一旦触发转换周期,所选通道的输入电压样本就会存储在芯片上,并转换为相应的8位二进制代码。
单端输入的模数转换特性:在这里插入图片描述
转换结果存储在模数转换器数据寄存器中,等待传输。如果设置了自动递增标志,则选择下一个频道。
没明白这句话:一个读取周期中传输的第一个字节包含前一个读取周期的转换结果代码。通电复位后,读取的第一个字节是十六进制80。

读取模式、模数转换的总线协议:
在这里插入图片描述

unsigned int Receive_AIN(unsigned char CH)
{
	unsigned char dat;
	unsigned int dat_u;
	IIC_Start(); 
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(CH);
	IIC_WaitAck();
	
	IIC_Start();
  IIC_SendByte(0x91);
	IIC_WaitAck();
	dat = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop(); 

	dat_u = (dat * 100) / 51;//之所以dat*100,是为了把电压值扩大100倍,方便显示2位小数
	//dat_u = (dat * 500) / 255;  //最大2.42V
	return dat_u;
  	
}
**//如果读取光敏电阻的分压最好间隔一定时间来读,例如用定时器每500ms读取一次**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ღ 金龍戲水 ღ

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值