【得捷电子Follow Me第二期】【补充】NAU7802 ADC模块与六轴传感器LIS30H模块的使用
[复制链接]
【得捷电子Follow Me第二期】补充NAU7802 ADC模块与六轴传感器LIS30H模块的使用
任务一 NAU7802 ADC
本次任务使用nau7802ADC来获取电压测量值
nau7802模块是一款精密低功耗 24 位模数转换器 (ADC),具有板载低噪声可编程增益放大器 (PGA)、板载 RC 或晶体振荡器,以及精密 24 位 Σ-Δ (Σ-Δ) 模数转换器 (ADC)。该设备能够高达 23 位 ENOB(有效位数)性能。该设备提供了一个完整的前端电桥/传感器测量的解决方案,例如体重秤、应变仪和许多其他高分辨率,低采样率应用。许多内置功能使高性能应用程序的外部部件数量非常少。此外,工作电流和待机电流都非常低,许多电源管理功能包括在内。这些可以只为芯片中需要的那些元件供电,并且此外,如果不需要完整的 23 位 ENOB 性能,则以大大降低的功率运行可编程增益放大器 (PGA) 提供 1 至 128 的可选增益。A/D 转换用 Sigma-Delta 调制器和可编程 FIR 滤波器执行,该滤波器提供同时50Hz和60Hz陷波滤波器,有效提高抗干扰能力。此外,该设备提供了一个与 I2C 协议兼容的标准 2 线接口,用于简单直接地连接到和与各种可能的主机处理器互操作。
通过连接adc与单片机io口 让io口输出高电平将将io口插入 A+端 可以明显看到adc输出数值的变化
代码如下
from adafruit_bitmap_font import bitmap_font
import socketpool
import adafruit_requests as req
import ssl
import wifi
import time
from adafruit_datetime import datetime, date, timezone, timedelta
import json
import re
from adafruit_display_shapes.roundrect import RoundRect
import asyncio
import rtc
from adafruit_esp32spi import adafruit_esp32spi
import adafruit_esp32spi.adafruit_esp32spi_socket as sock
import adafruit_minimqtt.adafruit_minimqtt as MQTT
import neopixel
from adafruit_led_animation.animation.blink import Blink
import adafruit_led_animation.color as col
from cedargrove_nau7802 import NAU7802
sensor_1 = NAU7802(board.I2C(), address=0x2A, active_channels=1)
def calibrate_zero():
print("ch %1d calibrate.INTERNAL: %5s" % (sensor_1.channel, sensor_1.calibrate("INTERNAL")))
print("ch %1d calibrate.OFFSET: %5s" % (sensor_1.channel, sensor_1.calibrate("OFFSET")))
print("...ch %1d zeroed" % sensor_1.channel)
def read_raw_samples(samples=2):
sample_sum = 0
sample_count = samples
while sample_count > 0:
while not sensor_1.available():
pass
sample_sum += sensor_1.read()
sample_count -= 1
return int(sample_sum / samples)
enabled = sensor_1.enable(True)
print("Digital and analog power enabled:", enabled)
print("REMOVE WEIGHTS FROM LOAD CELLS")
time.sleep(3)
sensor_1.channel = 1
display = board.DISPLAY
grp = displayio.Group(scale=1)
clr = 0xffffff
fnt = bitmap_font.load_font("/font/font.pcf")
dt = label.Label(fnt, text="", color=clr)
dt.x = 0
dt.y = 30
grp.append(dt)
display.show(grp)
while True:
sensor_1.channel = 1
val = read_raw_samples()
print("ADC Value is %d" % val)
dt.text = "ADC Value is %d" % val
任务二 LIS30HLIS3DH是一个三轴加速度传感器,可用于检测X、Y、Z轴上的加速度,以及设置阈值,在加速度超出阈值时触发中断,支持SPI和IIC读写。
下面主要是IIC方式读写:
SPI方式读写类似,参考手册即可。一般情况下,可以用2根线,没必要用3线或者4线。而且IIC用GPIO模拟很方便,网上例程很多,这里就不贴了,搜一搜就有。
首先硬件连接会决定该模块的IIC地址
如果SAO脚接地,IIC地址为0X30(不包含最低位).
如果接V3.3,则IIC地址为0X32(不包含最低位).
< class="p" style="">这个器件地址很重要,因为读写寄存器都是要先写一下对应的器件地址,然后再执行命令的。
注意先发送的器件地址只是前7位,最后一位决定的是读写位,0是写寄存器,1为读寄存器,所以写寄存器时是先写入“LIS_ADDR|0x00”,读的时候则是先写入“LIS_ADDR|0x01”,(LIS_ADDR这里指上文的IIC地址)。
a、主机向从机写一个字节,下表是通过IIC向LIS3DH寄存器写一个字节的流程。简单来说就是:先写1个字节的写命令+IIC地址,再写一个字节的你要写的寄存器地址,最后写一个字节你要写入寄存器的内容。
代码如下
import time
import board
import busio
import adafruit_lis3dh
# Hardware I2C setup. Use the CircuitPlayground built-in accelerometer if available;
# otherwise check I2C pins.
if hasattr(board, "ACCELEROMETER_SCL"):
i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, address=0x19)
else:
i2c = board.I2C()
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c)
lis3dh.range = adafruit_lis3dh.RANGE_2_G
while True:
x, y, z = [value / adafruit_lis3dh.STANDARD_GRAVITY for value in lis3dh.acceleration]
print("x = %0.3f G, y = %0.3f G, z = %0.3f G" % (x, y, z))
time.sleep(0.1)
|