资讯详情

【树莓派C语言开发】实验12:PCF8591模数转换器模块

文章目录

  • 前言
  • 1.实验器材
  • 2.实验原理
    • 2.0 元件介绍
    • 2.1 i2c总线
    • 2.2 第一字节
    • 2.3 控制字节
    • 2.4 模块电路
    • 2.5 电路接线
  • 3.程序控制
    • 3.1 打开树莓派I2C
    • 3.2 代码示例
      • 头文件pcf8591.h
    • 3.3 编译代码
    • 3.4 运行结果
  • 结语

前言

由于树莓派不能直接读取模拟信号,我们需要本博客中提到的模数转换器

本篇博客的模数转换器它比以前的模块复杂得多,我们需要一步一步地理解它,才能这个小东西怎么用?

关注这个专栏,和我一起学习树莓派开发板

  • 还在等什么?心不如行动!点我注意

  • 本专栏代码仓库:Raspberry-practice


1.实验器材

IMG_20220421_205650

上:PCF8591模数转换器模块LED


2.实验原理

2.0 元件介绍

PCF8591是单片集成,单独供电,功耗低-bit CMOS数据采集元件。

  • PCF8591有4个模拟输入,1个模拟输出,1个串行I2C总线接口。
  • 它的三个地址引脚A0, A1和A2可用于硬件地址编程,允许多达8个链接I2C无需额外硬件,总线设备。
  • 在PCF通过双线双向输入输出地址、控制和数据信号I2C总线串行传输。

该元件的功能包括,跟踪和维护电影中的功能,8位转换和8位转换。最大转换率I2C决定总线的最大速度。

2.1 i2c总线

i2c总线是由一条简单的双向二线系统同步串行总线。在连接到总线的设备之间传输信息只需要两条线。

  • 关于飞利浦的官员PCF8591详细介绍文档,但是是是英语的。我会上传到gitee仓库与您分享,仓库链接在一开始就被介绍了♂?回到开头

i2c总线系统中的每PCF通过向设备发送有效地址,激活8591设备。地址由固定部分和可编程部分组成。可编程部分必须按地址引脚A0,A1,A2.设置。地址必须邮寄。

在i2c在总线协议中,地址字节的最后一个位置是启动条件后的第一个字节,它设置了以下数据

2.2 第一字节

PCF8591采用典型的I2C总线接口设备的找址方法,即总线地址由设备地址、引脚地址和方向位组成。

飞利浦公司规定A/D设备地址为1001,引脚地址为A2A1A0,其值由用户选择。因此I2C最多可最多可接23个具有I2C总线接口的A/D设备。最后一个地址是方向位R/L,当主控器对A/D写作操作器件为0,读写操作为1。

总线运行时,主控器发送由设备地址、引脚地址和方向组成的地址

2.3 控制字节

发送到PCF8591器件的第二个字节将被存储在并且需要控制器件来实现功能。

  • D1、D0 两位是A/D通道编号:00通道0,01通道1,10通道2,11通道3
  • D2 选择自动增量(0禁止自动增量,1允许自动增量)A/D转换后,通道编号会自动增加。
  • D3 固定值为:0。
  • D5、D4 模拟输入选择:00为四路单端输入,01为三路差输入,10为两路单端和一路差输入,11为两路差输入。
  • D6 能够模拟输出AOUT有效(1为有效,0为无效)。
  • D7 固定值为:0。

以上内容参考@Maker张大哥的博客传送门

模拟输出控制寄存器的高半字节,模拟输入。下半字节选择由上半字节定义的模拟输入通道。如果每次都设置自动添加标志A/D转换后,通道编号会自动增加。

更多关于i2c对于总线的知识,可以查看百度百科的词条。

2.4 模块电路

本实验,AIN0(模拟输入0)端口用于接收的模拟信号,AOUT将模拟信号输出到双色(模拟输出)LED用于改变的模块LED的

如果你注意看电路图,你会发现AOUT上链接一个D4-LED,它还接收模拟输出信号,同时改变亮度

  • 我手头的模块,D2-LED亮度会同步改变,后面会提到

我们可以在实验前做AIN拔下上电位帽

2.5 电路接线

树莓派 T型转接板 PCF8591
SDA SDA SDA
SCL SCL SCL
5V 5V VCC
GND GND GND
双色LED T型转接板 PCF8591
R(中间) * AOUT
GND(-) GND GND
G(S) * *
p>

拍出来的接线图好像有亿点点乱😂

正常接线后,主板上的D1-LED会亮起

我们可以根据原理图利用来连接模数转换器和双色LED,也可以用这种双母头的线直接连接AOUT端口和双色LED的中间管脚

3.程序控制

3.1 在树莓派中开启I2C

通过VNC打开树莓派的桌面,点击开始-首选项-Raspberry Pi Configuration-Interfaces,打开I2C的开关enable

3.2 代码示例

//PCF8591模数转换器
#include <stdio.h>
#include <wiringPi.h>
#include <pcf8591.h>//这个头文件是包含在库中的

#define makerobo_PCF 120 // 基础管脚120

// 主函数
int main ()
{ 
        
	int pcf_value ;// 定义一个变量存储AIN的输入值

	//初始化连接失败时,将消息打印到屏幕
	if(wiringPiSetup() == -1){ 
         
		printf("setup wiringPi failed !");
		return 1; 
	}

	pcf8591Setup (makerobo_PCF, 0x48);
    // 在基本引脚120上设置pcf8591,地址0x48

	while(1)
	{ 
        
		pcf_value = analogRead  (makerobo_PCF + 0);
		// 获取AIN0上的值,插上跳线帽之后,采用的是内部的电位器;
		printf("%d\n", pcf_value);
        // 打印出该值 
		analogWrite (makerobo_PCF + 0, pcf_value); 
        // 控制AOUT输出电平控制LED灯
		delay (10) ; // 延时10ms
	} 
	return 0 ;
}

头文件pcf8591.h

在wiringPi的官方库中,可以查找到关于PCF8591使用的相关函数👉点我


3.3 编译代码

在控制台输入以下指令,编译出可执行文件TEST

gcc -Wall 12pcf8591.c -o TEST -lwiringPi

3.4 运行结果

在运行程序之前,我们需要先把AIN0INPUT0之间的跳线帽装上

随后./TEST运行可执行文件,屏幕上会打印出AIN0管脚上获取的值

但是不管我咋拧模块上的,这个数字都不动

后面发现这个代码必须要在树莓派的OS里面跑,才能实现控制功能,应该和3.1中的I2C总线功能有关


于是在Geany编译器中编译代码,开始执行

拧动白蓝电位计,屏幕上接收到的值会不断变化,同时和主板上的D2-LED红色也会产生变化


结语

本次实验对于我这个模电小白来说就晕乎乎的,虽然查找了一些I2C相关的文档和博客,但还是没太弄明白这个模块的具体原理和进阶使用。

不过通过本次这个简单的控制双色LED的实验,至少我知道了可以通过电位计来调节AOUT值,想必在更复杂的实验中,这个模块可以扮演不一样的角色!

那就只能期待未来我会用到它啦!(我怎么感觉不会呢?)

纯小白,本篇博客可能有很大的纰漏,还请各位大佬无情指正!

标签: ke母头偏脚外螺连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台