Создание драйвера для PNI RM3100, совместимого с Arduino - PullRequest
0 голосов
/ 24 мая 2018

В настоящее время я разрабатываю драйвер для магнитометра RM3100, но сталкиваюсь с проблемами при чтении и записи в регистры.В настоящее время я пытаюсь прочитать регистр STATUS, чтобы определить, собирает ли датчик данные;однако я получаю ноль каждый раз.Есть ли проблема с тем, как я пытаюсь получить доступ к регистрам?Или в моем коде есть какая-то ошибка?

Файл C ++:

#include "Arduino.h"
#include "QRM3100.h"
#include <Wire.h>
#include <math.h>

#define CALIBRATION_TIMEOUT 5000 //timeout in milliseconds
#define DEG_PER_RAD (180.0/3.14159265358979)

QRM3100::QRM3100() {
    //Just some random initial values
}

void QRM3100::initialize() {
    Wire.begin();

}

uint8_t QRM3100::readRegister(uint8_t address){
  uint8_t output;

  Wire.beginTransmission(QRM3100_I2C_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();

  delayMicroseconds(20);

  Wire.requestFrom(QRM3100_I2C_ADDRESS, 1);
  while(Wire.available())
  {
    output = Wire.read();
  }

  return output;
}

void QRM3100::writeRegister(uint8_t address, uint8_t value){
  Wire.beginTransmission(QRM3100_I2C_ADDRESS);
  Wire.write(address);
  Wire.write(value);
  Wire.endTransmission();
}

bool QRM3100::dataReady() {
    return ((readRegister(QRM3100_STATUS_REG) & 0x80) >> 7);
}


void QRM3100::start() {
    exitStandby();
}


void QRM3100::exitStandby(){
    writeRegister(QRM3100_CMM, 0b011100001);
}

Файл заголовка:

#ifndef QRM3100_h
#define QRM3100_h

#include "Arduino.h"
#include "Wire.h"

#define QRM3100_CMM         0x01 //initiates continuous measurement mode
#define QRM3100_STATUS_REG      0x34 //status of DRDY
#define QRM3100_I2C_ADDRESS     0x21
#define QRM3100_POLL        0x00 //poll

class QRM3100
{
    public:
    QRM3100();
    void initialize();

    uint8_t readRegister(uint8_t address);
    void writeRegister(uint8_t address, uint8_t value);
    bool dataReady();


    void start();
    void exitStandby();

    bool error;
};

#endif

Файл Arduino:

#include <C:\Users\daehy\OneDrive\Documents\Arduino\libraries\src\QRM3100X.h>
#include <C:\Users\daehy\OneDrive\Documents\Arduino\libraries\src\QRM3100X.cpp>

QRM3100 mag = QRM3100();

void setup() {
  Serial.begin(9600);
  mag.initialize();
  mag.start();
}

void loop() {
 Serial.println( mag.dataReady());
}

1 Ответ

0 голосов
/ 03 июня 2018

Кажется, вы сначала не установили регистр CMM.Значение по умолчанию может быть неправильным для непрерывного режима.Попробуйте установить для регистра CMM (0x01) следующее:

(CMM_ALL_AXIS_ON | DRDY_WHEN_ALL_AXIS_MEASURED | CM_START)


(0x70 | 0x08 | 0x01)
, которое должно дать вам окончательный результатдвоичное значение,

| LDM | CMZ | CMY | CMX | DRDM1 | DRDM0 | ALARM | START |


|0 |1 |1 |1 |1 |0 |0 |1 |

или 0x79 в шестнадцатеричном

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...