mirror of
https://github.com/odriverobotics/ODrive.git
synced 2025-12-17 14:34:15 +08:00
Add more cyclic messages
This commit is contained in:
@@ -56,6 +56,14 @@ public:
|
||||
bool is_extended = false;
|
||||
uint32_t heartbeat_rate_ms = 100;
|
||||
uint32_t encoder_rate_ms = 10;
|
||||
uint32_t motor_error_rate_ms = 0;
|
||||
uint32_t encoder_error_rate_ms = 0;
|
||||
uint32_t controller_error_rate_ms = 0;
|
||||
uint32_t sensorless_error_rate_ms = 0;
|
||||
uint32_t encoder_count_rate_ms = 0;
|
||||
uint32_t iq_rate_ms = 0;
|
||||
uint32_t sensorless_rate_ms = 0;
|
||||
uint32_t bus_vi_rate_ms = 0;
|
||||
};
|
||||
|
||||
struct Config_t {
|
||||
@@ -101,6 +109,14 @@ public:
|
||||
struct CAN_t {
|
||||
uint32_t last_heartbeat = 0;
|
||||
uint32_t last_encoder = 0;
|
||||
uint32_t last_motor_error = 0;
|
||||
uint32_t last_encoder_error = 0;
|
||||
uint32_t last_controller_error = 0;
|
||||
uint32_t last_sensorless_error = 0;
|
||||
uint32_t last_encoder_count = 0;
|
||||
uint32_t last_iq = 0;
|
||||
uint32_t last_sensorless = 0;
|
||||
uint32_t last_bus_vi = 0;
|
||||
};
|
||||
|
||||
Axis(int axis_num,
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "can_simple.hpp"
|
||||
|
||||
#include <odrive_main.h>
|
||||
#include <functional>
|
||||
|
||||
bool CANSimple::init() {
|
||||
for (size_t i = 0; i < AXIS_COUNT; ++i) {
|
||||
@@ -398,26 +399,38 @@ uint32_t CANSimple::service_stack() {
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& a : axes) {
|
||||
MEASURE_TIME(a.task_times_.can_heartbeat) {
|
||||
if (a.config_.can.heartbeat_rate_ms > 0) {
|
||||
if ((now - a.can_.last_heartbeat) >= a.config_.can.heartbeat_rate_ms) {
|
||||
if (send_heartbeat(a))
|
||||
a.can_.last_heartbeat = now;
|
||||
struct periodic {
|
||||
const uint32_t& rate;
|
||||
uint32_t& last_time;
|
||||
bool (CANSimple::* callback)(const Axis& axis);
|
||||
};
|
||||
|
||||
for (auto& axis : axes) {
|
||||
std::array<periodic, 10> periodics = {{
|
||||
{axis.config_.can.heartbeat_rate_ms, axis.can_.last_heartbeat, &CANSimple::send_heartbeat},
|
||||
{axis.config_.can.encoder_rate_ms, axis.can_.last_encoder, &CANSimple::get_encoder_estimates_callback},
|
||||
{axis.config_.can.motor_error_rate_ms, axis.can_.last_motor_error, &CANSimple::get_motor_error_callback},
|
||||
{axis.config_.can.encoder_error_rate_ms, axis.can_.last_encoder_error, &CANSimple::get_encoder_error_callback},
|
||||
{axis.config_.can.controller_error_rate_ms, axis.can_.last_controller_error, &CANSimple::get_controller_error_callback},
|
||||
{axis.config_.can.sensorless_error_rate_ms, axis.can_.last_sensorless_error, &CANSimple::get_sensorless_error_callback},
|
||||
{axis.config_.can.encoder_count_rate_ms, axis.can_.last_encoder_count, &CANSimple::get_encoder_count_callback},
|
||||
{axis.config_.can.iq_rate_ms, axis.can_.last_iq, &CANSimple::get_iq_callback},
|
||||
{axis.config_.can.sensorless_rate_ms, axis.can_.last_sensorless, &CANSimple::get_sensorless_estimates_callback},
|
||||
{axis.config_.can.bus_vi_rate_ms, axis.can_.last_bus_vi, &CANSimple::get_bus_voltage_current_callback},
|
||||
}};
|
||||
|
||||
MEASURE_TIME(axis.task_times_.can_heartbeat) {
|
||||
for (auto& msg : periodics) {
|
||||
if (msg.rate > 0) {
|
||||
if ((now - msg.last_time) >= msg.rate) {
|
||||
if (std::invoke(msg.callback, this, axis)) {
|
||||
msg.last_time = now;
|
||||
}
|
||||
}
|
||||
|
||||
int nextAxisService = msg.last_time + msg.rate - now;
|
||||
nextServiceTime = std::min(nextServiceTime, static_cast<uint32_t>(std::max(0, nextAxisService)));
|
||||
}
|
||||
|
||||
int nextAxisService = a.can_.last_heartbeat + a.config_.can.heartbeat_rate_ms - now;
|
||||
nextServiceTime = std::min(nextServiceTime, static_cast<uint32_t>(std::max(0, nextAxisService)));
|
||||
}
|
||||
|
||||
if (a.config_.can.encoder_rate_ms > 0) {
|
||||
if ((now - a.can_.last_encoder) >= a.config_.can.encoder_rate_ms) {
|
||||
if (get_encoder_estimates_callback(a))
|
||||
a.can_.last_encoder = now;
|
||||
}
|
||||
|
||||
int nextAxisService = a.can_.last_encoder + a.config_.can.encoder_rate_ms - now;
|
||||
nextServiceTime = std::min(nextServiceTime, static_cast<uint32_t>(std::max(0, nextAxisService)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -600,6 +600,14 @@ interfaces:
|
||||
is_extended: bool
|
||||
heartbeat_rate_ms: uint32
|
||||
encoder_rate_ms: uint32
|
||||
motor_error_rate_ms: uint32
|
||||
encoder_error_rate_ms: uint32
|
||||
controller_error_rate_ms: uint32
|
||||
sensorless_error_rate_ms: uint32
|
||||
encoder_count_rate_ms: uint32
|
||||
iq_rate_ms: uint32
|
||||
sensorless_rate_ms: uint32
|
||||
bus_vi_rate_ms: uint32
|
||||
|
||||
ODrive.ThermistorCurrentLimiter:
|
||||
c_is_class: False
|
||||
|
||||
Reference in New Issue
Block a user