9#include "as5047u_version.h"
82template <
typename SpiType>
102 for (
int i = 0; i < 16; ++i) {
103 bool bit = ((data16 >> (15 - i)) & 1) ^ ((crc >> 7) & 1);
104 crc = (crc << 1) ^ (bit ? 0x1D : 0x00);
175 static constexpr float RAD_PER_LSB = (2.0F *
static_cast<float>(M_PI)) / 16384.0F;
178 return static_cast<uint16_t
>((degrees * 16384.0F) / 360.0F) & 0x3FFF;
182 return static_cast<uint16_t
>((radians * 16384.0F) / (2.0F *
static_cast<float>(M_PI))) & 0x3FFF;
373 void SetPad(uint8_t pad)
noexcept;
431 template <
typename RegT>
433 return decode<RegT>(readRegister(RegT::ADDRESS));
446 template <
typename RegT>
448 return writeRegister(RegT::ADDRESS, encode(reg), retries);
466 return HF_AS5047U_VERSION_STRING;
471 return HF_AS5047U_VERSION_MAJOR;
476 return HF_AS5047U_VERSION_MINOR;
481 return HF_AS5047U_VERSION_PATCH;
489 uint16_t rawReadRegister(uint16_t addr)
const;
490 uint16_t readRegister(uint16_t addr)
const;
491 bool writeRegister(uint16_t addr, uint16_t val, uint8_t retries)
const;
495 uint8_t pad_byte_{0};
497 mutable std::atomic<uint16_t> sticky_errors_{0};
498 void updateStickyErrors(uint16_t err_fl)
const;
501 template <
typename RegT>
502 static constexpr uint16_t encode(
const RegT& r) {
506 template <
typename RegT>
507 static constexpr RegT decode(uint16_t raw) {
515template <
typename SpiType>
517 : spi_(bus), frame_format_(format) {
521template <
typename SpiType>
523 auto s2 = ReadReg<AS5047U_REG::SETTINGS2>();
524 s2.bits.DIR = clockwise ? 0 : 1;
525 return WriteReg(s2, retries);
530 return HF_AS5047U_VERSION_STRING;
536#define AS5047U_HEADER_INCLUDED
539#undef AS5047U_HEADER_INCLUDED
AS5047U_Error
Definition as5047u.hpp:21
@ CommandError
Invalid SPI command received.
@ P2ramWarning
ECC corrected 1 bit in P2RAM customer area.
@ OffCompError
Internal offset compensation not finished.
@ P2ramError
ECC detected 2+ uncorrectable errors in P2RAM.
@ AgcWarning
AGC reached minimum (0) or maximum (255) value.
@ FramingError
SPI framing error.
@ WatchdogError
Internal oscillator or watchdog not working proper.
@ CrcError
CRC error during SPI communication.
@ MagHalf
Magnetic field is half of regulated value (AGC=255)
@ CordicOverflow
CORDIC algorithm overflow.
Template implementation of AS5047U driver methods.
Compile-time configuration options for the AS5047U driver.
Register definitions for the AS5047U Rotary Position Sensor.
CRTP-based SPI bus interface for AS5047U driver.
Type definitions for the AS5047U driver.
FilterPreset
Presets for the adaptive velocity/angle filter (Dynamic Filter System).
Definition as5047u_types.hpp:26
FrameFormat
Supported SPI frame formats for AS5047U communication.
Definition as5047u_types.hpp:12
AS5047U magnetic rotary sensor driver class.
Definition as5047u.hpp:83
float GetVelocityDegPerSec(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Get rotational velocity in degrees per second.
Definition as5047u.ipp:124
bool SetAdaptiveFilter(bool enable, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Enable/disable the adaptive filter (Dynamic Filter System).
Definition as5047u.ipp:280
uint16_t GetRawAngle(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read the 14-bit absolute angle without dynamic compensation (raw angle).
Definition as5047u.ipp:77
void SetPad(uint8_t pad) noexcept
Set the daisy-chain pad byte for 32-bit SPI frames.
Definition as5047u.ipp:461
AS5047U(SpiType &bus, FrameFormat format=AS5047U_CFG::DEFAULT_FRAME_FORMAT) noexcept
Construct a new AS5047U encoder driver.
Definition as5047u.hpp:516
bool ProgramOTP()
Permanently program current settings into OTP memory.
Definition as5047u.ipp:358
AS5047U_REG::SETTINGS3::Hysteresis GetHysteresis() const
Get current incremental output hysteresis setting.
Definition as5047u.ipp:474
uint16_t GetMagnitude(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read the current magnetic field magnitude (14-bit value).
Definition as5047u.ipp:154
uint16_t GetErrorFlags(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read and clear error flags.
Definition as5047u.ipp:169
static constexpr uint8_t GetDriverVersionPatch() noexcept
Get the compiled driver patch version number.
Definition as5047u.hpp:480
static constexpr uint8_t GetDriverVersionMajor() noexcept
Get the compiled driver major version number.
Definition as5047u.hpp:470
static constexpr const char * GetDriverVersion() noexcept
Get the compiled driver version string.
Definition as5047u.hpp:465
bool SetDynamicAngleCompensation(bool enable, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Enable/disable Dynamic Angle Error Compensation (DAEC).
Definition as5047u.ipp:273
AS5047U_REG::SETTINGS2::AngleOutputSource GetAngleOutputSource() const
Get currently selected angle output source for 0x3FFF reads.
Definition as5047u.ipp:488
bool SetFilterPreset(FilterPreset preset, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set adaptive filter from a preset (easiest way to configure filter).
Definition as5047u.ipp:297
uint16_t GetAngle(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read the 14-bit absolute angle with dynamic compensation (DAEC active).
Definition as5047u.ipp:38
bool ConfigureInterface(bool abi, bool uvw, bool pwm, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Configure interface outputs (ABI, UVW) and PWM output.
Definition as5047u.ipp:254
float GetVelocityRPM(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Get rotational velocity in revolutions per minute.
Definition as5047u.ipp:134
RegT ReadReg() const
Reads data from a specified register in the AS5047U sensor.
Definition as5047u.hpp:432
void SetFrameFormat(FrameFormat format) noexcept
Set the SPI frame format (16, 24, or 32-bit).
Definition as5047u.ipp:21
bool SetABIResolution(uint8_t resolution_bits, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set the ABI (incremental encoder) resolution.
Definition as5047u.ipp:218
bool SetDirection(bool clockwise, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Define the rotation direction for increasing angle.
Definition as5047u.hpp:522
float GetAngleDegrees(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read absolute angle in degrees.
Definition as5047u.ipp:67
bool SetUVWPolePairs(uint8_t pairs, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set the number of pole pairs for UVW commutation outputs.
Definition as5047u.ipp:228
uint16_t GetZeroPosition(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Get the currently configured soft zero position offset (14-bit).
Definition as5047u.ipp:181
bool WriteReg(const RegT ®, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Writes data to a specified register in the AS5047U sensor.
Definition as5047u.hpp:447
static constexpr uint8_t GetDriverVersionMinor() noexcept
Get the compiled driver minor version number.
Definition as5047u.hpp:475
bool Set150CTemperatureMode(bool enable, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set temperature mode for 150°C operation (NOISESET bit).
Definition as5047u.ipp:351
bool SetHysteresis(AS5047U_REG::SETTINGS3::Hysteresis hysteresis, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set incremental output hysteresis level.
Definition as5047u.ipp:466
static constexpr uint8_t ComputeCRC8(uint16_t data16)
Definition as5047u.hpp:100
std::pair< uint8_t, uint8_t > GetFilterParameters(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read current K_min and K_max register codes (0–7 each).
Definition as5047u.ipp:337
bool GetAdaptiveFilterEnabled(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read whether the adaptive filter is enabled.
Definition as5047u.ipp:323
void DumpStatus() const
Dump formatted status and diagnostics using printf.
Definition as5047u.ipp:710
bool SetZeroPosition(uint16_t angle_lsb, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set a new zero reference position (soft offset).
Definition as5047u.ipp:209
bool SetAngleOutputSource(AS5047U_REG::SETTINGS2::AngleOutputSource source, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Select which angle register (0x3FFF) is returned on reads.
Definition as5047u.ipp:480
bool SetFilterParameters(uint8_t k_min, uint8_t k_max, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set adaptive filter parameters (K_min and K_max as 3-bit register codes).
Definition as5047u.ipp:287
int16_t GetVelocity(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read the current rotational velocity (signed 14-bit).
Definition as5047u.ipp:92
AS5047U_Error GetStickyErrorFlags() const
Retrieve and clear the accumulated sticky error flags.
Definition as5047u.ipp:454
AS5047U_REG::DIA GetDiagnostics() const
Read the full diagnostic register (DIA).
Definition as5047u.ipp:494
float GetAngleRadians(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read absolute angle in radians.
Definition as5047u.ipp:72
bool SetIndexPulseLength(uint8_t lsb_len, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set the index pulse width for ABI output.
Definition as5047u.ipp:236
float GetVelocityRadPerSec(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Get rotational velocity in radians per second.
Definition as5047u.ipp:129
uint8_t GetAGC(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read the current Automatic Gain Control (AGC) value (0-255).
Definition as5047u.ipp:139
constexpr FrameFormat DEFAULT_FRAME_FORMAT
Definition as5047u_config.hpp:20
constexpr uint8_t CRC_RETRIES
Definition as5047u_config.hpp:26
Definition as5047u.ipp:17
VelocityUnit
Units for velocity-returning APIs.
Definition as5047u.hpp:58
const char * GetDriverVersion() noexcept
Definition as5047u.hpp:529
AngleUnit
Units for angle-returning APIs.
Definition as5047u.hpp:51
DIA – Diagnostic register (0x3FF5, read-only)
Definition as5047u_registers.hpp:180
AngleOutputSource
Angle data source for 0x3FFF output (Data_select bit)
Definition as5047u_registers.hpp:644
Hysteresis
Incremental output hysteresis (HYS) settings:
Definition as5047u_registers.hpp:714
Angle conversion helpers.
Definition as5047u.hpp:173
static constexpr uint16_t RadiansToLsb(float radians) noexcept
Definition as5047u.hpp:181
static constexpr float RAD_PER_LSB
Definition as5047u.hpp:175
static constexpr uint16_t DegreesToLsb(float degrees) noexcept
Definition as5047u.hpp:177
static constexpr float DEG_PER_LSB
Definition as5047u.hpp:174
Helper constants and methods for velocity unit conversions.
Definition as5047u.hpp:187
static constexpr float RPM_PER_LSB
Definition as5047u.hpp:190
static constexpr float DEG_PER_LSB
Definition as5047u.hpp:188
static constexpr float RAD_PER_LSB
Definition as5047u.hpp:189