(三十一)树莓派3B+获取ADS1115 ADC转换的数据

Posted 小猿猪哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(三十一)树莓派3B+获取ADS1115 ADC转换的数据相关的知识,希望对你有一定的参考价值。

好久没写东西了,最近事情也比较多,但是有时间还是在继续玩树莓派了。最近玩的是ADS1115模块。顺便把之前的代码都整理了一下。

ADS1115是TI出的一个16位ADC模数转换芯片。

这个是芯片的结构图,从这个图可以看出使用上是比较简单的一个芯片了。实际使用中发现也不难。但是和之前使用的ADXL345、MPU6050等IIC接口的芯片又有一些细小的差异。先看下面这个图:

写操作是先往Pointer Register寄存器写0x01,表示接下来的是写操作,再写入对应的配置数据;

读操作是先往Pointer Register寄存器写0x00,表示接下来的是读操作,然后就可以直接读取出来ADC转换的数据了,高位在前,低位在后。

这个芯片的寄存器都是没寄存器地址的。这也是为什么我说和之前操作的IIC芯片不一样的。

剩下的操作就比较简单了,对着芯片的数据手册操作即可。

驱动代码index.js

// 引入 i2c-bus
let i2c = require('i2c-bus');
// gpio i2cdetect
const ADS1115 = 
  SLAVE_ADDRESS: 0x48,                   // 设备地址  本地记录
  START_CONVERSION: 0b1000000000000000,  // 开始转换  连续转换模式
  address: 0x48,                         // 用户传入的设备地址
  i2cbus_num: 1,                         // IIC通道号
  bus: null,                             // IIC通信对象
  MUX:                                  // 通道选择  
    '0+1':   0b0000000000000000,
    '0+3':   0b0001000000000000,
    '1+3':   0b0010000000000000,
    '2+3':   0b0011000000000000,
    '0+GND': 0b0100000000000000,
    '1+GND': 0b0101000000000000,
    '2+GND': 0b0110000000000000,
    '3+GND': 0b0111000000000000,
  ,
  PGA:                                  // 增益放大器                 
    '2/3': 0b0000000000000000,           // +/- 6.144V  1bit = 3mV
    '1':   0b0000001000000000,           // +/- 4.096V  1bit = 2mV
    '2':   0b0000010000000000,           // +/- 2.048V  1bit = 1mV
    '4':   0b0000011000000000,           // +/- 1.024V  1bit = 0.5mV
    '8':   0b0000100000000000,           // +/- 0.512V  1bit = 0.25mV
    '16':  0b0000101000000000,           // +/- 0.256V  1bit = 0.0125mV
  ,
  DR:                                   // 数据速率
    '8SPS':   0b0000000000000000,        // 8SPS
    '16SPS':  0b0000000000100000,        // 16SPS
    '32SPS':  0b0000000001000000,        // 32SPS
    '64SPS':  0b0000000001100000,        // 64SPS
    '128SPS': 0b0000000010000000,        // 128SPS 默认
    '250SPS': 0b0000000010100000,        // 250SPS
    '475SPS': 0b0000000011000000,        // 475SPS
    '860SPS': 0b0000000011100000,        // 860SPS
  ,
  // 初始化
  init: function(i2cbus = 1, ads1115_address = 0x48)
    this.address = ads1115_address;
    this.bus = i2c.openSync(i2cbus);
  ,
  // 写入16位寄存器数据
  writeReg16: function(register, value)
    const buff = Buffer.from([register, value >> 8, value & 0xFF]);
    console.log('writeReg16 = ',buff)
    return this.bus.i2cWriteSync(this.address, 3, buff);
  ,
  // 读取16位寄存器的数据
  readReg16: function(register)
    this.bus.i2cWriteSync(this.address, 1, Buffer.alloc(1, register));
    let buffer = Buffer.alloc(2);
    this.bus.i2cReadSync(this.address,2,buffer);
    return (buffer[0] << 8) | buffer[1];
  ,
  // 获取测量结果
  measure: function(mux = '0+GND', pga = '2/3',dr = '128SPS') 
    let MUX = this.MUX[mux];
    let PGA = this.PGA[pga];
    let DR = this.DR[dr];
    this.writeReg16(0x01,MUX | PGA | DR | this.START_CONVERSION);
    return this.readReg16(0x00);
  

module.exports = ADS1115;

测试的代码:

let ADS1115 = require('./index');
function main()
  ADS1115.init(1,0x48);
  let ret0 = 0;
  let ret_v0 = 0;
  let ret1 = 0;
  let ret_v1 = 0;
  setInterval(function()
    ret0 = ADS1115.measure('0+GND');
    ret1 = ADS1115.measure('1+GND');
    ret0 = ret0 > 32768 ? 0 : ret0;
    ret_v0 = ret0/32768 * 6.144;
    ret1 = ret1 > 32768 ? 0 : ret1;
    ret_v1 = ret1/32768 * 6.144;

    console.log('ret0 = ',ret0);
    console.log('ret_v0 = ',ret_v0);
    console.log('ret1 = ',ret1);
    console.log('ret_v1 = ',ret_v1);
  ,300);

main();

效果图就不上了,看打印。

以上是关于(三十一)树莓派3B+获取ADS1115 ADC转换的数据的主要内容,如果未能解决你的问题,请参考以下文章

树莓派通过模数转换芯片ADC0832读取LM35温度传感器数据

树莓派3B 挂载硬盘

(十三)树莓派3B+ wiringPi库的使用--软件PWM

从 ADS1115 Python 向 MySQL 插入数据

树莓派3b入门教程

树莓派3B 安装gcc和g++