[网友问答1]STM32驱动PCF8591模块,实现AD/DA转换
欢迎关注
程序员小哈带你玩转嵌入式,微信搜索:嵌入式从0到1,更多干货等着你。
想进小哈技术交流群,请加程序员小哈个人微信,带你嵌入式入门进阶。
问题原由
粉丝提问,STM32如何驱动PCF8591?
时间赶趟,小哈哥必须安排。
模块外观
原理图
模块说明:
- 模块所用芯片为PCF8591T,贴片封装
- 支持4路模拟电压采集信号输入(电压输入范围0–5V)
- 模块带电源指示灯1个(D1)
- 模块带DA输出指示灯1个(D2),当DA输出电压达到一定值时,该指示灯亮,电压值越高,指示灯越亮
- 模块集成1路0–5V电压输入采集(通过蓝白电位器调节输入电压)
- 模块集成1路光敏电阻(型号:5537),可以通过AD采集环境光线强度
- 模块集成1路热敏电阻(型号:MF58),可以通过AD采集环境温度
PCF8591特点:
- 单电源供电;
- 正常工作电源电压范围为2.5V~6V;
- 通过I2C总线完成数据的输入/输出;
- 器件地址由3个地址引脚决定;
由上面的原理图可以看出A0、A1、A2与GND相连。
- 采样频率由I2C总线传输速率决定;
- 4路模拟量输入可编程为单端输入或差分输入;
- 可配置转换通道号自动增加功能;
- 模拟电压范围为VSS~VDD;
- 片上跟踪保持功能;
- 8位逐次逼近A/D转换;
- 带有一路模拟量输出的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转换相关推荐
- PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)
目录 1.PCF8591的引脚介绍 2.用IIC发送或接收字节 发送的第一个字节 发送的第二个字节 发送第三个字节 3.发送和接收的字节转换 4.全部代码 IIC部分 接收电压数据 发送电压数据 1. ...
- 【STM32训练—WiFi模块】第一篇、STM32驱动ESP8266WiFi模块获取网络时间
目录 第一部分.写在前面 1.硬件准备 2.相关的AT指令 3.参考博客 第二部分.电脑串口助手调试ESP8266模块获取网络时间 1.ESP8266获取时间的流程 2.具体实现步骤 第三部分.STM ...
- 【CubeMX配置STM32驱动超声波模块(HC-SR04)】
CubeMX配置STM32以驱动超声波模块(HC-SR04) 一.CubeMX配置STM32 1.选择定时器 选择输入捕获模式 预分频设置为71,向上计数,自动重装值65535 然后将名字改为ECHO ...
- STM32驱动RC522-RFID模块
简介:STM32F103C8T6驱动RC522-RFID模块源码介绍. 开发平台:KEIL ARM MCU型号:STM32F103C8T6 传感器型号:RC522-RFID 特别提示:驱动内可能使用了 ...
- STM32驱动BH1750模块
模块描述 BH1750FVI是一款用于I2C总线接口的数字环境光传感器IC.该集成电路最适合获取环境光数据,用于调整手机的 LCD和键盘背光功率.可以在高分辨率下检测宽范围(1-65535 lx) 引 ...
- PCF8591模块ad/da转换
A/D转换获取电压值 0x43从滑动变阻器中获得电压 0x41从光敏电阻获得电压 实时电压/51.0 给芯片0~255值控制电压0~5v
- 基础篇010.2 STM32驱动RC522 RFID模块之二:STM32硬件SPI驱动RC522
目录 1. 实验硬件及原理图 1.1 RFID硬件 1.2 硬件原理图 2. 单片机与RFID硬件模块分析 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3. ...
- STM32 驱动 ESP8266 WIFI 模块
目录 1. 模块引脚 2. 测试模块是否正常 3. AT指令 4. ESP8266三种工作模式 5. 配置WIFI模块 6. STM32驱动WIFI模块 拿到一个野火的esp8266模块,驱一下试试 ...
- STM32驱动HC-SR04超声波模块
STM32学习笔记--HC-SR04超声波测距模块 碰巧学校老师要求做个HC-SR04超声波的实验,笔者在完成实验报告的同时,也顺带完成一篇STM32驱动超声波模块记录. HC-SR04模块使用 ST ...
最新文章
- 一个初学者困惑的Oracle的认证问题
- Linux笔记-centos安装elasticsearch7版本
- 9月16日见!vivo高管亲曝NEX 3 5G:99.6%屏占比确认
- php 删除%3ca%3e标签,a和table标签的应用
- Requests方法 -- 参数关联
- Java基础学习总结(88)——线程创建与终止、互斥、通信、本地变量
- Ubuntu上安装rvm
- php jwt payload,php实现jwt
- 关于JavaScript中return的使用情况
- 二叉树的7种遍历算法
- JVM基础知识1---尚硅谷视频笔记整理
- html作业word,Word实验作业——个人简历.doc
- Stellarium:诱人的星相不雅察软件
- 离散数学1-数理逻辑的基本概念
- H3C路由器交换机配置sflow
- PHP PDF内容识别 抓取信息 方法
- c语言资料大全收集,C语言库函数大全(收集资料).pdf
- 百度文库----免费复制
- 小程序上格式化时间后 ios 真机显示 NaN
- 我,28岁,测试员,10月无情被辞:想给还在学测试 的人提个醒......