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. 大功告成,亲个嘴儿。 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐