From c44dc241600493fda64aa0ae985b883b5fd789e4 Mon Sep 17 00:00:00 2001 From: Paul Guenette Date: Sat, 29 Apr 2023 12:49:21 -0700 Subject: [PATCH] Add Bourns EMS22A SPI encoder --- Arduino/ODriveArduino/ODriveEnums.h | 1 + Firmware/MotorControl/encoder.cpp | 6 ++++++ Firmware/odrive-interface.yaml | 3 +++ tools/odrive/enums.py | 2 ++ 4 files changed, 12 insertions(+) diff --git a/Arduino/ODriveArduino/ODriveEnums.h b/Arduino/ODriveArduino/ODriveEnums.h index 627c7b41..63527ec5 100644 --- a/Arduino/ODriveArduino/ODriveEnums.h +++ b/Arduino/ODriveArduino/ODriveEnums.h @@ -67,6 +67,7 @@ enum EncoderMode { ENCODER_MODE_SPI_ABS_AEAT = 258, ENCODER_MODE_SPI_ABS_RLS = 259, ENCODER_MODE_SPI_ABS_MA732 = 260, + ENCODER_MODE_SPI_ABS_EMS22A = 261, }; // ODrive.Controller.ControlMode diff --git a/Firmware/MotorControl/encoder.cpp b/Firmware/MotorControl/encoder.cpp index 73771c34..08194313 100644 --- a/Firmware/MotorControl/encoder.cpp +++ b/Firmware/MotorControl/encoder.cpp @@ -494,6 +494,7 @@ void Encoder::sample_now() { case MODE_SPI_ABS_AEAT: case MODE_SPI_ABS_RLS: case MODE_SPI_ABS_MA732: + case MODE_SPI_ABS_EMS22A: { abs_spi_start_transaction(); // Do nothing @@ -595,6 +596,11 @@ void Encoder::abs_spi_cb(bool success) { pos = (rawVal >> 2) & 0x3fff; } break; + case MODE_SPI_ABS_EMS22A: { + uint16_t rawVal = abs_spi_dma_rx_[0]; + pos = (rawVal >> 6) & 0x03ff; + } break; + default: { set_error(ERROR_UNSUPPORTED_ENCODER_MODE); goto done; diff --git a/Firmware/odrive-interface.yaml b/Firmware/odrive-interface.yaml index 34cb09d0..9d60e4cb 100644 --- a/Firmware/odrive-interface.yaml +++ b/Firmware/odrive-interface.yaml @@ -1599,6 +1599,9 @@ valuetypes: SPI_ABS_MA732: value: 0x104 doc: MagAlpha MA732 magnetic encoder + SPI_ABS_EMS22A: + value: 0x105 + doc: Bourns EMS22A Non-Contacting Absolute Encoder ODrive.Controller.ControlMode: values: diff --git a/tools/odrive/enums.py b/tools/odrive/enums.py index 365facb8..5ee3d3a2 100644 --- a/tools/odrive/enums.py +++ b/tools/odrive/enums.py @@ -56,6 +56,7 @@ ENCODER_MODE_SPI_ABS_AMS = 257 ENCODER_MODE_SPI_ABS_AEAT = 258 ENCODER_MODE_SPI_ABS_RLS = 259 ENCODER_MODE_SPI_ABS_MA732 = 260 +ENCODER_MODE_SPI_ABS_EMS22A = 261 # ODrive.Controller.ControlMode CONTROL_MODE_VOLTAGE_CONTROL = 0 @@ -214,6 +215,7 @@ class EncoderMode(enum.Enum): SPI_ABS_AEAT = 258 SPI_ABS_RLS = 259 SPI_ABS_MA732 = 260 + SPI_ABS_EMS22A = 261 class ControlMode(enum.Enum): VOLTAGE_CONTROL = 0 TORQUE_CONTROL = 1