簡體   English   中英

為與Arduino兼容的PNI RM3100創建驅動程序

[英]Creating a Driver for PNI RM3100 compatible with Arduino

我目前正在開發RM3100磁力計的驅動程序,但是在讀寫寄存器時遇到了問題。 目前,我正在嘗試讀取狀態寄存器,以確定傳感器是否正在收集數據。 但是,我每次都會得到零。 我嘗試訪問寄存器的方式是否存在問題? 還是我的代碼中有些錯誤?

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());
}

似乎您沒有先設置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(十六進制)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM