217 lines
3.7 KiB
C++
217 lines
3.7 KiB
C++
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "Arduino.h"
|
|
#include "SPI.h"
|
|
|
|
#define MT6835_OP_READ 0b0011
|
|
#define MT6835_OP_WRITE 0b0110
|
|
#define MT6835_OP_PROG 0b1100
|
|
#define MT6835_OP_ZERO 0b0101
|
|
#define MT6835_OP_ANGLE 0b1010
|
|
|
|
#define MT6835_CMD_MASK 0b111100000000000000000000
|
|
#define MT6835_ADDR_MASK 0b000011111111111100000000
|
|
#define MT6835_DATA_MASK 0b000000000000000011111111
|
|
|
|
#define MT6835_CPR 2097152
|
|
|
|
#define MT6835_STATUS_OVERSPEED 0x01
|
|
#define MT6835_STATUS_WEAKFIELD 0x02
|
|
#define MT6835_STATUS_UNDERVOLT 0x04
|
|
|
|
#define MT6835_WRITE_ACK 0x55
|
|
|
|
#define MT6835_REG_USERID 0x001
|
|
|
|
#define MT6835_REG_ANGLE1 0x003
|
|
#define MT6835_REG_ANGLE2 0x004
|
|
#define MT6835_REG_ANGLE3 0x005
|
|
#define MT6835_REG_ANGLE4 0x006
|
|
|
|
#define MT6835_REG_ABZ_RES1 0x007
|
|
#define MT6835_REG_ABZ_RES2 0x008
|
|
|
|
#define MT6835_REG_ZERO1 0x009
|
|
#define MT6835_REG_ZERO2 0x00A
|
|
|
|
#define MT6835_REG_OPTS0 0x00A
|
|
#define MT6835_REG_OPTS1 0x00B
|
|
#define MT6835_REG_OPTS2 0x00C
|
|
#define MT6835_REG_OPTS3 0x00D
|
|
#define MT6835_REG_OPTS4 0x00E
|
|
#define MT6835_REG_OPTS5 0x011
|
|
|
|
// NLC table, 192 bytes
|
|
#define MT6835_REG_NLC_BASE 0x013
|
|
|
|
#define MT6835_REG_CAL_STATUS 0x113
|
|
|
|
|
|
union MT6835ABZRes {
|
|
struct {
|
|
uint8_t ab_swap:1;
|
|
uint8_t abz_off:1;
|
|
uint8_t abz_res_low:6;
|
|
};
|
|
uint8_t reg;
|
|
};
|
|
|
|
|
|
|
|
union MT6835Options0 {
|
|
struct {
|
|
uint8_t z_pul_wid:3;
|
|
uint8_t z_edge:1;
|
|
uint8_t zero_pos_low:4;
|
|
};
|
|
uint8_t reg;
|
|
};
|
|
|
|
|
|
|
|
union MT6835Options1 {
|
|
struct {
|
|
uint8_t uvw_res:4;
|
|
uint8_t uvw_off:1;
|
|
uint8_t uvw_mux:1;
|
|
uint8_t z_phase:2;
|
|
};
|
|
uint8_t reg;
|
|
};
|
|
|
|
|
|
|
|
union MT6835Options2 {
|
|
struct {
|
|
uint8_t pwm_sel:3;
|
|
uint8_t pwm_pol:1;
|
|
uint8_t pwm_fq:1;
|
|
uint8_t nlc_en:1;
|
|
uint8_t reserved:2;
|
|
};
|
|
uint8_t reg;
|
|
};
|
|
|
|
|
|
|
|
union MT6835Options3 {
|
|
struct {
|
|
uint8_t hyst:3;
|
|
uint8_t rot_dir:1;
|
|
uint8_t reserved:4;
|
|
};
|
|
uint8_t reg;
|
|
};
|
|
|
|
|
|
|
|
union MT6835Options4 {
|
|
struct {
|
|
uint8_t reserved:4;
|
|
uint8_t autocal_freq:3;
|
|
uint8_t gpio_ds:1;
|
|
};
|
|
uint8_t reg;
|
|
};
|
|
|
|
|
|
|
|
union MT6835Options5 {
|
|
struct {
|
|
uint8_t bw:3;
|
|
uint8_t reserved:5;
|
|
};
|
|
uint8_t reg;
|
|
};
|
|
|
|
|
|
|
|
|
|
union MT6835Command {
|
|
struct {
|
|
uint32_t unused:8;
|
|
uint32_t data:8;
|
|
uint32_t addr:12;
|
|
uint32_t cmd:4;
|
|
};
|
|
uint32_t val;
|
|
};
|
|
|
|
|
|
|
|
|
|
#define MT6835_BITORDER MSBFIRST
|
|
|
|
static SPISettings MT6835SPISettings(1000000, MT6835_BITORDER, SPI_MODE3); // @suppress("Invalid arguments")
|
|
|
|
|
|
|
|
|
|
class MT6835 {
|
|
public:
|
|
MT6835(SPISettings settings = MT6835SPISettings, int nCS = -1);
|
|
virtual ~MT6835();
|
|
|
|
virtual void init(SPIClass* _spi = &SPI);
|
|
|
|
|
|
float getCurrentAngle(); // angle in radians, return current value
|
|
|
|
uint32_t readRawAngle21(); // up to 21bit precision angle value
|
|
|
|
|
|
uint8_t getBandwidth();
|
|
void setBandwidth(uint8_t bw);
|
|
|
|
uint8_t getHysteresis();
|
|
void setHysteresis(uint8_t hyst);
|
|
|
|
uint8_t getRotationDirection();
|
|
void setRotationDirection(uint8_t dir);
|
|
|
|
uint16_t getABZResolution();
|
|
void setABZResolution(uint16_t res);
|
|
|
|
bool isABZEnabled();
|
|
void setABZEnabled(bool enabled);
|
|
|
|
bool isABSwapped();
|
|
void setABSwapped(bool swapped);
|
|
|
|
uint16_t getZeroPosition();
|
|
void setZeroPosition(uint16_t pos);
|
|
|
|
MT6835Options1 getOptions1();
|
|
void setOptions1(MT6835Options1 opts);
|
|
|
|
MT6835Options2 getOptions2();
|
|
void setOptions2(MT6835Options2 opts);
|
|
|
|
MT6835Options3 getOptions3();
|
|
void setOptions3(MT6835Options3 opts);
|
|
|
|
MT6835Options4 getOptions4();
|
|
void setOptions4(MT6835Options4 opts);
|
|
|
|
uint8_t getStatus();
|
|
|
|
uint8_t getCalibrationStatus();
|
|
|
|
bool setZeroFromCurrentPosition();
|
|
bool writeEEPROM(); // wait 6s after calling this method
|
|
|
|
private:
|
|
SPIClass* spi;
|
|
SPISettings settings;
|
|
int nCS = -1;
|
|
uint8_t laststatus = 0;
|
|
|
|
void transfer24(MT6835Command* outValue);
|
|
uint8_t readRegister(uint16_t reg);
|
|
bool writeRegister(uint16_t reg, uint8_t value);
|
|
|
|
}; |