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(pmsm_ttc);
// motor values
HAL_PIN(psi);
HAL_PIN(polecount);
// cogging torque ripple, constant
HAL_PIN(ac); // amplitude
HAL_PIN(pc); // phase
HAL_PIN(nc); // frequency
// electrical torque ripple, linear with current
HAL_PIN(ae); // amplitude
HAL_PIN(pe); // phase
HAL_PIN(ne); // frequency
HAL_PIN(pos_in);
HAL_PIN(pos_out);
HAL_PIN(t); // compensation torque
HAL_PIN(g); // compensation gain
HAL_PIN(block_gain); // block commutation gain
// torque cmd in
HAL_PIN(torque);
// cur cmd out
HAL_PIN(cur);
static void nrt_init(volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) {
// struct sim_ctx_t * ctx = (struct sim_ctx_t *)ctx_ptr;
struct pmsm_ttc_pin_ctx_t *pins = (struct pmsm_ttc_pin_ctx_t *)pin_ptr;
PIN(nc) = 1.0;
PIN(ne) = 1.0;
PIN(block_gain) = 0.0;
}
static void rt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) {
// struct pmsm_ttc_ctx_t * ctx = (struct pmsm_ttc_ctx_t *)ctx_ptr;
struct pmsm_ttc_pin_ctx_t *pins = (struct pmsm_ttc_pin_ctx_t *)pin_ptr;
float p = MAX(PIN(polecount), 1.0);
float psi_m = MAX(PIN(psi), 0.01);
float torque = PIN(torque);
float pos = PIN(pos_in);
float tc = PIN(ac) * sinf(PIN(pc) + pos * PIN(nc));
float te = torque * PIN(ae) * sinf(PIN(pe) + pos * PIN(ne));
PIN(pos_out) = pos * (1.0 - PIN(block_gain)) + (((int)((pos / 2.0 / M_PI + 0.5) * 6 + 0.5)) / 6.0 * 2.0 * M_PI - M_PI) * PIN(block_gain);
PIN(t) = tc + te;
PIN(cur) = (torque + PIN(g) * (tc + te)) / 3.0 * 2.0 / p / psi_m;
}
hal_comp_t pmsm_ttc_comp_struct = {
.name = "pmsm_ttc",
.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 = 0,
.pin_count = sizeof(struct pmsm_ttc_pin_ctx_t) / sizeof(struct hal_pin_inst_t),
};