STM32驱动PCF8591模块,实现ADDA转换

发布时间:2023-04-03  

模块外观



原理图



PCF8591 模块原理图

模块说明:

  1. 模块所用芯片为 PCF8591T,贴片封装支持 4 路模拟电压采集信号输入(电压输入范围 0--5V)模块带电源指示灯 1 个(D1)模块带 DA 输出指示灯 1 个(D2),当 DA 输出电压达到一定值时,该指示灯亮,电压值越高,指示灯越亮模块集成 1 路 0--5V 电压输入采集(通过蓝白电位器调节输入电压)模块集成 1 路光敏电阻(型号:5537),可以通过 AD 采集环境光线强度模块集成 1 路热敏电阻(型号:MF58),可以通过 AD 采集环境温度

PCF8591 特点:

  1. 单电源供电;正常工作电源电压范围为 2.5V~6V;通过 I2C 总线完成数据的输入 / 输出;器件地址由 3 个地址引脚决定;

由上面的原理图可以看出 A0、A1、A2 与 GND 相连。
  1. 采样频率由 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 转换时序



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


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 函数中调用



成果展示

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


动图封面


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    西门子PLC模拟量输入模块时接收到变动很大的不稳定的值?;可能的原因如下: 1.可能模拟量输入模块和现场传感器分别使用了自供电或隔离的电源,而两个电源没有彼此连接,即模拟量输入模块......
    的逻辑程序要求,例如对于数字量输入信号,应该使用开关量输入模块;对于模拟量输入信号,应该使用模拟量输入模块。   输入信号应该与外部设备匹配:输入信号应该与外部设备匹配,例如传感器和PLC输入模块......
    -20mA,PLC可以通过模拟量输入模块来读取这些信号。模拟量输入模块将模拟信号转换为数字信号,PLC可以读取并进行处理。 2、数字量输入:一些传感器输出的是数字信号,例如开关信号或脉冲信号,PLC可以通过数字量输入模块......
    了该报警,用户需要判断引起通道值超量程的原因:是信号问题还是模块硬件的问题。 图4.模拟量断线报警 6. 为什么使用S7-200 SMART模拟量输入模块时接收到变动很大的不稳定的值?可能的原因如下: (1......
    值超上下限报警是激活的。发生了该报警,用户需要判断引起通道值超量程的原因:是信号问题还是模块硬件的问题。 图4.模拟量断线报警 6. 为什么使用S7-200 SMART模拟量输入模块......
    货号是 6ES7 331-7KF02-OABO,在模数转化上利用传感器或变送器的, 电压或电流取出的值,到 AI 模块上进行转换, 然后把值传给西门子的 CPU 进行处理, 从而检测控制传感器的值,如图 模拟量输入模块......
    -7KF02-OABO,在模数转化上利用传感器或变送器的, 电压或电流取出的值,到 AI 模块上进行转换, 然后把值传给西门子的 CPU 进行处理, 从而检测控制传感器的值,如图   模拟量输入模块 模拟量输入......
    直接与传感器相连,并有很大的灵活性,且安装方便。 1.EM231模拟量输入模块 4AI(电压或电流)输入信号的范围由SW1、SW2和SW3设定。 2.EM232模拟量输出模块 2AO(电压或电流) 3.EM235模拟量混合模块......
    开关、光电开关、压力继电器等过来的开关量输入信号;模拟量输入模块用来接收电位器、测速发电机和各种变送器提供的连续变化的模拟量电流、电压信号。 开关量输出模块用来控制接触器、电磁阀、电磁铁、指示灯、数字......
    。      1. 处理器,PLC的大脑,执行程序并控制输入输出。   2. 电源模块,实现110V/230V AC电源转换,并给PLC上所有功能模块部分供电。   3. 模拟输入模块(AI),接收模拟量输入......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>