文章目录
- 前言
- 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.实验器材
- 树莓派开发板
- 40p软排线 T型转接板 面包板
- 双色LED模块(老朋友)
- PCF模块模块8591模块转换器
- 一些跳线
- 一字或十字??
上: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) | * | * |
拍出来的接线图好像有亿点点乱😂
正常接线后,主板上的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 运行结果
在运行程序之前,我们需要先把AIN0
和INPUT0
之间的跳线帽装上
随后./TEST
运行可执行文件,屏幕上会打印出AIN0
管脚上获取的值
但是不管我咋拧模块上的,这个数字都不动
后面发现这个代码必须要在树莓派的OS里面跑,才能实现控制功能,应该和3.1
中的I2C总线功能有关
于是在Geany编译器中编译代码,开始执行
拧动白蓝电位计,屏幕上接收到的值会不断变化,同时和主板上的D2-LED
红色也会产生变化
结语
本次实验对于我这个模电小白来说就晕乎乎的,虽然查找了一些I2C
相关的文档和博客,但还是没太弄明白这个模块的具体原理和进阶使用。
不过通过本次这个简单的控制双色LED的实验,至少我知道了可以通过电位计来调节AOUT
值,想必在更复杂的实验中,这个模块可以扮演不一样的角色!
那就只能期待未来我会用到它啦!(我怎么感觉不会呢?)
纯小白,本篇博客可能有很大的纰漏,还请各位大佬无情指正!