mirror of https://github.com/rene-dev/stmbl.git
105 lines
1.8 KiB
C
105 lines
1.8 KiB
C
#include "dq_comp.h"
|
|
#include "commands.h"
|
|
#include "common.h"
|
|
#include "hal.h"
|
|
#include "math.h"
|
|
#include "defines.h"
|
|
#include "angle.h"
|
|
|
|
HAL_COMP(dq);
|
|
|
|
HAL_PIN(mode);
|
|
|
|
//U V W inputs
|
|
HAL_PIN(u);
|
|
HAL_PIN(v);
|
|
HAL_PIN(w);
|
|
|
|
//rotor position
|
|
HAL_PIN(pos);
|
|
HAL_PIN(polecount); //1
|
|
|
|
//a,b,gamma output
|
|
HAL_PIN(a);
|
|
HAL_PIN(b);
|
|
HAL_PIN(y);
|
|
|
|
//d,q output
|
|
HAL_PIN(d);
|
|
HAL_PIN(q);
|
|
|
|
static void rt_func(float period, void *ctx_ptr, hal_pin_inst_t *pin_ptr) {
|
|
// struct dq_ctx_t * ctx = (struct dq_ctx_t *)ctx_ptr;
|
|
struct dq_pin_ctx_t *pins = (struct dq_pin_ctx_t *)pin_ptr;
|
|
|
|
float u = PIN(u);
|
|
float v = PIN(v);
|
|
float w = PIN(w);
|
|
|
|
//clarke transformation
|
|
float a, b, y;
|
|
|
|
switch((int)PIN(mode)) {
|
|
case PHASE_90_3PH: // 90°
|
|
a = u - v;
|
|
b = w - v;
|
|
y = u / 3.0 + v / 3.0 + w / 3.0;
|
|
break;
|
|
|
|
case PHASE_120_3PH: // 120°
|
|
a = u * 2.0 / 3.0 - v / 3.0 - w / 3.0;
|
|
b = v / M_SQRT3 - w / M_SQRT3;
|
|
y = u / 3.0 + v / 3.0 + w / 3.0;
|
|
break;
|
|
|
|
case PHASE_180_2PH: // 180°
|
|
a = 0;
|
|
b = (u - w) / 2.0;
|
|
y = (u + w) / 2.0;
|
|
break;
|
|
|
|
case PHASE_180_3PH: // 180°
|
|
a = v;
|
|
b = (u - w) / 2.0;
|
|
y = (u + w) / 2.0;
|
|
break;
|
|
|
|
default:
|
|
a = 0.0;
|
|
b = 0.0;
|
|
y = 0.0;
|
|
}
|
|
|
|
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);
|
|
|
|
//park transformation
|
|
float d = a * co + b * si;
|
|
float q = -a * si + b * co;
|
|
|
|
PIN(a) = a;
|
|
PIN(b) = b;
|
|
PIN(y) = y;
|
|
|
|
PIN(d) = d;
|
|
PIN(q) = q;
|
|
}
|
|
|
|
hal_comp_t dq_comp_struct = {
|
|
.name = "dq",
|
|
.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 dq_pin_ctx_t) / sizeof(struct hal_pin_inst_t),
|
|
};
|