用树莓派和ads1115采样模拟量 保姆级教程
1.背景
树莓派很好,美中不足的是,不能进行ADC转换,所以要选一个外接的ADC芯片来进行模拟量转换。正好,我要设计的产品里需要用到ADC,所以,我就设计了一个用ads1115进行ADC转换,将结果发送到树莓派的电路和程序,下面是保姆级教程。
2. 为什么用ads1115这个ADC转换芯片?
因为wiringPi库自带了驱动程序,直接拿来用就可以了,很方便,所以,我就选了这颗。
3. 电路图
4. 代码
#include <ads1115.h>
#include <stdio.h>
#include <unistd.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>
#define ADC_ADDRESS 0x48
#define PINBASE 120 // choose PINBASE value arbitrarily
int main()
{
int ret = TRUE;
int analog0;
// int analog1;
// int analog2;
// int analog3;
float vbat = 0.0;
int ioerr = wiringPiSetupGpio();
if (ioerr == -1)
{
printf("wiringPiSetupGpio() error\n");
return FALSE;
}
ret = ads1115Setup(PINBASE, ADC_ADDRESS);
if (ret == FALSE)
{
printf("ads1115Setup() error\n");
return FALSE;
}
while(1)
{
analog0 = analogRead(PINBASE+0); // connected to ads1115 AIN0
printf("analog0 = %d\n", analog0);
vbat = analog0 * 4.096 / 0x7FFF*(169+9.31)/9.31;
printf("vbat = %.2f\n", vbat);
// analog1 = analogRead(PINBASE+1); // connected to ads1115 AIN1
// printf("analog1 = %d\n", analog1);
// analog2 = analogRead(PINBASE+2); // connected to ads1115 AIN2
// printf("analog2 = %d\n", analog2);
// analog3 = analogRead(PINBASE+3); // connected to ads1115 AIN3
// printf("analog3 = %d\n", analog3);
delay(250); // sample rate 250ms
}
return 0;
}
5. 结果检验
测出来的电池电压很准,比我上次设计的用STM32的ADC采样的电池电压要准得多。
6. 大功告成,亲个嘴儿。