168 lines
3.1 KiB
C++
168 lines
3.1 KiB
C++
/*
|
|
* AS5047.h
|
|
*
|
|
* Created on: 2 May 2021
|
|
* Author: runger
|
|
*/
|
|
|
|
#ifndef AS5047_H_
|
|
#define AS5047_H_
|
|
|
|
#include "Arduino.h"
|
|
#include "SPI.h"
|
|
|
|
|
|
|
|
|
|
union AS5047Diagnostics {
|
|
struct {
|
|
uint16_t agc:8;
|
|
uint16_t lf:1;
|
|
uint16_t cof:1;
|
|
uint16_t magh:1;
|
|
uint16_t magl:1;
|
|
uint16_t unused:4;
|
|
};
|
|
uint16_t reg;
|
|
};
|
|
|
|
|
|
union AS5047ZPosM {
|
|
struct {
|
|
uint16_t zposm:8;
|
|
uint16_t unused:8;
|
|
};
|
|
uint16_t reg;
|
|
};
|
|
|
|
|
|
union AS5047ZPosL {
|
|
struct {
|
|
uint16_t zposl:6;
|
|
uint16_t comp_l_error_en:1;
|
|
uint16_t comp_h_error_en:1;
|
|
uint16_t unused:8;
|
|
};
|
|
uint16_t reg;
|
|
};
|
|
|
|
|
|
union AS5047Settings1 {
|
|
struct {
|
|
uint16_t reserved:1;
|
|
uint16_t noiseset:1;
|
|
uint16_t dir:1;
|
|
uint16_t uvw_abi:1;
|
|
uint16_t daecdis:1;
|
|
uint16_t abibin:1;
|
|
uint16_t dataselect:1;
|
|
uint16_t pwmon:1;
|
|
uint16_t unused:8;
|
|
};
|
|
uint16_t reg;
|
|
};
|
|
|
|
|
|
union AS5047Settings2 {
|
|
struct {
|
|
uint16_t uvwpp:3;
|
|
uint16_t hys:2;
|
|
uint16_t abires:3;
|
|
uint16_t unused:8;
|
|
};
|
|
uint16_t reg;
|
|
};
|
|
|
|
|
|
struct AS5047Error {
|
|
bool framingError;
|
|
bool commandInvalid;
|
|
bool parityError;
|
|
};
|
|
|
|
|
|
enum AS5047ABIRes : uint8_t {
|
|
AS5047_ABI_1024 = 0b1010,
|
|
AS5047_ABI_2048 = 0b1001,
|
|
AS5047_ABI_4096 = 0b1000,
|
|
AS5047_ABI_100 = 0b0111,
|
|
AS5047_ABI_200 = 0b0110,
|
|
AS5047_ABI_400 = 0b0101,
|
|
AS5047_ABI_800 = 0b0100,
|
|
AS5047_ABI_1200 = 0b0011,
|
|
AS5047_ABI_1600 = 0b0010,
|
|
AS5047_ABI_2000 = 0b0001,
|
|
AS5047_ABI_4000 = 0b0000
|
|
};
|
|
|
|
|
|
#define AS5047_CPR 16384
|
|
#define AS5047_ANGLECOM_REG 0x3FFF
|
|
#define AS5047_ANGLEUNC_REG 0x3FFE
|
|
#define AS5047_MAGNITUDE_REG 0x3FFD
|
|
#define AS5047_DIAGNOSTICS_REG 0x3FFC
|
|
#define AS5047_ERROR_REG 0x0001
|
|
#define AS5047_PROG_REG 0x0003
|
|
#define AS5047_ZPOSM_REG 0x0016
|
|
#define AS5047_ZPOSL_REG 0x0017
|
|
#define AS5047_SETTINGS1_REG 0x0018
|
|
#define AS5047_SETTINGS2_REG 0x0019
|
|
|
|
#define AS5047_PARITY 0x8000
|
|
#define AS5047_RW 0x4000
|
|
#define AS5047_ERRFLG 0x4000
|
|
#define AS5047_RESULT_MASK 0x3FFF
|
|
|
|
|
|
#define AS5047_BITORDER MSBFIRST
|
|
|
|
static SPISettings AS5047SPISettings(8000000, AS5047_BITORDER, SPI_MODE1); // @suppress("Invalid arguments")
|
|
|
|
|
|
class AS5047 {
|
|
public:
|
|
AS5047(SPISettings settings = AS5047SPISettings, int nCS = -1);
|
|
virtual ~AS5047();
|
|
|
|
virtual void init(SPIClass* _spi = &SPI);
|
|
|
|
float getCurrentAngle(); // angle in radians, return current value
|
|
float getFastAngle(); // angle in radians, return last value and read new
|
|
|
|
uint16_t readRawAngle(); // 14bit angle value
|
|
uint16_t readCorrectedAngle(); // 14bit corrected angle value
|
|
uint16_t readMagnitude(); // 14bit magnitude value
|
|
|
|
bool isErrorFlag();
|
|
AS5047Error clearErrorFlag();
|
|
|
|
AS5047Diagnostics readDiagnostics();
|
|
AS5047Settings1 readSettings1();
|
|
void writeSettings1(AS5047Settings1 settings);
|
|
AS5047Settings2 readSettings2();
|
|
void writeSettings2(AS5047Settings2 settings);
|
|
void enablePWM(bool enable);
|
|
void enableABI(bool enable);
|
|
void setABIResolution(AS5047ABIRes res);
|
|
void enableDEAC(bool enable);
|
|
void useCorrectedAngle(bool useCorrected);
|
|
void setHysteresis(uint8_t hyst);
|
|
|
|
uint16_t setZero(uint16_t);
|
|
uint16_t getZero();
|
|
|
|
uint16_t calcParity(uint16_t data);
|
|
|
|
private:
|
|
|
|
uint16_t nop();
|
|
uint16_t spi_transfer16(uint16_t outdata);
|
|
SPIClass* spi;
|
|
SPISettings settings;
|
|
bool errorflag = false;
|
|
int nCS = -1;
|
|
|
|
};
|
|
|
|
#endif /* AS5047_H_ */
|