欢迎关注

程序员小哈带你玩转嵌入式,微信搜索:嵌入式从0到1,更多干货等着你。

想进小哈技术交流群,请加程序员小哈个人微信,带你嵌入式入门进阶。

问题原由

粉丝提问,STM32如何驱动PCF8591?时间赶趟,小哈哥必须安排。

模块外观

原理图

模块说明:
  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相连。

  1. 采样频率由I2C总线传输速率决定;
  2. 4路模拟量输入可编程为单端输入或差分输入;
  3. 可配置转换通道号自动增加功能;
  4. 模拟电压范围为VSS~VDD;
  5. 片上跟踪保持功能;
  6. 8位逐次逼近A/D转换;
  7. 带有一路模拟量输出的D/A转换。

接线说明:

模块输入引脚

PCF8591模块 含义 STM32核心板
SDA IIC数据接口 U3R PB11
SCL IIC时钟接口 U3T PB10
VCC 电源正 3V3
GND 电源负 GND

实际连接图

模块输出调试引脚

PCF8591模块 含义
AOUT 模块DA输出端口
AIN3 模拟输入信号接口3
AIN2 模拟输入信号接口2
AIN1 模拟输入信号接口1
AIN0 模拟输入信号接口0
GND 模块的GND
INPUT2 已连接至热敏电阻信号输入口
INPUT1 已连接至光敏电阻信号输入口
INPUT0 已连接至电位器信号输入口

跳线帽使用说明

  • AIN0与INPUT0 连接跳线帽时,选择电位器接入电路
  • AIN1与INPUT1 连接跳线帽时,选择光敏电阻接入电路
  • AIN2与INPUT2 连接跳线帽时,选择热敏电阻接入电路
  • 需要外接模拟信号输入时,请断开跳线帽,将该模拟信号接入AIN0----AIN3

芯片手册

地址

从模块原理图得知A0,A1,A2接地,所以模块的地址为:1001000X,那么其地址就是0x90或者是0x91,看是读还是写来决定。

最后一位,当是0时,表示下一个字节往总线上写数据;
当是1时,表示下一个字节从总线上读取数据。

#define PCF8591Addr 0x90        //写操作地址
PCF8591Addr|0x01                  //读操作地址

控制字


控制字位说明:

  • bit0-bit1:AD转换通道选择,当值为00时,为AIN0;
  • bit2:自动增量使能
  • bit4-bit5:单端输入/差分输入选择,00为单端输入
  • bit6:为1时为允许模拟电压输出

假设我需要从通道0单端获得A/D转换数据,那么control byte就是01000000 = 0x40 。

所以我们获取四个通道ADC值的函数如下调用:

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转换时序

具体实现代码如下:

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的值参考下面换算关系计算:

简单理解就是,发送的DAC数值IIC_Send_Byte(Val); ,将Vref分成 0xFF 份,Vagnd 对应第一份;Vref对应最后一份。

A/D转换时序

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写数据、读数据 的实例代码基础上,完成移植,具体过程如下:

1. 将驱动文件拷贝到自己工程中HARDWARE目录下

2. 添加驱动文件所在文件夹至工程中

3. 添加.c文件至工程中

4. main函数中调用

成果展示

先旋转电位器,然后用手遮挡光敏电阻,串口助手中具体现象如下:

资料获取

微信公众号后台回复“PCF8591”,可以下载工程源码。

推荐阅读

之前分享过的涉及I2C总线的内容:

STM32 I2C通信操作24C02写数据、读数据

基于鸿蒙OS移植OLED驱动程序

基于鸿蒙系统的家庭燃气报警器

[网友问答1]STM32驱动PCF8591模块,实现AD/DA转换相关推荐

  1. PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)

    目录 1.PCF8591的引脚介绍 2.用IIC发送或接收字节 发送的第一个字节 发送的第二个字节 发送第三个字节 3.发送和接收的字节转换 4.全部代码 IIC部分 接收电压数据 发送电压数据 1. ...

  2. 【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间

    目录 第一部分.写在前面 1.硬件准备 2.相关的AT指令 3.参考博客 第二部分.电脑串口助手调试ESP8266模块获取网络时间 1.ESP8266获取时间的流程 2.具体实现步骤 第三部分.STM ...

  3. 【CubeMX配置STM32驱动超声波模块(HC-SR04)】

    CubeMX配置STM32以驱动超声波模块(HC-SR04) 一.CubeMX配置STM32 1.选择定时器 选择输入捕获模式 预分频设置为71,向上计数,自动重装值65535 然后将名字改为ECHO ...

  4. STM32驱动RC522-RFID模块

    简介:STM32F103C8T6驱动RC522-RFID模块源码介绍. 开发平台:KEIL ARM MCU型号:STM32F103C8T6 传感器型号:RC522-RFID 特别提示:驱动内可能使用了 ...

  5. STM32驱动BH1750模块

    模块描述 BH1750FVI是一款用于I2C总线接口的数字环境光传感器IC.该集成电路最适合获取环境光数据,用于调整手机的 LCD和键盘背光功率.可以在高分辨率下检测宽范围(1-65535 lx) 引 ...

  6. PCF8591模块ad/da转换

    A/D转换获取电压值 0x43从滑动变阻器中获得电压 0x41从光敏电阻获得电压 实时电压/51.0 给芯片0~255值控制电压0~5v

  7. 基础篇010.2 STM32驱动RC522 RFID模块之二:STM32硬件SPI驱动RC522

    目录 1. 实验硬件及原理图 1.1 RFID硬件 1.2 硬件原理图 2. 单片机与RFID硬件模块分析 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3. ...

  8. STM32 驱动 ESP8266 WIFI 模块

    目录 1. 模块引脚 2. 测试模块是否正常 3. AT指令 ​4. ESP8266三种工作模式 5. 配置WIFI模块 6. STM32驱动WIFI模块 拿到一个野火的esp8266模块,驱一下试试 ...

  9. STM32驱动HC-SR04超声波模块

    STM32学习笔记--HC-SR04超声波测距模块 碰巧学校老师要求做个HC-SR04超声波的实验,笔者在完成实验报告的同时,也顺带完成一篇STM32驱动超声波模块记录. HC-SR04模块使用 ST ...

最新文章

  1. 一个初学者困惑的Oracle的认证问题
  2. Linux笔记-centos安装elasticsearch7版本
  3. 9月16日见!vivo高管亲曝NEX 3 5G:99.6%屏占比确认
  4. php 删除%3ca%3e标签,a和table标签的应用
  5. Requests方法 -- 参数关联
  6. Java基础学习总结(88)——线程创建与终止、互斥、通信、本地变量
  7. Ubuntu上安装rvm
  8. php jwt payload,php实现jwt
  9. 关于JavaScript中return的使用情况
  10. 二叉树的7种遍历算法
  11. JVM基础知识1---尚硅谷视频笔记整理
  12. html作业word,Word实验作业——个人简历.doc
  13. Stellarium:诱人的星相不雅察软件
  14. 离散数学1-数理逻辑的基本概念
  15. H3C路由器交换机配置sflow
  16. PHP PDF内容识别 抓取信息 方法
  17. c语言资料大全收集,C语言库函数大全(收集资料).pdf
  18. 百度文库----免费复制
  19. 小程序上格式化时间后 ios 真机显示 NaN
  20. 我,28岁,测试员,10月无情被辞:想给还在学测试 的人提个醒......

热门文章

  1. 淘宝/天猫如何获取sku API接口,item_sku - 获取sku详细信息
  2. FMDB数据库简单使用
  3. 共模扼流圈的工作原理与作用以及特点和应用详解
  4. python 如何爬取王者荣耀全英雄皮肤
  5. 第29届奥运会中国代表团夺金榜
  6. grid布局浏览器兼容_CSS Grid 网格布局教程
  7. 1-给出n阶方阵里所有数,求方阵里所有数的和(华为机试)
  8. 物料编码主文件------(整理)
  9. wireshark网络分析器的学习使用
  10. 无线网络传输问题:隐藏节点和暴露节点