利用PCF8591进行AD转换

上学期用过这款芯片,主要还是IIC的应用……
原理的话没有太多时间深究了,主要还是应用

芯片引脚图

在这里插入图片描述
AN0~AN3为模拟量输入(可以选择输入方式)
A0~A2为硬件地址引脚,用来编码地址
AOUT应该为模拟量输出(DA转换)
SCL、SDA即为IIC通信时的总线引脚

设备地址

在这里插入图片描述
高四位为固定的编码,用来标识PCF8591,第四位就是硬件引脚+读写位

控制字

在这里插入图片描述
第6位:控制模拟量输出使能
第5和4位:模拟量输入的方式
第2位:自动增量使能,每次A/D 转换后通道号将自动增加
第1和0位:模拟输入的通道选择
在这里插入图片描述
根据原理图可以确定硬件设备地址

AD转换的操作

分别来看写和读的时序
写:
在这里插入图片描述
读:
在这里插入图片描述
若要完成一次AD转换,应严格按照时序图进行:
开启总线-----发送地址+写-----发送控制字节-----等待PCF8591响应-----停止总线-----重新启动总线-----发送地址+读------读取数据-----主机发送非应答信号-----停止总线

利用之前的IIC总线的驱动完成PCF8591的AD转换

//读取AD转换后得到的值
void Read_PCF8591()
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x03);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	signal=IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
}

切记:每一次发送完数据都要调用等待应答函数,否则读数将出现问题!(之前一直显示127,后来发现发完读命令后忘记等待应答了……)
还有就是延时函数要调整,把宏定义改为25!

Reference
https://www.cnblogs.com/whik/p/6650955.html
https://blog.csdn.net/ohy3686/article/details/86721281

  • 5
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值