Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
b11ddf64fThis file is pinned to the selected release. Download the original to open it in your design tool.
#include "commands.h"
#include "hal.h"
#include "math.h"
#include "defines.h"
#include "angle.h"
HAL_COMP(vel);
HAL_PIN(pos_in);
HAL_PIN(pos_out);
HAL_PIN(vel);
HAL_PIN(acc);
HAL_PIN(w);
HAL_PIN(d);
HAL_PIN(g);
HAL_PIN(h);
HAL_PIN(j);
HAL_PIN(lp);
HAL_PIN(torque);
HAL_PIN(vel_ff);
HAL_PIN(en);
HAL_PIN(pos_error);
struct vel_ctx_t {
float last_acc;
float acc_sum;
float vel_sum;
};
static void nrt_init(volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) {
// struct vel_ctx_t * ctx = (struct vel_ctx_t *)ctx_ptr;
struct vel_pin_ctx_t *pins = (struct vel_pin_ctx_t *)pin_ptr;
PIN(w) = 1000.0;
PIN(d) = 0.9;
PIN(g) = 1.0;
PIN(h) = 1.0;
PIN(j) = 0.00001;
PIN(lp) = 50.0;
PIN(en) = 1.0;
}
static void rt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) {
struct vel_ctx_t *ctx = (struct vel_ctx_t *)ctx_ptr;
struct vel_pin_ctx_t *pins = (struct vel_pin_ctx_t *)pin_ptr;
if(PIN(en) == 0.0) {
ctx->vel_sum = PIN(pos_in);
ctx->acc_sum = 0.0;
}
float vel_ff = PIN(vel_ff) * PIN(h);
ctx->vel_sum += (ctx->acc_sum + vel_ff) * period; // ff
float pos_error = minus(PIN(pos_in), ctx->vel_sum);
float w = PIN(w);
float d = PIN(d);
float g = PIN(g);
float lp = LP_HZ(PIN(lp));
float j = MAX(PIN(j), 0.0000001);
float acc = g * PIN(torque) / j;
ctx->last_acc = acc * lp + (1.0 - lp) * ctx->last_acc;
float acc_ff = acc - ctx->last_acc;
acc_ff += pos_error * w * w;
ctx->acc_sum += acc_ff * period;
PIN(vel) = ctx->acc_sum + vel_ff;
PIN(acc) = acc_ff;
vel_ff = 2.0 * d * w * pos_error;
ctx->vel_sum += vel_ff * period;
ctx->vel_sum = mod(ctx->vel_sum);
PIN(pos_out) = ctx->vel_sum;
PIN(pos_error) = minus(PIN(pos_in), ctx->vel_sum);
}
hal_comp_t vel_comp_struct = {
.name = "vel",
.nrt = 0,
.rt = rt_func,
.frt = 0,
.nrt_init = nrt_init,
.rt_start = 0,
.frt_start = 0,
.rt_stop = 0,
.frt_stop = 0,
.ctx_size = sizeof(struct vel_ctx_t),
.pin_count = sizeof(struct vel_pin_ctx_t) / sizeof(struct hal_pin_inst_t),
};