樹莓派 pcf8591 AD轉換模塊使用


~~ 如果有什么問題可以在我的個人博客留言 ,我會及時回復。歡迎來訪交流 ~~


                                         樹莓派 pcf8591 AD轉換模塊使用

 

因為 項目需要因此要使用 PCF8591 

 

 

 

 

1.准備工具

樹莓派pi一個。pcf8591一個。模擬量傳感器一個(我這用 熱敏電阻當溫度計使用)。

2.原理。

PCF8591 是單片、單電源低功耗8位CMOS數據采集器件,具有4個模擬輸入、一個輸出和一個行I2C總線接口。

3個地址引腳A0、A1和A2用於編程硬件地址,允許將最多8個器件連接至I2C總線而不需要額外硬件。

器件的地址、控制和數據通過兩線雙向I2C總線傳輸。器件功能包括多路復用模擬輸入、片上跟蹤和保持功能、

8位模數轉換和8位數模擬轉換。最大轉換速率取決於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  設備 :https://blog.csdn.net/qq_41923622/article/details/86104132

 

 

樹莓派上使用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);
        }
}


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM