使用ADS1115扩展ROC-RK3568-PC开发板ADC功能

描述

通过ROC-RK3568-PC的官方资料,可以了解到,这块板子,本身带有ADC接口,具体信息如下:

 

电子发烧友

 

不过也了解到,板子本身提供的ADC接口,最大检测电压范围是1.8V,所以在实际使用中,会有所局限。

 

刚好,我手头有一个ADS1115 ADC模块,相当的不错,某宝某店家介绍如下:

 

电子发烧友

 

电子发烧友

 

不吹不擂,这个ADS1115 ADC模块,那是相当的好用。

 

一共提供了4个输入通道,16bit的,精细度很高。

 

既然好用,那就要上咱们ROC-RK3568-PC开发板试一试。

 

 

一、硬件连线

ADS1115 ADC模块是一个I2C模块,根据开发板的资料,找到具体的I2C在GPIO扩展接口上的位置:

 

电子发烧友

 

板子上,GPIO扩展接口提供了多组I2C接口,选用I2C1即可。

 

电子发烧友

 

ADS1115模块接线如下:

 

电子发烧友

 

最终实物连线后如下:

 

电子发烧友

 

在上图中,使用了一块迷你 IoT电源,用于提供不同的电压,方便进行实际测试。电源要和开发板共地,然后,+连接到ADS1115的AIN0~3任一接口,上述图中接在AIN0。

 

 

二、检测I2C连接是否正常

使用sudo i2cdetect -r -y 1命令检查连接:

 

电子发烧友

 

上图中,48即为ADS1115的I2C地址0x48。如果没有出现,仔细检查接线是否正确。因为GPIO扩展接口是2.0的,我手头的线都是2.54的,所以5V和GND接到了别的位置,免得挤得太紧。

 

 

三、编写程序

Adafruit为ADS1115提供了开发库:adafruit/Adafruit_ADS1X15: Driver for TI's ADS1015: 12-bit Differential or Single-Ended ADC with PGA and Comparator (github.com)

 

不过,该扩展库,主要是给Arduino提供的,在咱们板子上,不能直接使用。

 

于是fork后,添加了Linux环境支持,已经发布到github:HonestQiao/Adafruit_ADS1X15: Driver for TI's ADS1015: 12-bit Differential or Single-Ended ADC with PGA and Comparator (github.com)

 

另外,还有Python版本的,是给CircuitPython提供的,有时间我也会fork一下,再提供Linux支持。

 

上面我修改后的库,下载后,结构如下:

 

电子发烧友

 

测试代码具体如下:

#include "../../Adafruit_ADS1X15.h"


Adafruit_ADS1115 ads(); /* Use this for the 16-bit version */
// Adafruit_ADS1015 ads;     /* Use this for the 12-bit version */


void setup(void) {
  printf("Getting single-ended readings from AIN0..3");
  printf("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");


  if (!ads.begin(0x48, 1)) {
    // Serial.println("Failed to initialize ADS.");
    printf("Failed to initialize ADS.");
    while (1)
      ;
  }
}


void loop(void) {
  int16_t adc0, adc1, adc2, adc3;
  float volts0, volts1, volts2, volts3;


  adc0 = ads.readADC_SingleEnded(0);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);


  volts0 = ads.computeVolts(adc0);
  volts1 = ads.computeVolts(adc1);
  volts2 = ads.computeVolts(adc2);
  volts3 = ads.computeVolts(adc3);
  printf("-----------------------------------------------------------
");
  printf("AIN0: %d %f V
", adc0, volts0);
  printf("AIN0: %d %f V
", adc1, volts1);
  printf("AIN0: %d %f V
", adc2, volts2);
  printf("AIN0: %d %f V
", adc3, volts3);


  delay(1000);
}


int main(int argc, char *argv[]) {
  setup();
  while (true) {
    loop();
  }
}

(左右移动查看全部内容)

 

上述代码中,关键调用如下:

  • 实例化ADS1115对象:Adafruit_ADS1115 ads* 开启设备I2C通信:ads.begin(0x48, 1),两个参数,一个为ADS1115的地址0x48,一个为/dec/i2c-1的序号1

  • 读取数据:ads.readADC_SingleEnded(0),表示读取通道0的数据,也就是A0;可用通道为0~3

  • 电压转换:ads.computeVolts(adc0);表示转换adc0的数据到实际的电压值

 

 

四、编译运行

编写好代码,保存后,使用下面的步骤编译运行:

# 编译
gcc -o singleended singleended.cpp ../../Adafruit_ADS1X15.cpp


# 查看编译结果:aarch64
file singleended
singleended: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=be3e02ae2223c4431de1bdb70c6f942f9016d8fa, for GNU/Linux 3.7.0, not stripped


# 运行编译后的程序
./singleended

(左右移动查看全部内容)

 

 

五、实际运行结果

当IoT电源没有输出的时候,结果如下:

 

电子发烧友

 

电子发烧友

 

打开IoT电源输出,设定为4.2V,结果如下:

 

电子发烧友

 

电子发烧友

 

电子发烧友

 

可以看出,电压的测量,精度还是很高的。

 

 

六、总结

使用ADS1115模块,可以很方便的为 ROC-RK3568-PC开发板 扩展ADC功能,后续不管是接入按键,还是其他的模拟传感器等,都会非常的方便。

 

更多热点文章阅读

  • 玩嗨OpenHarmony:基于OpenHarmony的智能助老服务机器人
  • 玩嗨OpenHarmony:基于OpenHarmony的智慧农业环境监控系统
  • HarmonyOS 3.1版本发布,全面进入声明式开发
  • OpenHarmony开发之MQTT讲解
  • OpenHarmony集成OCR三方库实现文字提取

 

 

提示:本文由电子发烧友社区发布,转载请注明以上来源。如需社区合作及入群交流,请添加微信EEFans0806,或者发邮箱liuyong@huaqiu.com。


原文标题:使用ADS1115扩展ROC-RK3568-PC开发板ADC功能

文章出处:【微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分