Raspberry Pi和I2C在c++中与PCF8591的布线Pi
Raspberry Pi and I2C in c++ with wiringPi for PCF8591
我正在尝试理解I2C总线,用于控制我的Raspberry Pi B+上带有wiringPi C库的PCF8591 D/a转换器。
我写了一个测试代码(用c++编写),运行良好,但我不知道我做这件事的方式是否正确。该程序每0.5秒读取并显示4个模拟输入值,并根据4个输入引脚的平均值设置输出。
#include <iostream>
#include <wiringPi.h>
#include <wiringPiI2C.h>
using namespace std;
int readInput(int fd, int reg)
{
wiringPiI2CReadReg8(fd, reg);
return wiringPiI2CReadReg8(fd, reg);
}
int main()
{
wiringPiSetupGpio();
int dacModule = wiringPiI2CSetup(0x48);
if (dacModule < 0)
{
cout << "I2C Setup Error" << endl;
return 0;
}
int i;
int A[4] = {0, 0, 0, 0};
int A_Reg[4] = {0x40, 0x41, 0x42, 0x43};
while (1)
{
for (i=0;i<4;i++) A[i] = readInput(dacModule, A_Reg[i]);
wiringPiI2CWriteReg8(dacModule, 0x40, (A[0]+A[1]+A[2]+A[3])/4);
cout << endl;
for (i=0;i<4;i++) cout << i << " : " << A[i] << endl;
delay(500);
}
return 0;
}
我的问题是:
- 我注意到我需要调用wiringPiI2CReadReg8函数两次才能读取正确的输入值,为什么?(如果我不这样做,函数将返回以前的输入值)
- 我读到有一个专门为PCF8591制作的wiringPi库的特殊模块(这个),这两种方法(特殊库与通用I2C库)之间有性能差异吗
非常感谢您的帮助/反馈。
要回答您的第一个问题:是的,这很正常。如果您查看数据表(可以在此处找到),您将在第8页的图8中看到,读取操作正在触发新的转换,但将输出上一次转换的结果。因此,如果您想通过一个接一个地"强制"两个连续的读取操作来了解当前转换,则确实需要读取2个字节。下一页第二段也再次提到了这一点。
至于你的第二个问题,我对那个图书馆还没有经验。但是源代码是免费提供的,所以你可以检查你的代码/方法并将其与你在其中找到的进行比较。
我使用C语言为PCF8591编写了以下代码。这根绳子很好用。
#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
/*
cc -o test1 test1.c -lwiringPi
*/
int main (void)
{
int fd;
int i;
int a2dChannel = 0; // analog channel
int a2dVal;
float a2dVol;
float Vref = 3.3;
if ((fd = wiringPiI2CSetup(0x48)) < 0) {
printf("wiringPiI2CSetup failed:n");
}
for(i=0;i<20;i++) {
wiringPiI2CWrite(fd,0x40 | a2dChannel);
a2dVal = wiringPiI2CRead(fd); // Previously byte
a2dVal = wiringPiI2CRead(fd);
a2dVol = a2dVal * Vref / 255;
printf("a2dVal=%dn",a2dVal);
printf("a2dVol=%f[V]n",a2dVol);
sleep(1);
}
}
您可以使用analog Read()。
#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <pcf8591.h>
#define PINBASE 100
/*
cc -o test2 test2.c -lwiringPi
*/
int main (void)
{
int i;
int a2dChannel = 0; // analog channel
int a2dVal;
float a2dVol;
float Vref = 3.3;
if (pcf8591Setup(PINBASE, 0x48) < 0)
{
printf("pcf8591Setup failed:n");
}
for(i=0;i<20;i++) {
a2dVal = analogRead(PINBASE + a2dChannel);
a2dVol = a2dVal * Vref / 255;
printf("a2dVal=%dn",a2dVal);
printf("a2dVol=%f[V]n",a2dVol);
sleep(1);
}
}
相关文章:
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 计算 PI 最多 42 位小数
- 使用莱布尼茨公式的 Pi 近似
- 为什么 std::round(sin(pi/6)) 不等于 1?
- Opencv GStreamer管道在Raspberry Pi 4上不起作用
- Raspberry Pi OpenVG C/C++
- C++数学问题和 5/4*pi 与 5*pi/4
- Raspberry Pi Zero W 上的 OpenCV - 浮点异常
- 从Raspberry Pi / Linux上的Python脚本运行和停止C++程序
- 使 C++ Pi 近似在 GPU Nvidia 970M CUDA 上的 Paralell 中运行
- 仅在 rasperry pi 要求时才在 Arduino 上运行C++
- 在 c++ 或 python 中生成一个体面的视差图以在 Raspberry Pi 上实现的最佳方法(算法或函数)是什么
- 与Qt交叉编译到Raspberry Pi 3B+通讯录(协议缓冲区)-错误符号查找错误
- 为什么OpenCV在Raspberry Pi 3B+上表现不佳
- Get Ip of Rapberry Pi
- C++接线Pi崩溃
- 我想使用 I2C 接收从 arduino 到 raspberry pi 的多个数据
- Qt-QML JIT on Raspberry PI Rev. 1
- 接线Pi的分段错误
- Raspberry Pi和I2C在c++中与PCF8591的布线Pi