11#ifndef AS5047U_HEADER_INCLUDED
20template <
typename SpiType>
22 this->frame_format_ = format;
37template <
typename SpiType>
43template <
typename SpiType>
47 return static_cast<float>(GetAngle(retries));
49 return GetAngleDegrees(retries);
51 return GetAngleRadians(retries);
53 return static_cast<float>(GetAngle(retries));
57template <
typename SpiType>
59 return static_cast<float>(GetAngle(retries)) * Angle::DEG_PER_LSB;
62template <
typename SpiType>
64 return static_cast<float>(GetAngle(retries)) * Angle::RAD_PER_LSB;
67template <
typename SpiType>
73template <
typename SpiType>
77 return static_cast<int16_t
>((
static_cast<int16_t
>(v << 2)) >> 2);
80template <
typename SpiType>
84 return static_cast<float>(GetVelocity(retries));
86 return GetVelocityDegPerSec(retries);
88 return GetVelocityRadPerSec(retries);
90 return GetVelocityRPM(retries);
92 return static_cast<float>(GetVelocity(retries));
96template <
typename SpiType>
98 return GetVelocity(retries) * Velocity::DEG_PER_LSB;
101template <
typename SpiType>
103 return GetVelocity(retries) * Velocity::RAD_PER_LSB;
106template <
typename SpiType>
108 return GetVelocity(retries) * Velocity::RPM_PER_LSB;
111template <
typename SpiType>
117template <
typename SpiType>
123template <
typename SpiType>
128 for (uint8_t i = 0; i <= retries; ++i) {
139template <
typename SpiType>
147 return static_cast<uint16_t
>((m << 6) | l);
150template <
typename SpiType>
156 return this->WriteReg(m, retries) && this->WriteReg(l, retries);
159template <
typename SpiType>
161 resolution_bits = std::clamp(resolution_bits, uint8_t(10), uint8_t(14));
163 static constexpr uint8_t kBitsToAbires[] = {2, 1, 0, 3, 4};
165 if (!this->ReadReg(s3, retries)) {
168 s3.
bits.
ABIRES = kBitsToAbires[resolution_bits - 10];
169 return this->WriteReg(s3, retries);
172template <
typename SpiType>
174 pairs = std::clamp(pairs, uint8_t(1), uint8_t(7));
176 if (!this->ReadReg(s3, retries)) {
179 s3.
bits.
UVWPP =
static_cast<uint8_t
>(pairs - 1);
180 return this->WriteReg(s3, retries);
183template <
typename SpiType>
186 if (!this->ReadReg(s2, retries)) {
190 return this->WriteReg(s2, retries);
204template <
typename SpiType>
207 if (!this->ReadReg(dis, retries)) {
211 if (!this->ReadReg(s2, retries)) {
214 dis.
bits.ABI_off = abi ? 0 : 1;
215 dis.
bits.UVW_off = uvw ? 0 : 1;
219 }
else if (!abi && uvw) {
226 return this->WriteReg(dis, retries) && this->WriteReg(s2, retries);
229template <
typename SpiType>
232 if (!this->ReadReg(s2, retries)) {
236 return this->WriteReg(s2, retries);
239template <
typename SpiType>
242 if (!this->ReadReg(dis, retries)) {
246 return this->WriteReg(dis, retries);
249template <
typename SpiType>
251 k_min = std::min(k_min, uint8_t(7));
252 k_max = std::min(k_max, uint8_t(7));
254 if (!this->ReadReg(s1, retries)) {
258 s1.bits.K_max = k_max;
259 return this->WriteReg(s1, retries);
262template <
typename SpiType>
264 if (!SetAdaptiveFilter(
true, retries)) {
269 uint8_t k_min_code = 0;
270 uint8_t k_max_code = 0;
285 return SetFilterParameters(k_min_code, k_max_code, retries);
288template <
typename SpiType>
292 return (dis.bits.FILTER_disable == 0);
295template <
typename SpiType>
299 return {
static_cast<uint8_t
>(s1.bits.K_min),
static_cast<uint8_t
>(s1.bits.K_max)};
302template <
typename SpiType>
305 if (!this->ReadReg(s2, retries)) {
309 return this->WriteReg(s2, retries);
312template <
typename SpiType>
315 OtpResult& r = (result !=
nullptr) ? *result : local;
322 const bool ok = programOtpSteps(r);
323 frame_format_ = saved;
327template <
typename SpiType>
329 uint8_t retries)
const {
331 if (!readWithRetries(
static_cast<uint16_t
>(
kOtpFirstAddress + i), retries, regs[i])) {
344template <
typename SpiType>
345bool AS5047U<SpiType>::programOtpSteps(OtpResult& r) {
351 const auto fail = [&r](uint8_t step) {
352 r.failed_step = step;
363 if (!ReadReg(zposl, kRetries)) {
366 zposl.bits.ZPOSL_bits = angle & 0x3FU;
369 if (!WriteReg(zposl, kRetries) || !WriteReg(zposm, kRetries)) {
373 std::array<uint16_t, kOtpRegisterCount> expected{};
374 if (!readOtpRegisters(expected, kRetries)) {
380 if (!WriteReg(ecc, kRetries)) {
385 if (!ReadReg(key, kRetries)) {
389 ecc.bits.ECC_chsum = key.bits.ECC_s;
390 if (!WriteReg(ecc, kRetries)) {
393 expected[kZposl] = zposl.value;
394 expected[kZposm] = zposm.value;
395 expected[kEcc] = ecc.value;
397 std::array<uint16_t, kOtpRegisterCount> step1{};
398 if (!readOtpRegisters(step1, kRetries)) {
402 if (step1 != expected) {
407 if (!writeRegister(kProg, 0x0001, kRetries)) {
412 r.burn_started =
true;
413 if (!writeRegister(kProg, 0x0008, 0,
false)) {
417 bool complete =
false;
418 for (uint32_t i = 0; i < kOtpPollLimit && !complete; ++i) {
420 complete = readRegister(kProg, prog) && prog == 0x0001;
427 if (!writeRegister(
static_cast<uint16_t
>(
kOtpFirstAddress + i), 0x0000, kRetries)) {
432 if (!writeRegister(kProg, 0x0040, 0,
false)) {
436 if (!writeRegister(kProg, 0x0004, 0,
false)) {
440 std::array<uint16_t, kOtpRegisterCount> step2{};
441 if (!readOtpRegisters(step2, kRetries)) {
445 if (step2 != r.written) {
451template <
typename SpiType>
453 uint8_t retries)
const {
454 std::array<uint16_t, kOtpRegisterCount> now{};
455 return readOtpRegisters(now, retries) && now == burned;
458template <
typename SpiType>
461 if (err_fl & (1u << 0))
463 if (err_fl & (1u << 1))
465 if (err_fl & (1u << 2))
467 if (err_fl & (1u << 3))
469 if (err_fl & (1u << 4))
471 if (err_fl & (1u << 5))
473 if (err_fl & (1u << 6))
475 if (err_fl & (1u << 7))
477 if (err_fl & (1u << 9))
479 if (err_fl & (1u << 10))
483template <
typename SpiType>
488template <
typename SpiType>
490 return static_cast<AS5047U_Error>(sticky_errors_.exchange(0));
494template <
typename SpiType>
496 this->pad_byte_ = pad;
499template <
typename SpiType>
503 if (!this->ReadReg(s3, retries)) {
506 s3.
bits.
HYS =
static_cast<uint8_t
>(hysteresis);
507 return this->WriteReg(s3, retries);
510template <
typename SpiType>
512 auto s3 = this->
template ReadReg<AS5047U_REG::SETTINGS3>();
516template <
typename SpiType>
520 if (!this->ReadReg(s2, retries)) {
524 return this->WriteReg(s2, retries);
527template <
typename SpiType>
529 auto s2 = this->
template ReadReg<AS5047U_REG::SETTINGS2>();
533template <
typename SpiType>
535 return this->
template ReadReg<AS5047U_REG::DIA>();
560template <
typename SpiType>
562 bool inspect)
const {
574 tx[o] =
static_cast<uint8_t
>(word >> 8);
575 tx[o + 1] =
static_cast<uint8_t
>(word & 0xFF);
577 tx[o + 2] = ComputeCRC8(word);
584 reply =
static_cast<uint16_t
>((
static_cast<uint16_t
>(rx[0]) << 8) | rx[1]);
587 if ((reply & kReplyWarningBit) != 0U) {
590 if ((reply & kReplyErrorBit) != 0U) {
594 if (inspect && !crc_ok) {
603template <
typename SpiType>
604bool AS5047U<SpiType>::rawReadRegister(uint16_t address, uint16_t& value)
const {
607 transferFrame(frame_format_,
static_cast<uint16_t
>(kReadBit | (address & 0x3FFF)), reply) &&
609 value = ok ?
static_cast<uint16_t
>(reply & 0x3FFF) : 0U;
617template <
typename SpiType>
618bool AS5047U<SpiType>::readRegister(uint16_t address, uint16_t& value)
const {
619 if (!rawReadRegister(address, value)) {
623 updateStickyErrors(value);
630 updateStickyErrors(err);
631 return (err & kRetryMask) == 0U;
634template <
typename SpiType>
635uint16_t AS5047U<SpiType>::readRegister(uint16_t address)
const {
637 (void)readRegister(address, value);
641template <
typename SpiType>
642bool AS5047U<SpiType>::readWithRetries(uint16_t address, uint8_t retries, uint16_t& value)
const {
643 for (uint8_t i = 0; i <= retries; ++i) {
644 if (readRegister(address, value)) {
651template <
typename SpiType>
652uint16_t AS5047U<SpiType>::readWithRetries(uint16_t address, uint8_t retries)
const {
654 (void)readWithRetries(address, retries, value);
658template <
typename SpiType>
659bool AS5047U<SpiType>::writeRegister(uint16_t address, uint16_t value, uint8_t retries,
671 const uint16_t expected = value & 0x3FFF;
672 for (uint8_t attempt = 0; attempt <= retries; ++attempt) {
674 const bool sent = transferFrame(format, address & 0x3FFF, reply) &&
675 transferFrame(format, expected, reply,
true) &&
677 const uint16_t read_back = reply & 0x3FFF;
678 if (sent && verify && read_back == expected) {
685 if (!verify && sent && errfl_ok && (errfl & kCommandErrorMask) == 0U) {
697template <
typename SpiType>
699 printf(
"\n=== AS5047U Comprehensive Status ===\n");
701 printf(
"Angle (COM) : %u\n", GetAngle());
702 printf(
"Angle (UNC) : %u\n", GetRawAngle());
703 printf(
"Velocity : %d counts (%.3f deg/s, %.3f rad/s, %.3f RPM)\n", GetVelocity(),
704 GetVelocityDegPerSec(), GetVelocityRadPerSec(), GetVelocityRPM());
705 printf(
"AGC : %u\n", GetAGC());
706 printf(
"Magnitude : %u\n", GetMagnitude());
708 uint16_t err = GetErrorFlags();
709 printf(
"ERRFL : 0x%04X\n", err);
711 auto dia = this->
template ReadReg<AS5047U_REG::DIA>();
712 printf(
"DIA (0x3FF5): 0x%04X\n", dia.value);
713 printf(
" VDD_mode : %u\n", dia.bits.VDD_mode);
714 printf(
" LoopsFinished : %u\n", dia.bits.LoopsFinished);
715 printf(
" CORDIC_overflow : %u\n", dia.bits.CORDIC_overflow_flag);
716 printf(
" Comp_l : %u\n", dia.bits.Comp_l);
717 printf(
" Comp_h : %u\n", dia.bits.Comp_h);
718 printf(
" MagHalf_flag : %u\n", dia.bits.MagHalf_flag);
719 printf(
" CosOff_fin : %u\n", dia.bits.CosOff_fin);
720 printf(
" SinOff_fin : %u\n", dia.bits.SinOff_fin);
721 printf(
" OffComp_finished : %u\n", dia.bits.OffComp_finished);
722 printf(
" AGC_finished : %u\n", dia.bits.AGC_finished);
723 printf(
" SPI_cnt : %u\n", dia.bits.SPI_cnt);
725 auto dis = this->
template ReadReg<AS5047U_REG::DISABLE>();
726 printf(
"DISABLE (0x0015): 0x%04X UVW_off=%u ABI_off=%u FILTER_disable=%u\n", dis.value,
727 dis.bits.UVW_off, dis.bits.ABI_off, dis.bits.FILTER_disable);
728 auto s1 = this->
template ReadReg<AS5047U_REG::SETTINGS1>();
729 printf(
"SETTINGS1(0x0016): K_max=%u K_min=%u Dia3_en=%u Dia4_en=%u\n", s1.bits.K_max,
730 s1.bits.K_min, s1.bits.Dia3_en, s1.bits.Dia4_en);
731 auto s2 = this->
template ReadReg<AS5047U_REG::SETTINGS2>();
732 printf(
"SETTINGS2(0x0019): IWIDTH=%u NOISESET=%u DIR=%u UVW_ABI=%u "
733 "DAECDIS=%u ABI_DEC=%u "
734 "Data_select=%u PWMon=%u\n",
735 s2.bits.IWIDTH, s2.bits.NOISESET, s2.bits.DIR, s2.bits.UVW_ABI, s2.bits.DAECDIS,
736 s2.bits.ABI_DEC, s2.bits.Data_select, s2.bits.PWMon);
737 auto s3 = this->
template ReadReg<AS5047U_REG::SETTINGS3>();
738 printf(
"SETTINGS3(0x001A): UVWPP=%u HYS=%u ABIRES=%u\n", s3.bits.UVWPP, s3.bits.HYS,
741 auto sind = this->
template ReadReg<AS5047U_REG::SINDATA>();
742 printf(
"SINDATA(0x3FFA): %d\n", sind.bits.SINDATA);
743 auto eccsum = this->
template ReadReg<AS5047U_REG::ECC_Checksum>();
744 printf(
"ECC_Checksum(0x3FD0): %u\n", eccsum.bits.ECC_s);
745 auto prog = this->
template ReadReg<AS5047U_REG::PROG>();
746 printf(
"PROG(0x0003): PROGEN=%u PROGOTP=%u OTPREF=%u PROGVER=%u\n", prog.bits.PROGEN,
747 prog.bits.PROGOTP, prog.bits.OTPREF, prog.bits.PROGVER);
749 printf(
"FrameFormat : %u PadByte=0x%02X\n",
static_cast<uint8_t
>(this->frame_format_),
751 printf(
"========================================\n\n");
Driver for AMS AS5047U Magnetic Rotary Position Sensor (C++21)
AS5047U_Error
Definition as5047u.hpp:21
@ CommandError
Invalid SPI command received.
@ BusError
Driver: the port's transfer() reported a bus error.
@ P2ramWarning
ECC corrected 1 bit in P2RAM customer area.
@ OffCompError
Internal offset compensation not finished.
@ P2ramError
ECC detected 2+ uncorrectable errors in P2RAM.
@ ReplyError
Chip: error bit set in a MISO frame (DS Figures 22, 25, 28)
@ ReplyCrcError
Driver: the CRC of a 24/32-bit MISO frame was wrong.
@ AgcWarning
AGC reached minimum (0) or maximum (255) value.
@ ReplyWarning
Chip: warning bit set in a MISO frame (DS Figures 22, 25, 28)
@ 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.
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:114
float GetVelocityDegPerSec(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Get rotational velocity in degrees per second.
Definition as5047u.ipp:97
bool SetAdaptiveFilter(bool enable, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Enable/disable the adaptive filter (Dynamic Filter System).
Definition as5047u.ipp:240
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:68
void SetPad(uint8_t pad) noexcept
Set the daisy-chain pad byte for 32-bit SPI frames.
Definition as5047u.ipp:495
AS5047U_REG::SETTINGS3::Hysteresis GetHysteresis() const
Get current incremental output hysteresis setting.
Definition as5047u.ipp:511
uint16_t GetMagnitude(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read the current magnetic field magnitude (14-bit value).
Definition as5047u.ipp:118
uint16_t GetErrorFlags(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read the ERRFL register (0x0001) from the chip.
Definition as5047u.ipp:124
bool SetDynamicAngleCompensation(bool enable, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Enable/disable Dynamic Angle Error Compensation (DAEC).
Definition as5047u.ipp:230
AS5047U_REG::SETTINGS2::AngleOutputSource GetAngleOutputSource() const
Get currently selected angle output source for 0x3FFF reads.
Definition as5047u.ipp:528
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:263
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:205
float GetVelocityRPM(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Get rotational velocity in revolutions per minute.
Definition as5047u.ipp:107
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:160
bool VerifyOTP(const std::array< uint16_t, kOtpRegisterCount > &burned, uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Steps 21 and 22 of the OTP procedure: after the power-on cycle (step 20), read DISABLE....
Definition as5047u.ipp:452
float GetAngleDegrees(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read absolute angle in degrees.
Definition as5047u.ipp:58
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:173
uint16_t GetZeroPosition(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Get the currently configured soft zero position offset (14-bit).
Definition as5047u.ipp:140
bool Set150CTemperatureMode(bool enable, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set temperature mode for 150°C operation (NOISESET bit).
Definition as5047u.ipp:303
bool SetHysteresis(AS5047U_REG::SETTINGS3::Hysteresis hysteresis, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set incremental output hysteresis level.
Definition as5047u.ipp:500
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:296
bool GetAdaptiveFilterEnabled(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read whether the adaptive filter is enabled.
Definition as5047u.ipp:289
void DumpStatus() const
Dump formatted status and diagnostics using printf.
Definition as5047u.ipp:698
bool SetZeroPosition(uint16_t angle_lsb, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set a new zero reference position (soft offset).
Definition as5047u.ipp:151
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:517
AS5047U_Error ClearStickyErrorFlags() noexcept
Clear the sticky error flags.
Definition as5047u.ipp:489
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:250
bool ProgramOTP(OtpResult *result=nullptr)
Permanently program the current settings into OTP memory.
Definition as5047u.ipp:313
int16_t GetVelocity(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read the current rotational velocity (signed 14-bit).
Definition as5047u.ipp:74
AS5047U_Error GetStickyErrorFlags() const noexcept
Error flags accumulated since the last ClearStickyErrorFlags().
Definition as5047u.ipp:484
AS5047U_REG::DIA GetDiagnostics() const
Read the full diagnostic register (DIA).
Definition as5047u.ipp:534
float GetAngleRadians(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read absolute angle in radians.
Definition as5047u.ipp:63
bool SetIndexPulseLength(uint8_t lsb_len, uint8_t retries=AS5047U_CFG::CRC_RETRIES)
Set the index pulse width for ABI output.
Definition as5047u.ipp:184
float GetVelocityRadPerSec(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Get rotational velocity in radians per second.
Definition as5047u.ipp:102
uint8_t GetAGC(uint8_t retries=AS5047U_CFG::CRC_RETRIES) const
Read the current Automatic Gain Control (AGC) value (0-255).
Definition as5047u.ipp:112
constexpr uint8_t CRC_RETRIES
Definition as5047u_config.hpp:26
bool Transfer(Port &port, const uint8_t *tx, uint8_t *rx, std::size_t len)
Call the port's transfer() and return its status.
Definition as5047u_spi_interface.hpp:66
Definition as5047u.hpp:52
VelocityUnit
Units for velocity-returning APIs.
Definition as5047u.hpp:89
constexpr std::size_t kOtpRegisterCount
Number of non-volatile registers burned into OTP: DISABLE (0x0015) to ECC (0x001B).
Definition as5047u.hpp:55
constexpr uint16_t kOtpFirstAddress
First non-volatile register address (DISABLE).
Definition as5047u.hpp:57
AngleUnit
Units for angle-returning APIs.
Definition as5047u.hpp:82
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:216
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:378
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:331
DIA – Diagnostic register (0x3FF5, read-only)
Definition as5047u_registers.hpp:180
DISABLE – Outputs and filter disable register (0x0015, default 0x0000)
Definition as5047u_registers.hpp:439
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:440
struct AS5047U_REG::DISABLE::@36::@38 bits
uint16_t FILTER_disable
Definition as5047u_registers.hpp:447
ECC_Checksum – ECC checksum register (0x3FD0, default 0x0000)
Definition as5047u_registers.hpp:351
ECC – ECC Settings register (0x001B, default 0x0000)
Definition as5047u_registers.hpp:750
uint16_t ECC_en
Definition as5047u_registers.hpp:756
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:751
struct AS5047U_REG::ECC::@54::@56 bits
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:81
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:307
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:42
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:133
SETTINGS1 – Custom setting register 1 (0x0018, default 0x0000)
Definition as5047u_registers.hpp:533
uint16_t K_min
Definition as5047u_registers.hpp:539
struct AS5047U_REG::SETTINGS1::@45::@47 bits
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:534
SETTINGS2 – Custom setting register 2 (0x0019, default 0x0000)
Definition as5047u_registers.hpp:597
AngleOutputSource
Angle data source for 0x3FFF output (Data_select bit)
Definition as5047u_registers.hpp:644
uint16_t Data_select
Definition as5047u_registers.hpp:608
struct AS5047U_REG::SETTINGS2::@48::@50 bits
uint16_t DAECDIS
Definition as5047u_registers.hpp:606
uint16_t IWIDTH
Definition as5047u_registers.hpp:602
uint16_t UVW_ABI
Definition as5047u_registers.hpp:605
uint16_t NOISESET
Definition as5047u_registers.hpp:603
SETTINGS3 – Custom setting register 3 (0x001A, default 0x0000)
Definition as5047u_registers.hpp:691
uint16_t HYS
Definition as5047u_registers.hpp:697
Hysteresis
Incremental output hysteresis (HYS) settings:
Definition as5047u_registers.hpp:714
uint16_t UVWPP
Definition as5047u_registers.hpp:696
struct AS5047U_REG::SETTINGS3::@51::@53 bits
uint16_t ABIRES
Definition as5047u_registers.hpp:698
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:282
ZPOSL – Zero Position LSB register (0x0017, default 0x0000)
Definition as5047u_registers.hpp:505
struct AS5047U_REG::ZPOSL::@42::@44 bits
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:506
uint16_t ZPOSL_bits
Definition as5047u_registers.hpp:510
ZPOSM – Zero Position MSB register (0x0016, default 0x0000)
Definition as5047u_registers.hpp:482
struct AS5047U_REG::ZPOSM::@39::@41 bits
uint16_t ZPOSM_bits
Definition as5047u_registers.hpp:487
static constexpr uint16_t ADDRESS
Definition as5047u_registers.hpp:483
Outcome of AS5047U::ProgramOTP().
Definition as5047u.hpp:65