(三十一)树莓派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温度传感器数据