【树莓派】实验 12-PCF8591 模数转换器
前言
由于树莓派不能直接读取模拟信号,所以我们需要本篇博客中提到的模数转换器来替代实现读取模拟信号的功能。
本篇博客的这个模数转换器比之前的模块复杂很多,我们需要一步一步弄明白它的原理,才能真正理解如何使用这个小东西
关注本专栏,和我一起学习树莓派开发板 30 + 经典实验!
C 语言代码,0 基础剖析!
还等什么😍心动不如行动!👉点我关注
本专栏代码仓库📝:Raspberry-practice
1. 实验器材
- 树莓派开发板
- 40p 软排线 + T 型转接板 + 面包板
- 双色 LED 模块(元老级朋友)
- PCF8591 模数转换器模块
- 一些跳线
- 一字或者十字螺丝刀🛠
上:PCF8591 模数转换器模块;下:双色 LED
2. 实验原理
2.0 元件介绍
PCF8591 是一个单片集成、单独供电、低功耗、8-bit CMOS 数据采集元件。
- PCF8591 具有 4 个模拟输入、1 个模拟输出和 1 个串行 I2C 总线接口。
- 它的 3 个地址引脚 A0, A1 和 A2 可用于硬件地址编程,从而允许使用多达 8 个链接到 I2C 总线的设备,而无需额外的硬件。
- 在 PCF8591 器件上输入输出的地址、控制和数据信号都是通过双线双向 I2C 总线以串行的方式进行传输。
该元件的功能包括模拟输入多路复用,片上跟踪和保持功能,8 位模数转换和 8 位数模转换。最大转换率由 I2C 总线的最大速度决定。
2.1 i2c 总线
i2c 总线是由飞利浦公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
- 飞利浦官方有一个关于
PCF8591
的详细介绍文档,不过它是英语的。我会上传到 gitee 仓库里面分享给大家,仓库链接在开头介绍过了🤦♂️回到开头
i2c 总线系统中的每个 PCF8591 设备通过向该设备发送有效地址而被激活。地址由固定部分和可编程部分组成。可编程部分必须按照地址引脚 A0,A1,A2 进行设置。地址必须以邮寄方式发送。
在 i2c 总线协议中,在启动条件之后的第一个字节,地址字节的最后一个位是读 / 写位,它设置了下列数据传输的方向。
2.2 第一字节
PCF8591 采用典型的 I2C 总线接口器件寻址方法,即总线地址由器件地址、引脚地址和方向位组成。
飞利浦公司规定 A/D 器件地址为 1001,引脚地址为 A2A1A0,其值由用户选择。因此 I2C 系统中最多可接 2^3^ 个具有 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) | * | * |
拍出来的接线图好像有亿点点乱😂
正常接线后,主板上的 D1-LED
会亮起
我们可以根据原理图利用 T 型转接板来连接模数转换器和双色 LED,也可以用这种双母头的线直接连接
AOUT
端口和双色 LED 的中间管脚
3. 程序控制
3.1 在树莓派中开启 I2C
通过 VNC 打开树莓派的桌面,点击开始-首选项-Raspberry Pi Configuration-Interfaces
,打开 I2C 的开关 enable
3.2 代码示例
1 | //PCF8591模数转换器 |
头文件 <pcf8591.h>
在 wiringPi 的官方库中,可以查找到关于 PCF8591
使用的相关函数👉点我
3.3 编译代码
在控制台输入以下指令,编译出可执行文件 TEST
1 | gcc -Wall 12pcf8591.c -o TEST -lwiringPi |
3.4 运行结果
在运行程序之前,我们需要先把 AIN0
和 INPUT0
之间的跳线帽装上
随后./TEST
运行可执行文件,屏幕上会打印出 AIN0
管脚上获取的值
但是不管我咋拧模块上的白蓝电位计,这个数字都不动
后面发现这个代码必须要在树莓派的 OS 里面跑,才能实现控制功能,应该和 3.1
中的 I2C 总线功能有关
于是在 Geany 编译器中编译代码,开始执行
拧动白蓝电位计,屏幕上接收到的值会不断变化,同时 LED 小灯和主板上的 D2-LED
红色亮度也会产生变化
结语
本次实验对于我这个模电小白来说就晕乎乎的,虽然查找了一些 I2C
相关的文档和博客,但还是没太弄明白这个模块的具体原理和进阶使用。
不过通过本次这个简单的控制双色 LED 的实验,至少我知道了可以通过电位计来调节 AOUT
值,想必在更复杂的实验中,这个模块可以扮演不一样的角色!
那就只能期待未来我会用到它啦!(我怎么感觉不会呢?)
纯小白,本篇博客可能有很大的纰漏,还请各位大佬无情指正!
- 最新
- 最热
- 最早
- 作者
点击重新获取 | 打开控制台