Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
9590cb339This file is pinned to the selected release. Download the original to open it in your design tool.
#include "idq_comp.h"
#include "commands.h"
#include "common.h"
#include "hal.h"
#include "math.h"
#include "defines.h"
#include "angle.h"
HAL_COMP(idq);
HAL_PIN(mode);
//d,q inputs
HAL_PIN(d);
HAL_PIN(q);
//rotor position
HAL_PIN(pos);
HAL_PIN(polecount); //1
//a,b output
HAL_PIN(a);
HAL_PIN(b);
//U V W output
HAL_PIN(u);
HAL_PIN(v);
HAL_PIN(w);
static void rt_func(float period, void *ctx_ptr, hal_pin_inst_t *pin_ptr) {
// struct idq_ctx_t * ctx = (struct idq_ctx_t *)ctx_ptr;
struct idq_pin_ctx_t *pins = (struct idq_pin_ctx_t *)pin_ptr;
float d = PIN(d);
float q = PIN(q);
float p = (int)MAX(PIN(polecount), 1.0);
float pos = PIN(pos) * p;
float si = 0.0;
float co = 0.0;
sincos_fast(pos, &si, &co);
//inverse park transformation
float a = d * co - q * si;
float b = d * si + q * co;
//inverse clarke transformation
float u, v, w;
switch((int)PIN(mode)) {
case PHASE_90_3PH: // 90°
u = a;
v = 0.0;
w = b;
break;
case PHASE_120_3PH: // 120°
u = a;
v = -a / 2.0 + b / 2.0 * M_SQRT3;
w = -a / 2.0 - b / 2.0 * M_SQRT3;
break;
case PHASE_180_2PH: // 180°
u = b / 2.0;
v = 0.0;
w = -b / 2.0;
break;
case PHASE_180_3PH: // 180°
u = b / 2.0;
v = a;
w = -b / 2.0;
break;
default:
u = 0.0;
v = 0.0;
w = 0.0;
}
PIN(a) = a;
PIN(b) = b;
PIN(u) = u;
PIN(v) = v;
PIN(w) = w;
}
hal_comp_t idq_comp_struct = {
.name = "idq",
.nrt = 0,
.rt = rt_func,
.frt = 0,
.nrt_init = 0,
.rt_start = 0,
.frt_start = 0,
.rt_stop = 0,
.frt_stop = 0,
.ctx_size = 0,
.pin_count = sizeof(struct idq_pin_ctx_t) / sizeof(struct hal_pin_inst_t),
};