[英]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.