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

问题原由

粉丝提问,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 //读操作地址

  • 1

  • 2

  • 1

  • 2

控制字

控制字位说明:

  • 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);12341234

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);}

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

输出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;}1234567891011121314151617181920212223242526272812345678910111213141516171819202122232425262728

若要完成一次AD转换,应严格按照时序图进行:开启总线-->发送写操作地址-->等待PCF8591的应答-->发送控制字-->等待PCF8591的应答-->结束总线-->重新开启总线-->发送读操作地址-->等待PCF8591的应答-->读取ADC数据(1字节)-->发送非应答信号-->停止总线

上面IIC_开头的函数都与24C02那个例程中的函数一致,不需要修改。

移植过程

在网文: STM32 I2C通信操作24C02写数据、读数据 的实例代码基础上,完成移植,具体过程如下:

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

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

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

4. main函数中调用

成果展示

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

(0)

相关推荐

  • 总结CAN总线技术基础

    STM32嵌入式开发 STM32嵌入式,PCB电路图,C语言,单片机,Matlab,Linux 8篇原创内容 公众号

  • 杂七杂八的整理——STM32、Proteus使用、UART、IIC、SPI、LIN

    简要介绍两款ARM架构单片机 一. S32K1xx 系列单片机 S32K系列单片机是NXP比较新的车规级单片机,有S32K11x(基于ARM Cortex-M0+)和S32K14x(基于ARM Cor ...

  • 陈玉琴网友问答录完整版【三】

    里程网友问:今年 25 岁,参加工作了,自上高中二年级开始,记忆中当时的 感觉是这样的:夏天的时候学校里上课大家都不出汗,而我只感觉蒸蒸发热那 汗就出来了,往下流尤其是鼻翼部,不一直是,一会一会儿的, ...

  • STM32驱动NRF24L01

    前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. 1. 简介 NRF24L01是 nordic 的无线通信芯片,它具有以下特 ...

  • 电池修复=想来学习网友问答

    由于每天想来学习咨询网友问题基本雷同,所以整理了问答.                1.问:在网上看到你的帖子,写了很多.想学习进入这行,请问怎么收费. 答:原来自己开店.很随心所欲.温饱知足.没打 ...

  • 电瓶修复—电动车电瓶的寿命长短跟充电器有关系吗?(网友问答)

    问:电动车电瓶的寿命长短,跟充电池有没有关系? 答:电动车电瓶的寿命跟充电器是有关系的.电瓶的一个工作循环为充电与放电过程,因此充电过程也是影响电瓶寿命的重要因素. 电动车电瓶的充电电流大小.充电的控 ...

  • 电瓶修复—气温高低影响电池吗?(网友问答)

    最近学员提问,老师老说温度影响电池,能详细点吗? 统一解答下温度的影响.例如,当气温转热,随温度每增加10度,盐化速率呈2倍增长.在充电期间,如外界温度高,当电池的温度达75度时,内阻会增大,致使充电 ...

  • 电瓶修复-快速大电流修复是否可取(网友问答)

    本公众号会不断更新 详细的电瓶修复技术 及分享开店经验 网友提问:李工您好,俺是个外行!老实说比较懒!最近看了您公众号上关于电池修复的想法,其中大电流修复和负脉冲修复可不可以综合考虑?呵呵!利用大电流 ...

  • 充电器如何改浮充电流的问题(网友问答)

    本公众号会不断更新 详细的电瓶修复技术 及分享开店经验 1.对于单组36v电瓶进入浮充电压是41.5v吗?那浮充电流又是多大? 2.不知充电器的浮充电流为多大,因为现在发现在ECPU车上对双电瓶充电到 ...

  • 电瓶修复—欠充电的解决办法(网友问答)

    本公众号会不断更新 详细的电瓶修复技术 及分享各种不同的开店经验 昨日网友向我咨询的问答与大家分享: 问题:近期碰到好几块电池!由于存放时间太长!<欠充电>电压在1V---5V!导致充电不 ...

  • 有同样电池修复问题的进来看看1「网友问答」

    本公众号会不断更新 详细的电瓶修复技术 及分享各种开店经验 问题:李工您好,向您请教.奥特多牌12V4AH胶体免维护摩托车用启动电池,放置一年多,内阻很大,补水后用100V100mA直流充电20小时. ...