树莓派 pcf8591 AD转换模块使用

简介: PCF8591 是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个行I2C总线接口。3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。器件的地址、控制和数据通过两线双向I2C总线传输。器件功能包括多路复用模拟输入、片上跟踪和保持功能、8位模数转换和8位数模拟转换。最大转换速率取决于I2C 总线的最高速率。

树莓派 pcf8591 AD转换模块使用

因为 项目需要因此要使用 PCF8591

网络异常,图片无法展示
|

网络异常,图片无法展示
|

1.准备工具

树莓派pi一个。pcf8591一个。模拟量传感器一个(我这用 热敏电阻当温度计使用)。

2.原理。

PCF8591 是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个行I2C总线接口。

3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C总线而不需要额外硬件。

器件的地址、控制和数据通过两线双向I2C总线传输。器件功能包括多路复用模拟输入、片上跟踪和保持功能、


想知道 如何同时使用两片pcf8591 请点击

引脚定义:

本模块左边和右边分别外扩2路排针接口,分别说明如下:

左边 AOUT 芯片DA输出接口

AINO 芯片模拟输入接口0  我在使用的时候接的时A0,接的是光敏传感器的AO口;

AIN1 芯片模拟输入接口1

AIN2 芯片模拟输入接口2

AIN3 芯片模拟输入接口3

右边 SCL  IIC时钟接口  接树莓派的scl口

SDA  IIC数字接口  接树莓派的sda口

GND  模块地       外接地

VCC  电源接口     外接3.3v-5v   我用的是3.3

我用的是pcf8591模块。包含了热敏和光敏电阻。

模块共有3个红色短路帽,分别作用如下:

P4   接上P4短路帽,选择热敏电阻接入电路

P5   接上P5短路帽,选择光敏电阻接入电路

P6   接上P6短路帽,选择0-5V可调电压接入电路

模块为下图。

下面为芯片引脚定义。

(1)、AD的位数:表明这个AD共有2^n个刻度,8位AD,输出的刻度是0~255.  8591就是8为精度的,因此它digtalRead的数据在0-255之间。

(2)、分辨率:就是AD能够分辨的最小的模拟量变化,假设5.10V的系统用8位的AD采样,那么它能分辨的最小电压就是5.10/255=0.02V。

AD转换的原理简单来理解就是通过电路将非电信号转为电信号,然后通过一个基准电压(PCF8591的基准电压是5V),然后判断这个这个电信号的电压高低,然后得到一个0-255(8位精度)的比值。

具体实现:

程序在进行 A/D 读取数据的时候,共使用了两条程序去读了 2 个字节:I2CReadACK(); val = I2CReadNAK(); PCF8591 的转换时钟是 I2C 的 SCL,8 个SCL 周期完成一次转换,所以当前的转换结果总是在下一个字节的 8 个 SCL 上才能读出,因此我们这里第一条语句的作用是产生一个整体的 SCL 时钟提供给 PCF8591 进行 A/D 转换,第二次是读取当前的转换结果。如果我们只使用第二条语句的话,每次读到的都是上一次的转换结果。

控制字节的第 0 位和第 1 位就是通道选择位了,00、01、10、11 代表了从 0 到 3 的一共4 个通道选择。

先连接好线

网络异常,图片无法展示
|

网络异常,图片无法展示
|

在树莓派上开启SPI和I2C

网络异常,图片无法展示
|

python 实现

创建 ac.py

编辑代码如下

#!/usr/bin//env python
# -*- coding:utf-8 -*-
import smbus   
import time
address = 0x48 ## address  ---> 器件的地址(硬件地址 由器件决定)
A0 = 0x40      ##  A0    ----> 器件某个端口的地址(数据存储的寄存器)
A1 = 0x41
A2 = 0x42
A3 = 0x43
bus = smbus.SMBus(1) ## 开启总线
while True: ##循环查询
    bus.write_byte(address,A2)  ## 告诉树莓派 你想获取那个器件的那个端口的数据
    value = 143-bus.read_byte(address) ## 获得数据
    print("当前温度:%1.0f  ℃ " %(value)) ##打印数据
    time.sleep(1) ##延迟1秒

然后测试 输入python./ac.py

网络异常,图片无法展示
|

如何同时使用多片 I2C  设备 :[同时使用两片I2C同型号设备时地址怎样设置 (如何更改器件地址)_Five-菜鸟级的博客-CSDN博客_i2c从设备地址相同](https://blog.csdn.net/qq_41923622/article/details/86104132 "同时使用两片I2C同型号设备时地址怎样设置 (如何更改器件地址))

树莓派上使用WiringPI的操作步骤。

一。安装wiringPi

这里给出官方做法:

If you do not have GIT installed, then under any of the Debian releases (e.g. Raspbian), you can install it with:

$ sudo apt-get install git-core

If you get any errors here, make sure your Pi is up to date with the latest versions of Raspbian: (this is a good idea to do regularly, anyway)

sudo apt-get update\ sudo apt-get upgrade

To obtain WiringPi using GIT:

cd\ git clone git://git.drogon.net/wiringPi

If you have already used the clone operation for the first time, then

cd ~/wiringPi\ git pull origin

Will fetch an updated version then you can re-run the build script below.

To build/install there is a new simplified script:

cd ~/wiringPi\ ./build

The new build script will compile and install it all for you – it does use the sudo command at one point, so you may wish to inspect the script before running it.

安装之后如果使用gpio -v,出现以下内容即可。

附上GPIO 引脚图

然后打开i2c

sudo raspi-config

选择8 Advanced Options,打开SPI和I2C,然后会提示重启。重启完之后。

安装i2c工具sudo apt-get install i2c-tools

然后运行i2cdetect -l

但是我在这一步出现了一个问题,就是在输入上述指令后什么都没有出现,也已经确定了spi和i2c开启。经过查资料找到的解决方法是。

sudo cat /sys/module/i2c_bcm2708/parameters/baudrate  改了波特率 100000  //但我并不知道这是不是关键点。

sudo nano /etc/modules

添加以下两行内容:

i2c-bcm2708

i2c-dev

sudo nano /etc/modprobe.d/raspi-blacklist.conf

到这两行:

blacklist spi-bcm2708

blacklist i2c-bcm2708

将他们删掉,然后保存退出,并重启树莓派!

发现问题解决了。

然后i2cdetect -y 1,发现一个48,而0x48就是我的pcf8591的I2C地址。这个后面需要使用。

代码

ad.c

#include <wiringPi.h>
#include <pcf8591.h>
#include <stdio.h>
#define Address 0x48
#define BASE 64
#define A0 BASE+0
#define A1 BASE+1
#define A2 BASE+2
#define A3 BASE+3
int main(void)
{
    int value;
    wiringPiSetup();
    pcf8591Setup(BASE,Address);
        while(1)
        {
            value=analogRead(A0);
            printf("value: %d\n",value);
            delay(20);
        }
}
目录
相关文章
|
编解码
STM32:ADC单通道(内含:1.实物图/接线图+2.代码部分如下+3.AD用到的库函数总结)
STM32:ADC单通道(内含:1.实物图/接线图+2.代码部分如下+3.AD用到的库函数总结)
447 0
STM32:ADC单通道(内含:1.实物图/接线图+2.代码部分如下+3.AD用到的库函数总结)
|
传感器
STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)(下)
STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)(下)
561 0
|
7月前
|
数据采集 API
LabVIEW为NI-DAQmx设备创建任务
LabVIEW为NI-DAQmx设备创建任务
116 1
|
7月前
|
Linux Windows
imx6ull开发板之qt应用编程读取AP3216c(光照,距离)数据。
imx6ull开发板之qt应用编程读取AP3216c(光照,距离)数据。
117 0
|
7月前
|
传感器
imx6ull开发板i2c应用编程读取AP3216c传感器数据
imx6ull开发板i2c应用编程读取AP3216c传感器数据
98 0
【Magisk模块】HC优化4.22 [重置]代号DC
【Magisk模块】HC优化4.22 [重置]代号DC
163 0
【Magisk模块】HC优化4.22 [重置]代号DC
|
编解码
STM32F103C8 AD单通道
STM32F103C8 AD单通道
98 0
STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)(上)
STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)
235 0
BOSHIDA AC/DC开关电源模块遥控开关操作
模块电源的遥控开关操作,是通过 REM 端进行的。一般控制方式有两种:
|
芯片 内存技术
LabVIEW实现ST-Link自动烧录单片机
在讲解LabVIEW实现ST-Link自动烧录之前先聊一聊ST官方提供一款专用的Flash烧录工具:ST-Link utility。