一、树莓派启动I2C
-
使用: ls /dev/命令可以查看I2C设备是启动。
-
如果没有启动执行
sudo raspi-config
选择interfacing Options->I2C->yes
启动i2c内核驱动。
- 使用
sudo i2cdetect -y -a 1
命令可以查看是否配置好。因为我的I2c连接了数模转换器PCF8591 ADC,所以显示的48地址,同理,如果拔了这个设备就会显示:
二、AD转换
2.1 转换模块介绍
PCF8591是一个8位模数转换器或8位数模转换器模块,这意味着每个引脚可以读取高达256的模拟值。它还具有板上提供的LDR和热敏电阻电路。该模块有四个模拟输入和一个模拟输出。它适用于I2C通信,因此SCL和SDA引脚用于串行时钟和串行数据地址。它需要2.5-6V电源电压并具有低待机电流。我们还可以通过调节模块上电位器的旋钮来控制输入电压。板上还有三个跳线。 J4连接选择热敏电阻接入电路,J5连接选择LDR /光电阻接入电路和J6连接选择可调电压接入电路。要访问这些电路,您必须使用这些跳线的地址:J6为0x50,J5为0x60,J4为0x70。电路板上有两个LED,D1和D2 - D1表示输出电压强度,D2表示电源电压强度。输出或电源电压越高,LED D1或D2的强度越高。
2.2 实现代码
#include <wiringPi.h>
#include <pcf8591.h>
#include <stdio.h>
#include <time.h>
//PCF8591默认的I2C设备地址
#define Address 0x48
//模拟信号输入端的地址
#define BASE 0x40
#define A0 0x40
#define A1 0x41
#define A2 0x42
#define A3 0x43
//供电(mV)
#define POWER 5000
//函数声明
void ShowTime();
float AD_work(unsigned char channel);
int main(void)
{
//初始化wiringPi设置
wiringPiSetup();
//设置pcf8591的器件地址
pcf8591Setup(BASE, Address);
float AD_val;
while (1)
{
AD_val=AD_work(A0);//读取A0端口的电压值
ShowTime(); //打印当前时间
printf("A0 value: %fmV\n", AD_val); //打印A0引脚的输入电压
//printf("asgydasg");
delay(100);
}
}
//显示系统时间
void ShowTime()
{
time_t t;
struct tm *p;
int hour = 0, min = 0, sec = 0;
time(&t);
p = gmtime(&t);
hour = 8 + p->tm_hour; //获取当地时间,与UTC时间相差8小时
min = p->tm_min;
sec = p->tm_sec;
printf("\nNow time: %.2d:%.2d:%.2d\n", hour, min, sec);
}
float AD_work(unsigned char channel)
{
float AD_val; //定义处理后的数值AD_val为浮点数
unsigned char i;
for (i = 0; i < 10; i++)
AD_val += analogRead(channel); //转换10次求平均值(提高精度)
AD_val /= 10;
AD_val = (AD_val * POWER)/ 255 ; //AD的参考电压是单片机上的5v,所以乘5即为实际电压值
return AD_val;
}
编译命令
gcc -adc.c -o adc -Wall -lwiringPi
2.3 结果显示
2.3.1 GPIO口
2.3.2 连接示意图
将pcf8591的SCL和SDA连接至树莓派的SCL和SDA,AIN0接入模拟信号,相当于图示中的A0口。
2.3.3 结果显示
输入5V,显示结果正常
输入3.3V,输出一致
在监播机上的实际测量效果,测量信号强度电压,1.008MHz,调制度90%。将D4上端输入到pcf8591的AIN0端,GND接到监播机的PP5上端。测量结果显示,显示的数据与实际相差甚微。
信号强度(dBm) | 显示电压(mV) | 万用表电压(v) |
---|---|---|
-40 | 4443.15 | 4.43 |
-45 | 4336.13 | 4.33 |
-50 | 4217.60 | 4.21 |
-55 | 4066.65 | 4.06 |