电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
[网友问答1]STM32驱动PCF8591模块,实现AD/DA转换
分 享
扫描二维码分享
[网友问答1]STM32驱动PCF8591模块,实现AD/DA转换
PCF8591
嵌入式从0到1
关注
发布时间: 2020-12-14
丨
阅读: 4994
### 问题原由 粉丝提问,`STM32如何驱动PCF8591?`时间赶趟,小哈哥必须安排。 ![](https://img-blog.csdnimg.cn/20201213222629200.png) ### 模块外观 ![](https://img-blog.csdnimg.cn/20201213222652181.png) ### 原理图 ![PCF8591模块原理图](https://img-blog.csdnimg.cn/202012132227293.png) ##### 模块说明: 1. 模块所用芯片为PCF8591T,贴片封装 2. 支持4路模拟电压采集信号输入(电压输入范围0--5V) 3. 模块带电源指示灯1个(D1) 4. 模块带DA输出指示灯1个(D2),当DA输出电压达到一定值时,该指示灯亮,电压值越高,指示灯越亮 5. 模块集成1路0--5V电压输入采集(通过蓝白电位器调节输入电压) 6. 模块集成1路光敏电阻(型号:5537),可以通过AD采集环境光线强度 7. 模块集成1路热敏电阻(型号:MF58),可以通过AD采集环境温度 ##### PCF8591特点: 1. 单电源供电; 2. 正常工作电源电压范围为2.5V~6V; 3. 通过I2C总线完成数据的输入/输出; 4. 器件地址由3个地址引脚决定; > 由上面的原理图可以看出A0、A1、A2与GND相连。 5. 采样频率由I2C总线传输速率决定; 6. 4路模拟量输入可编程为单端输入或差分输入; 7. 可配置转换通道号自动增加功能; 8. 模拟电压范围为VSS~VDD; 9. 片上跟踪保持功能; 10. 8位逐次逼近A/D转换; 11. 带有一路模拟量输出的D/A转换。 ### 接线说明: #### 模块输入引脚 | **PCF8591模块** | **含义** | **STM32核心板** | | :---: | :---: | :---: | | SDA | IIC数据接口 | U3R PB11 | | SCL | IIC时钟接口 | U3T PB10 | | VCC | 电源正 | 3V3 | | GND | 电源负 | GND | ![接线示意图](https://img-blog.csdnimg.cn/20201213222824239.png) #### 实际连接图 ![硬件连接](https://img-blog.csdnimg.cn/20201213222906149.png) #### 模块输出调试引脚 | **PCF8591模块** | **含义** | | :---: | :---: | | AOUT | 模块DA输出端口 | | AIN3 | 模拟输入信号接口3 | | AIN2 | 模拟输入信号接口2 | | AIN1 | 模拟输入信号接口1 | | AIN0 | 模拟输入信号接口0 | | GND | 模块的GND | | INPUT2 | 已连接至热敏电阻信号输入口 | | INPUT1 | 已连接至光敏电阻信号输入口 | | INPUT0 | 已连接至电位器信号输入口 | #### 跳线帽使用说明 * AIN0与INPUT0 连接跳线帽时,选择电位器接入电路 * AIN1与INPUT1 连接跳线帽时,选择光敏电阻接入电路 * AIN2与INPUT2 连接跳线帽时,选择热敏电阻接入电路 * 需要外接模拟信号输入时,请断开跳线帽,将该模拟信号接入AIN0----AIN3 ### 芯片手册 #### 地址 ![](https://img-blog.csdnimg.cn/20201213223129962.png) 从模块原理图得知A0,A1,A2接地,所以模块的地址为:1001**000**X,那么其地址就是0x90或者是0x91,看是读还是写来决定。 最后一位,当是0时,表示下一个字节往总线上写数据; 当是1时,表示下一个字节从总线上读取数据。 ```C #define PCF8591Addr 0x90 //写操作地址 PCF8591Addr|0x01 //读操作地址 ``` ### 控制字 ![](https://img-blog.csdnimg.cn/20201213223215882.png) 控制字位说明: * bit0-bit1:AD转换通道选择,当值为00时,为AIN0; * bit2:自动增量使能 * bit4-bit5:单端输入/差分输入选择,00为单端输入 * bit6:为1时为允许模拟电压输出 假设我需要从通道0单端获得A/D转换数据,那么control byte就是01000000 = 0x40 。 所以我们获取四个通道ADC值的函数如下调用: ```C adcData[0] = PCF8591_ADC_Input(0x90 ,0x40); adcData[1] = PCF8591_ADC_Input(0x90 ,0x41); adcData[2] = PCF8591_ADC_Input(0x90 ,0x42); adcData[3] = PCF8591_ADC_Input(0x90 ,0x43); ``` ### D/A转换时序 ![D/A转换时序图](https://img-blog.csdnimg.cn/20201213223322892.png) 具体实现代码如下: ```C u8 PCF8591_DAC_Output(unsigned char WriteAddr,unsigned char c, unsigned char Val) { IIC_Start(); //启动总线 IIC_Send_Byte(WriteAddr); //发送写操作地址 IIC_Wait_Ack(); IIC_Send_Byte(c); //发送控制字 IIC_Wait_Ack(); IIC_Send_Byte(Val); //发送DAC的数值 IIC_Wait_Ack(); IIC_Stop(); //结束总线 return(1); } ``` 输出DAC的值参考下面换算关系计算: ![](https://img-blog.csdnimg.cn/20201213223359410.png) 简单理解就是,发送的DAC数值`IIC_Send_Byte(Val);` ,将Vref分成 0xFF 份,Vagnd 对应第一份;Vref对应最后一份。 ### A/D转换时序 ![A/D转换时序图](https://img-blog.csdnimg.cn/20201213223419996.png) ```C u8 PCF8591_ADC_Input(unsigned char WriteAddr,unsigned char Channel) { u8 temp=0; IIC_Start(); //启动总线 IIC_Send_Byte(WriteAddr); //发送写操作地址 IIC_Wait_Ack(); IIC_Send_Byte(Channel); //写入控制字 IIC_Wait_Ack(); IIC_Stop(); //结束此次写操作,结束总线 IIC_Start(); IIC_Send_Byte(WriteAddr|0x01); //发送读操作地址 IIC_Wait_Ack(); temp=IIC_Read_Byte(0); // IIC_Stop(); //结束总线 return temp; } ``` 若要完成一次AD转换,应严格按照时序图进行:`开启总线-->发送写操作地址-->等待PCF8591的应答-->发送控制字-->等待PCF8591的应答-->结束总线-->重新开启总线-->发送读操作地址-->等待PCF8591的应答-->读取ADC数据(1字节)-->发送非应答信号-->停止总线`。 上面`IIC_`开头的函数都与24C02那个例程中的函数一致,不需要修改。 ### 移植过程 在网文: [**STM32 I2C通信操作24C02写数据、读数据**](https://mp.weixin.qq.com/s/auHhDe4w3mYT0xkfQv0b1g) 的实例代码基础上,完成移植,具体过程如下: #### 1. 将驱动文件拷贝到自己工程中HARDWARE目录下 ![](https://img-blog.csdnimg.cn/20201213223546699.png) #### 2. 添加驱动文件所在文件夹至工程中 ![](https://img-blog.csdnimg.cn/20201213223556828.png) #### 3. 添加.c文件至工程中 ![](https://img-blog.csdnimg.cn/20201213223609418.png) #### 4. main函数中调用 ![](https://img-blog.csdnimg.cn/20201213223624115.png) ### 成果展示 先旋转电位器,然后用手遮挡光敏电阻,串口助手中具体现象如下: ![](https://img-blog.csdnimg.cn/20201213223639407.gif) ### 资料获取 微信公众号后台回复“**PCF8591**”,可以下载工程源码。 ### 推荐阅读 之前分享过的涉及I2C总线的内容: [**STM32 I2C通信操作24C02写数据、读数据**](https://mp.weixin.qq.com/s/auHhDe4w3mYT0xkfQv0b1g) [**基于鸿蒙OS移植OLED驱动程序**](https://mp.weixin.qq.com/s/2hFGroOpdtXznXLyuJlJfQ) [**基于鸿蒙系统的家庭燃气报警器**](https://mp.weixin.qq.com/s/s4tgAuhZJrx968m42XIMRw) ### 欢迎关注 程序员小哈带你玩转嵌入式,微信搜索:**嵌入式从0到1**,更多干货等着你。 想进小哈技术交流群,请加程序员小哈个人微信,带你嵌入式入门进阶。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
嵌入式从0到1
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交