立即注册 找回密码

微雪课堂

搜索
微雪课堂 树莓派 树莓派入门教程 查看内容

树莓派系列教程17:PCF8591 AD/DA

2015-9-2 09:48| 发布者: MyMX1213| 查看: 26680| 评论: 3|原作者: MyMX1213

摘要: 树莓派本身没有AD/DA功能,如果树莓派外接模拟传感器,则必须外接AD/DA功能扩展板才能用。Pioneer600扩展带有AD/DA芯片PCF8591,pcf8591带1通道8位DA,4通道8位AD,通过I2C控制。 ... ... ... ... ... ... ... ... ... ...
  • 树莓派本身没有AD/DA功能,如果树莓派外接模拟传感器,则必须外接AD/DA功能扩展板才能用。Pioneer 600扩展带有AD/DA芯片PCF8591,pcf8591带1通道8位DA,4通道8位AD,通过I2C控制。

一、DAC

1、bcm2835程序

cpp代码:

#include <bcm2835.h>  
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)  
{  
    char Buf[]={0,0};
    unsigned char value=0;

    if (!bcm2835_init())return 1;  
    bcm2835_i2c_begin(); 
    bcm2835_i2c_setSlaveAddress(0x48);  
    bcm2835_i2c_set_baudrate(10000);  
    printf("start..........\n"); 

    while(1)  
    {  
        Buf[0] = 0x40;
        Buf[1] = value++;
        bcm2835_i2c_write(Buf,2);
        printf("AOUT: %d\n",value);

        bcm2835_delay(20);  
    }  

    bcm2835_i2c_end();  
    bcm2835_close();  
    return 0;  
}

编译并执行

gcc -Wall pcf8591.c -o pcf8591 -lbcm2835
sudo ./pcf8591

2、Python程序

#!/usr/bin/python
# -*- coding:utf-8 -*-
import smbus
import time

address = 0x48
cmd = 0x40
value = 0 

bus = smbus.SMBus(1)
while True:
    bus.write_byte_data(address,cmd,value)
    value += 1
    if value == 256:
        value =0
    print("AOUT:%3d" %value)
    time.sleep(0.01)

执行程序

sudo python pcf8591.py

3、wiringPi程序

cpp代码:

#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)
{
    unsigned char value;
    wiringPiSetup();
    pcf8591Setup(BASE,Address);

    while(1)
    {   
        analogWrite(A0,value);
        printf("AOUT: %d\n",value++);
        delay(20);
    }   
}

编译并执行程序

gcc –Wall pcf8591.c –o pcf8591 –lbcm2835 -lwiringPi
sudo ./pcf8591

二、ADC

1、bcm2835程序

cpp代码:

#include <bcm2835.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)  
{  
    char Buf[]={0};
    unsigned char i;

    if (!bcm2835_init())return 1;  
    bcm2835_i2c_begin(); 
    bcm2835_i2c_setSlaveAddress(0x48);  
    bcm2835_i2c_set_baudrate(10000);  
    printf("start..........\n"); 

    while(1)  
    {   
        for(i = 0;i < 4;i++)
        {   
            Buf[0] = i;  
            bcm2835_i2c_write_read_rs(Buf,1,Buf,1);  
            bcm2835_i2c_read (Buf,1);
            printf("AIN%d:%5.2f  ",i,(double)Buf[0]*3.3/255);
        }   
        printf("\n");
        bcm2835_delay(100);  
    }   

    bcm2835_i2c_end();  
    bcm2835_close();  
    return 0;  
}

编译并执行

gcc -Wall pcf8591.c -o pcf8591 -lbcm2835

sudo ./pcf8591

2、Python程序


#!/usr/bin/python
# -*- coding:utf-8 -*-
import smbus
import time

address = 0x48
A0 = 0x40
A1 = 0x41
A2 = 0x42
A3 = 0x43
bus = smbus.SMBus(1)
while True:
    bus.write_byte(address,A0)  
    value = bus.read_byte(address)
    print("AOUT:%1.3f  " %(value*3.3/255))
    time.sleep(0.1)

执行程序

sudo python pcf8591.py

3、wiringPi程序

cpp代码:


#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("Analoge: %dmv\n",value*3300/255);
        delay(1000);
    }   
}

编译并执行程序

gcc -Wall pcf8591.c -o pcf8591 -lwiringPi

sudo ./pcf8591

572

顶一下

刚表态过的朋友 (572 人)

相关阅读

发表评论

最新评论

引用 游客 2017-2-28 10:33
: 这些程序得和楼主的硬件板子配套吧。
这个教程是根据Pioneer 600扩展板写的。但是不只是用在这个板子上。
引用 游客 2017-2-27 09:34
这些程序得和楼主的硬件板子配套吧。
引用 游客 2016-9-3 17:16
不错

查看全部评论(3)

基础入门
OpenCV
littleGL

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2024-3-19 17:57 , Processed in 0.026325 second(s), 21 queries .

返回顶部