Коснитесь обнаружения с чипом акселерометра ADXL345 с помощью адаптера NI USB 8451

Этот пример показывает, как записать и считать данные из включенного чипа акселерометра ADXL345 I2C с помощью адаптера NI USB 8451 I2C. Акселерометр будет сконфигурирован, чтобы обнаружить двойной выстрел, и MATLAB будет использоваться, чтобы отобразить сообщение, что чип обнаружил это.

Instrument Control Toolbox™ поддерживает связь с инструментами через интерфейсы и драйверами.

Для получения дополнительной информации на тулбоксе, посетите страницу продукта Instrument Control Toolbox.

Требования

Этот пример требует системы Microsoft® Windows® и драйвера NI845x 2.1.1 или выше установленный. Убедитесь, что Measurement & Automation Explorer распознает устройство NI845x, прежде чем вы будете использовать этот пример. Кроме того, гарантируйте, что Measurement & Automation Explorer™ закрывается до доступа к форме устройства MATLAB.

Пример использует акселерометр Analog Devices® ADXL345, который смонтирован на 9DOF Палка Датчика от SparkFun™. Акселерометр имеет линии шины I2C, которые могут быть соединены с входными параметрами линии шины I2C адаптеров. Линии шины должны потянуться высоко с внешним получением по запросу резисторы, когда NI USB 8451 не имеет программируемых внутренних нагрузочных резисторов. Обратите внимание на то, что переключатель уровня используется, чтобы разделить V_s и V_dd.

Введение

Instrument Control Toolbox™ поддерживает связь с устройствами I2C через адаптеры I2C, такие как NI USB 8451. Тулбокс позволяет вам создавать интерфейс I2C, который может использоваться, чтобы сконфигурировать адаптер, чтобы связаться с ведомыми микросхемами I2C.

Этот пример продемонстрирует, как сконфигурировать основанный на I2C акселерометр, чтобы ответить на ответвление макетной платы дважды с вашим пальцем. Когда двойной выстрел будет обнаружен, сообщение будет отображено в окне команды MATLAB.

Проверьте установку NI845x

Используйте команду instrhwinfo, чтобы проверять, установлен ли драйвер NI845x правильно и что Instrument Control Toolbox может обнаружить его правильно.

Порядковый номер платы должен помочь вам идентифицировать свое устройство

clear all; close all; clc;
i2cInfo = instrhwinfo ('i2c', 'ni845x');
disp(i2cInfo);
             AdaptorDllName: [1x94 char]
          AdaptorDllVersion: 'Version 3.4'
                AdaptorName: 'ni845x'
              BoardIdsInUse: [1x0 double]
          InstalledBoardIDs: 0
       DetectedBoardSerials: {'0180D47A (BoardIndex: 0)'}
      ObjectConstructorName: 'i2c('ni845x', BoardIndex, RemoteAddress);'
              VendorDllName: 'Ni845x.dll'
    VendorDriverDescription: 'National Instruments NI USB 845x Driver'

Создайте Интерфейс I2C и установите скорость шины (Свойство BitRate)

accelerometerAddress = hex2dec('53');
i2cInterface = i2c('ni845x', 0, accelerometerAddress);
fopen(i2cInterface);
i2cInterface.BitRate = 100;

Установите порог касания, вторую задержку касания, второе окно касания и значения регистра длительности касания

Установите значения регистра согласно таблице данных устройства. Считайте значение назад из устройства, чтобы подтвердить, что значение действительно установлено.

threshTapRegisterAddress = hex2dec('1D');
valueToWrite = hex2dec('50'); %5g value
disp(['Writing Value: ' num2str(valueToWrite)]);
fwrite(i2cInterface, [threshTapRegisterAddress valueToWrite]);

fwrite(i2cInterface, threshTapRegisterAddress);
registerValue = fread(i2cInterface, 1, 'uint8');
disp(['The value of the THRESH_TAP register is :' num2str(registerValue)]);

latentRegisterAddress = hex2dec('22');
valueToWrite = hex2dec('5');
disp(['Writing Value: ' num2str(valueToWrite)]);
fwrite(i2cInterface, [latentRegisterAddress valueToWrite]);

% Confirm the value return to the register
fwrite(i2cInterface, latentRegisterAddress);
registerValue = fread(i2cInterface, 1, 'uint8');
disp(['The value of the LATENT register is :' num2str(registerValue)]);

windowRegisterAddress = hex2dec('23');
valueToWrite = hex2dec('FF');
disp(['Writing Value: ' num2str(valueToWrite)]);
fwrite(i2cInterface, [windowRegisterAddress valueToWrite]);

% Confirm the value return to the register
fwrite(i2cInterface, windowRegisterAddress);
registerValue = fread(i2cInterface, 1, 'uint8');
disp(['The value of the WINDOW register is :' num2str(registerValue)]);

durationRegisterAddress = hex2dec('21');
valueToWrite = hex2dec('10');
disp(['Writing Value: ' num2str(valueToWrite)]);
fwrite(i2cInterface, [durationRegisterAddress valueToWrite]);

fwrite(i2cInterface, durationRegisterAddress);
registerValue = fread(i2cInterface, 1, 'uint8');
disp(['The value of the DUR register is :' num2str(registerValue)]);

tapAxesRegisterAddress = hex2dec('2A');
valueToWrite = bin2dec('00000111');
disp(['Writing Value: ' num2str(valueToWrite)]);
fwrite(i2cInterface, [tapAxesRegisterAddress valueToWrite]);

fwrite(i2cInterface, tapAxesRegisterAddress);
registerValue = fread(i2cInterface, 1, 'uint8');
disp(['The value of the TAP_AXES register is :' num2str(registerValue)]);

interruptEnableRegisterAddress = hex2dec('2E');
valueToWrite = bin2dec('01100000');
disp(['Writing Value: ' num2str(valueToWrite)]);
fwrite(i2cInterface, [interruptEnableRegisterAddress valueToWrite]);

fwrite(i2cInterface, interruptEnableRegisterAddress);
registerValue = fread(i2cInterface, 1, 'uint8');
disp(['The value of the INT_ENABLE register is :' num2str(registerValue)]);
Writing Value: 80
The value of the THRESH_TAP register is :80
Writing Value: 5
The value of the LATENT register is :5
Writing Value: 255
The value of the WINDOW register is :255
Writing Value: 16
The value of the DUR register is :16
Writing Value: 7
The value of the TAP_AXES register is :7
Writing Value: 96
The value of the INT_ENABLE register is :96

Включите операцию путем записи в регистр POWER_CTL

Запись в регистр POWER_CTL согласно таблице данных заставит чип идти от дежурного режима до режима нормального функционирования.

powerControlRegisterAddress = hex2dec('2D');
valueToWrite = bin2dec('00001000');
disp(['Writing Value: ' num2str(valueToWrite)]);
fwrite(i2cInterface, [powerControlRegisterAddress valueToWrite]);

fwrite(i2cInterface, powerControlRegisterAddress);
registerValue = fread(i2cInterface, 1, 'uint8');
disp(['The value of the POWER_CTL register is :' num2str(registerValue)]);
Writing Value: 8
The value of the POWER_CTL register is :8

Опросите регистр прерываний

Исходный регистр прерывания будет содержать биты, которые соответствуют флагам прерывания, сгенерированным определенными источниками. Проверяйте, чтобы видеть, что прерывание двойного выстрела сгенерировано

interruptSourceRegisterAddress = hex2dec('30');

disp('Waiting for double tap...');
while(1)
   fwrite(i2cInterface, interruptSourceRegisterAddress);
   InterruptValues = fread(i2cInterface, 1);
   TapInterrupt = bitand(InterruptValues, bin2dec('00100000'));
   if TapInterrupt
       disp('Double tap detected!');
       break;
   end
end
Waiting for double tap...
Double tap detected!