7#include "target_constants.h"
13 .
name =
"ODrive (M0)" ,
18 .
name =
"ODrive (M1)" ,
69 uint32_t filter_id = (
nodeId & 0x3F) << 5;
70 uint32_t filter_mask = 0x07E0;
93 uint16_t setting1addr = ADR_ODRIVE_SETTING1_M0;
95 uint16_t canIds = 0x3040;
100 nodeId = (canIds >> 6) & 0x3f;
101 setting1addr = ADR_ODRIVE_SETTING1_M1;
106 uint16_t settings1 = 0;
108 maxTorque = (float)
clip(settings1 & 0xfff, 0, 0xfff) / 100.0;
109 uint8_t settings1_2 = (settings1 >> 12) & 0xf;
115 if(
Flash_Read(
motorId == 0 ? ADR_ODRIVE_OFS_M0 : ADR_ODRIVE_OFS_M1, (uint16_t*)&posOfs)){
122 uint16_t setting1addr = ADR_ODRIVE_SETTING1_M0;
124 uint16_t canIds = 0x3040;
130 setting1addr = ADR_ODRIVE_SETTING1_M1;
132 canIds |= (
nodeId & 0x3f) << 6;
138 uint16_t settings1 = ((int32_t)(
maxTorque*100) & 0xfff);
140 settings1 |= (settings1_2 & 0xf) << 12;
231 return static_cast<Encoder*
>(
this);
273 sendMsg<float>(0x0E,
torque);
283 uint64_t mode = (uint64_t) controlMode | ((uint64_t)inputMode << 32);
319 replies.emplace_back((uint32_t)
errors);
357 replies.emplace_back(val);
390 uint16_t node = (msg.
header.
id >> 5) & 0x3F;
394 uint64_t msg_int = *
reinterpret_cast<uint64_t*
>(msg.
data);
403 errors = (msg_int & 0xffffffff);
417 uint64_t tp = msg_int & 0xffffffff;
420 uint64_t ts = (msg_int >> 32) & 0xffffffff;
431 uint64_t t = msg_int & 0xffffffff;
@ AXIS_STATE_ENCODER_OFFSET_CALIBRATION
@ AXIS_STATE_ENCODER_INDEX_SEARCH
@ AXIS_STATE_ENCODER_HALL_PHASE_CALIBRATION
@ AXIS_STATE_CLOSED_LOOP_CONTROL
@ AXIS_STATE_MOTOR_CALIBRATION
@ AXIS_STATE_FULL_CALIBRATION_SEQUENCE
@ CONTROL_MODE_TORQUE_CONTROL
virtual uint8_t getSpeedPreset()=0
virtual void setSpeedPreset(uint8_t preset)=0
virtual int32_t addCanFilter(CAN_filter filter)=0
virtual bool sendMessage(CAN_tx_msg &msg)=0
virtual void removeCanFilter(uint8_t filterId)=0
virtual void setSilentMode(bool silent)=0
void registerCommand(const char *cmd, const ID cmdid, const char *help=nullptr, uint32_t flags=0)
static CommandStatus handleGetSet(const ParsedCommand &cmd, std::vector< CommandReply > &replies, TVal &value)
const ClassIdentifier getInfo()
Command handlers always have class infos. Works well with ChoosableClass.
static bool isCreatable()
static ClassIdentifier info
static ClassIdentifier info
static bool isCreatable()
const ClassIdentifier getInfo()
Command handlers always have class infos. Works well with ChoosableClass.
void canRxPendCallback(CANPort *port, CAN_rx_msg &msg) override
void requestMsg(uint8_t cmd)
void setState(ODriveState state)
uint32_t lastVoltageUpdate
volatile ODriveLocalState state
void stopMotor() override
void setTorque(float torque)
void setPos(int32_t pos) override
void saveFlash() override
void restoreFlash() override
void turn(int16_t power) override
void canErrorCallback(CANPort *port, uint32_t errcode)
volatile uint32_t odriveMotorFlags
int32_t getPos() override
float getPos_f() override
Encoder * getEncoder() override
void startMotor() override
bool reloadPosAfterStartup
void sendMsg(uint8_t cmd, T value)
volatile uint32_t odriveEncoderFlags
bool motorReady() override
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies) override
void setMode(ODriveControlMode controlMode, ODriveInputMode inputMode)
volatile ODriveState odriveCurrentState
EncoderType getEncoderType() override
uint32_t getCpr() override
volatile uint32_t odriveControllerFlags
void Delay(const TickType_t Delay)
bool Flash_Write(uint16_t adr, uint16_t dat)
bool Flash_Read(uint16_t adr, uint16_t *buf, bool checkempty=true)
static void * memcpy(void *dst, const void *src, size_t n)
uint8_t data[CAN_MSGBUFSIZE]