主要内容

使用NI USB-8452控制器的ADXL345加速度计芯片的抽头检测

本示例展示了如何使用NI™USB-8452控制器从adi®ADXL345 I2C加速计芯片写入和读取数据。加速度计配置为检测双击并返回指示此消息。

需求

本例需要Microsoft®Windows®和NI-845x驱动程序。确保NI测量和自动化资源管理器(NI MAX)识别NI-8452控制器。在从MATLAB®连接到控制器之前,必须关闭NI MAX。

本例使用Analog Devices®ADXL345加速度计。加速度计有I2C总线,可以连接到控制器的I2C总线输入。将ADXL345的Vcc和GND接至NI USB-8452控制器的5V源和GND引脚。

介绍

通过I2C控制器板(如NI USB-8452)与I2C外设进行通信。通过创建I2C接口,可以对控制器进行配置,并与I2C外设通信。

这个例子演示了如何配置一个基于i2c的加速度计,以响应用手指轻敲面包板两次。当检测到双击时,在MATLAB中显示一条消息。

检测NI USB-8452控制器

搜索NI USB-8452硬件连接到您的机器使用ni845xlist

一台机器可以连接多个NI USB-8452控制器。选择合适的控制器SerialNumber返回的ni845xlist序列号印在主控板上。

controllerList = ni845xlist
controllerList =1×2表模型SerialNumber  _____________ ____________ " 1 " NI usb - 8452 01 f26e0a”

连接到加速度计和设置总线速度

使用返回的序列号连接到ADXL345加速度计芯片ni845xlist。在这种情况下,是第一个SerialNumber对应所需的控制器。

ni845Obj = ni845x(controllerList.SerialNumber(1))
ni845Obj = NI845x with properties: Model: "NI USB-8452" SerialNumber: "01F26E0A" AvailableDigitalPins: ["P0.0" "P0.1" "P0.2" "P0.3" "P0.4" "P0.6" "P0.7"]显示所有属性,功能

确定连接到控制器的ADXL345加速度计的地址scanI2CBus函数。

accelerometerAddress = scanI2CBus(ni845Obj)
accelerometerAddress =1×2字符串“0 x48”“0 x53”

使用返回的I2C地址连接到ADXL345加速度计scanI2CBus。在本例中,加速度计地址是第二个值,因为有两个I2C外围设备连接到控制器。将加速度计芯片的比特率设置为100khz。

adxlDevice = device(ni845Obj,I2CAddress=accelerometerAddress(2))
adxlDevice = I2CDevice with properties: Protocol: "I2C" I2CAddress: 83 BitRate: 100000 ByteOrder: "little-endian"显示所有功能
adxlDevice。BitRate = 100000;

设置“轻拍阈值”、“二次轻拍延时”、“二次轻拍窗口”和“轻拍时长寄存器”

根据设备的数据表设置寄存器值。从设备读取回值以确认确实设置了该值。

threshTapRegisterAddress = 0x1D;valueToWrite = 0x50;writeRegister(adxlDevice, threshTapRegisterAddress, valueToWrite,“uint8”);disp (" THRESH_TAP寄存器的写入值为:"+ num2str (valueToWrite));
THRESH_TAP寄存器的写值为:80
registerValue = readRegister(adxlDevice, threshTapRegisterAddress, 1,)“uint8”);disp (THRESH_TAP寄存器的读值是:+ num2str (registerValue));
THRESH_TAP寄存器的读值为:80
latentRegisterAddress = 0x22;valueToWrite = 0x5;writeRegister(adxlDevice, latentRegisterAddress, valueToWrite,“uint8”);disp (" LATENT寄存器的写入值为:"+ num2str (valueToWrite));
LATENT寄存器的写值为:5
registerValue = readRegister(adxlDevice, latentRegisterAddress, 1,)“uint8”);disp (LATENT寄存器的读值是:+ num2str (registerValue));
LATENT寄存器的读值为:5
windowRegisterAddress = 0x23;valueToWrite = 0xFF;writeRegister(adxlDevice, windowRegisterAddress, valueToWrite,“uint8”);disp ("窗口寄存器的写入值是:"+ num2str (valueToWrite));
windows寄存器的写值为:255
registerValue = readRegister(adxlDevice, windowRegisterAddress, 1,)“uint8”);disp (窗口寄存器的读值是:+ num2str (registerValue));
windows寄存器的读值是:255
durationRegisterAddress = 0x21;valueToWrite = 0x10;writereregister (adxlDevice, durationRegisterAddress, valueToWrite,)“uint8”);disp (" DUR寄存器的写入值为:"+ num2str (valueToWrite));
DUR寄存器的写值为:16
registerValue = readRegister(adxlDevice, durationRegisterAddress, 1,)“uint8”);disp (" DUR寄存器的读值是:"+ num2str (registerValue));
DUR寄存器的读值为:16
tapAxesRegisterAddress = 0x2A;valueToWrite = 0b00000111;writereregister (adxlDevice, tapAxesRegisterAddress, valueToWrite,“uint8”);disp (" TAP_AXES寄存器的写入值是:"+ num2str (valueToWrite));
TAP_AXES寄存器的写值为:7
registerValue = readRegister(adxlDevice, tapAxesRegisterAddress, 1,)“uint8”);disp (" TAP_AXES寄存器的读值是:"+ num2str (registerValue));
TAP_AXES寄存器的读值为:7
interruptenableeregisteraddress = 0x2E;valueToWrite = 0b01100000;writeRegister(adxlDevice, interruptenableeregisteraddress, valueToWrite,)“uint8”);disp (INT_ENABLE寄存器的写值是:+ num2str (valueToWrite));
INT_ENABLE寄存器的写值为:96
registerValue = readRegister(adxlDevice, interruptEnableRegisterAddress, 1,)“uint8”);disp (" INT_ENABLE寄存器的读值是:"+ num2str (registerValue));
INT_ENABLE寄存器的读值是:96

通过写POWER_CTL寄存器使能操作

根据数据表,写入POWER_CTL寄存器,将芯片从待机模式更改为正常工作模式。

powerControlRegisterAddress = 0x2D;valueToWrite = 0b00001000;adxlDevice, powerControlRegisterAddress, valueToWrite,“uint8”);disp (POWER_CTL寄存器的写值为:+ num2str (valueToWrite));
POWER_CTL寄存器的写值为:8
registerValue = readRegister(adxlDevice, powerControlRegisterAddress, 1,)“uint8”);disp (POWER_CTL寄存器的读值是:+ num2str (registerValue));
POWER_CTL寄存器的读值为:8

轮询中断寄存器

中断源寄存器包含与特定源生成的中断标志相对应的位。检查是否产生了双接中断。

interruptSourceRegisterAddress = 0x30;disp (“等待双击……”);
等待双击…
(1) interruptValues = readRegister(adxlDevice, interruptSourceRegisterAddress, 1,)“uint8”);tapInterrupt = bitand(interruptValues, 0b00100000);如果tapInterrupt disp (“检测到双重射击!”);打破结束结束
检测到双击!

另请参阅

|||||

相关的话题