7#include "target_constants.h"
13 .name =
"ODrive (M0)" ,
18 .name =
"ODrive (M1)" ,
51 if(
port->getSpeedPreset() < 3){
52 port->setSpeedPreset(3);
55 this->
port->setSilentMode(
false);
57 this->
port->takePort();
64 this->
port->freePort();
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);
248 port->sendMessage(msg);
283 uint64_t mode = (uint64_t) controlMode | ((uint64_t)inputMode << 32);
319 replies.emplace_back((uint32_t)
errors);
339 replies.emplace_back(
port->getSpeedPreset());
341 port->setSpeedPreset(std::max<uint8_t>(3,cmd.
val));
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
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)
CommandHandler(const char *clsname, uint16_t clsid, uint8_t instance=0)
const ClassIdentifier getInfo()
static bool isCreatable()
static ClassIdentifier info
static ClassIdentifier info
static bool isCreatable()
const ClassIdentifier getInfo()
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)
Thread(const std::string Name, uint16_t StackDepth, UBaseType_t Priority)
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]