This commit is contained in:
2024-05-10 02:39:53 +08:00
parent fd8c109b9a
commit d531b7cc09
116 changed files with 417 additions and 16489 deletions

View File

@@ -1,6 +1,29 @@
//
// Created by ZK on 2023/3/14.
//
//#include "main.h"
#include <stdbool.h>
#include "Controller.h"
#include "SVPWM/SVPWM.h"
tFOC FOC;
float uAlpha1;
float uBeta1;
bool Generate(float ud, float uq, float Theta) {
inversePark(ud, uq, Theta, &uAlpha1, &uBeta1);
if (0 == SVPWM(uAlpha1, uBeta1, &FOC.dtc_a, &FOC.dtc_b, &FOC.dtc_c)) {
// set_a_duty((uint16_t)(Foc.dtc_a * (float) HALF_PWM_PERIOD_CYCLES));
// set_b_duty((uint16_t)(Foc.dtc_b * (float) HALF_PWM_PERIOD_CYCLES));
// set_c_duty((uint16_t)(Foc.dtc_c * (float) HALF_PWM_PERIOD_CYCLES));
// TIM1->CCR1 = (uint16_t) FOC.dtc_a;
// TIM1->CCR2 = (uint16_t) FOC.dtc_b;
// TIM1->CCR3 = (uint16_t) FOC.dtc_c;
}
return FOC.dtc_a;
}

View File

@@ -5,4 +5,22 @@
#ifndef BOOOOMFOC_STSPIN32G4_EVB_CONTROLLER_H
#define BOOOOMFOC_STSPIN32G4_EVB_CONTROLLER_H
typedef struct sFOC
{
bool is_armed;
float v_bus, v_bus_filt, i_a, i_b, i_c;
float i_q, i_q_filt, i_d, i_d_filt, i_bus, i_bus_filt, power_filt;
float dtc_a, dtc_b, dtc_c;
float current_ctrl_p_gain, current_ctrl_i_gain;
float current_ctrl_integral_d, current_ctrl_integral_q;
} tFOC;
extern tFOC FOC;
extern bool Generate(float ud, float uq, float Theta);
#endif //BOOOOMFOC_STSPIN32G4_EVB_CONTROLLER_H

View File

@@ -5,33 +5,180 @@
#include "SVPWM.h"
inline int svpwm(float alpha, float beta, float *tA, float *tB, float *tC) {
#define SVM 1
extern uint16_t cycleNum;
#define SQRT3 1.732050808f
#define LIMIT (float32_t)(0.9f / SQRT3)
#define LIMIT_UDC 16.0f
#define TS 3400
#define SQRT3_MULT_TS (float32_t)((float32_t)TS * SQRT3)
uint8_t sectionMap[7] = {0, 2, 6, 1, 4, 3, 5};
float32_t uAlpha, uBeta;
float32_t ud, uq;
uint16_t channel1, channel2, channel3,udc=12;
float uAlpha, uBeta;
float32_t iAlpha, iBeta;
float32_t id, iq;
inline void inversePark(float ud, float uq, float Theta, float *uAlpha, float *uBeta) {
float s = sinf(Theta / 57.2958f);
float c = cosf(Theta / 57.2958f);
*uAlpha = ud * c - uq * s;
*uBeta = ud * s + uq * c;
}
#ifdef false
inline int SVPWM(float uAlpha, float uBeta, float *tA, float *tB, float *tC) {
float U1, U2, U3;
uint8_t a, b, c, n = 0;
U1 = uBeta;
U2 = (SQRT3 * uAlpha - uBeta) / 2;
U3 = (-SQRT3 * uAlpha - uBeta) / 2;
if (U1 > 0)
a = 1;
else
a = 0;
if (U2 > 0)
b = 1;
else
b = 0;
if (U3 > 0)
c = 1;
else
c = 0;
n = (c << 2) + (b << 1) + a;
switch (sectionMap[n])
{
case 0:
{
channel1 = TS / 2;
channel2 = TS / 2;
channel3 = TS / 2;
}
break;
case 1:
{
int16_t t4 = SQRT3 * TS * U2 / udc;
int16_t t6 = SQRT3 * TS * U1 / udc;
int16_t t0 = (TS - t4 - t6) / 2;
channel1 = t4 + t6 + t0;
channel2 = t6 + t0;
channel3 = t0;
}
break;
case 2:
{
int16_t t2 = -SQRT3 * TS * U2 / udc;
int16_t t6 = -SQRT3 * TS * U3 / udc;
int16_t t0 = (TS - t2 - t6) / 2;
channel1 = t6 + t0;
channel2 = t2 + t6 + t0;
channel3 = t0;
}
break;
case 3:
{
int16_t t2 = SQRT3 * TS * U1 / udc;
int16_t t3 = SQRT3 * TS * U3 / udc;
int16_t t0 = (TS - t2 - t3) / 2;
channel1 = t0;
channel2 = t2 + t3 + t0;
channel3 = t3 + t0;
}
break;
case 4:
{
int16_t t1 = -SQRT3 * TS * U1 / udc;
int16_t t3 = -SQRT3 * TS * U2 / udc;
int16_t t0 = (TS - t1 - t3) / 2;
channel1 = t0;
channel2 = t3 + t0;
channel3 = t1 + t3 + t0;
}
break;
case 5:
{
int16_t t1 = SQRT3 * TS * U3 / udc;
int16_t t5 = SQRT3 * TS * U2 / udc;
int16_t t0 = (TS - t1 - t5) / 2;
channel1 = t5 + t0;
channel2 = t0;
channel3 = t1 + t5 + t0;
}
break;
case 6:
{
int16_t t4 = -SQRT3 * TS * U3 / udc;
int16_t t5 = -SQRT3 * TS * U1 / udc;
int16_t t0 = (TS - t4 - t5) / 2;
channel1 = t4 + t5 + t0;
channel2 = t0;
channel3 = t5 + t0;
}
break;
default:
break;
}
*tA = channel1;
*tB = channel2;
*tC = channel3;
return 0;
}
#else
inline int SVPWM(float uAlpha, float uBeta, float *tA, float *tB, float *tC) {
int Sextant;
if (beta >= 0.0f) {
if (alpha >= 0.0f) {
if (uBeta >= 0.0f) {
if (uAlpha >= 0.0f) {
//quadrant I
if (ONE_BY_SQRT3 * beta > alpha)
if (ONE_BY_SQRT3 * uBeta > uAlpha)
Sextant = 2; //sextant v2-v3
else
Sextant = 1; //sextant v1-v2
} else {
//quadrant II
if (-ONE_BY_SQRT3 * beta > alpha)
if (-ONE_BY_SQRT3 * uBeta > uAlpha)
Sextant = 3; //sextant v3-v4
else
Sextant = 2; //sextant v2-v3
}
} else {
if (alpha >= 0.0f) {
if (uAlpha >= 0.0f) {
//quadrant IV
if (-ONE_BY_SQRT3 * beta > alpha)
if (-ONE_BY_SQRT3 * uBeta > uAlpha)
Sextant = 5; //sextant v5-v6
else
Sextant = 6; //sextant v6-v1
} else {
//quadrant III
if (ONE_BY_SQRT3 * beta > alpha)
if (ONE_BY_SQRT3 * uBeta > uAlpha)
Sextant = 4; //sextant v4-v5
else
Sextant = 5; //sextant v5-v6
@@ -42,8 +189,8 @@ inline int svpwm(float alpha, float beta, float *tA, float *tB, float *tC) {
// sextant v1-v2
case 1: {
// Vector on-times
float t1 = alpha - ONE_BY_SQRT3 * beta;
float t2 = TWO_BY_SQRT3 * beta;
float t1 = uAlpha - ONE_BY_SQRT3 * uBeta;
float t2 = TWO_BY_SQRT3 * uBeta;
// PWM timings
*tA = (1.0f - t1 - t2) * 0.5f;
@@ -55,8 +202,8 @@ inline int svpwm(float alpha, float beta, float *tA, float *tB, float *tC) {
// sextant v2-v3
case 2: {
// Vector on-times
float t2 = alpha + ONE_BY_SQRT3 * beta;
float t3 = -alpha + ONE_BY_SQRT3 * beta;
float t2 = uAlpha + ONE_BY_SQRT3 * uBeta;
float t3 = -uAlpha + ONE_BY_SQRT3 * uBeta;
// PWM timings
*tB = (1.0f - t2 - t3) * 0.5f;
@@ -68,8 +215,8 @@ inline int svpwm(float alpha, float beta, float *tA, float *tB, float *tC) {
// sextant v3-v4
case 3: {
// Vector on-times
float t3 = TWO_BY_SQRT3 * beta;
float t4 = -alpha - ONE_BY_SQRT3 * beta;
float t3 = TWO_BY_SQRT3 * uBeta;
float t4 = -uAlpha - ONE_BY_SQRT3 * uBeta;
// PWM timings
*tB = (1.0f - t3 - t4) * 0.5f;
@@ -81,8 +228,8 @@ inline int svpwm(float alpha, float beta, float *tA, float *tB, float *tC) {
// sextant v4-v5
case 4: {
// Vector on-times
float t4 = -alpha + ONE_BY_SQRT3 * beta;
float t5 = -TWO_BY_SQRT3 * beta;
float t4 = -uAlpha + ONE_BY_SQRT3 * uBeta;
float t5 = -TWO_BY_SQRT3 * uBeta;
// PWM timings
*tC = (1.0f - t4 - t5) * 0.5f;
@@ -94,8 +241,8 @@ inline int svpwm(float alpha, float beta, float *tA, float *tB, float *tC) {
// sextant v5-v6
case 5: {
// Vector on-times
float t5 = -alpha - ONE_BY_SQRT3 * beta;
float t6 = alpha - ONE_BY_SQRT3 * beta;
float t5 = -uAlpha - ONE_BY_SQRT3 * uBeta;
float t6 = uAlpha - ONE_BY_SQRT3 * uBeta;
// PWM timings
*tC = (1.0f - t5 - t6) * 0.5f;
@@ -107,8 +254,8 @@ inline int svpwm(float alpha, float beta, float *tA, float *tB, float *tC) {
// sextant v6-v1
case 6: {
// Vector on-times
float t6 = -TWO_BY_SQRT3 * beta;
float t1 = alpha + ONE_BY_SQRT3 * beta;
float t6 = -TWO_BY_SQRT3 * uBeta;
float t1 = uAlpha + ONE_BY_SQRT3 * uBeta;
// PWM timings
*tA = (1.0f - t6 - t1) * 0.5f;
@@ -119,10 +266,13 @@ inline int svpwm(float alpha, float beta, float *tA, float *tB, float *tC) {
}
// if any of the results becomes NaN, result_valid will evaluate to false
int result_valid =
*tA >= 0.0f && *tA <= 1.0f
&& *tB >= 0.0f && *tB <= 1.0f
&& *tC >= 0.0f && *tC <= 1.0f;
int result_valid = *tA >= 0.0f && *tA <= 1.0f && *tB >= 0.0f && *tB <= 1.0f && *tC >= 0.0f && *tC <= 1.0f;
return result_valid ? 0 : -1;
}
// TIM1->CCR1 = channelA;
// TIM1->CCR2 = channelB;
// TIM1->CCR3 = channelC;
}
#endif

View File

@@ -5,10 +5,28 @@
#ifndef BOOOOMFOC_STSPIN32G4_EVB_SVPWM_H
#define BOOOOMFOC_STSPIN32G4_EVB_SVPWM_H
#define M_PI (3.14159265358f)
#define M_2PI (6.28318530716f)
#define ONE_BY_SQRT3 (0.57735026919f)
#define TWO_BY_SQRT3 (2.0f * 0.57735026919f)
#define SQRT3_BY_2 (0.86602540378f)
#include "arm_math.h"
#define M_PI (3.14159265358f)
#define M_2PI (6.28318530716f)
#define ONE_BY_SQRT3 (0.57735026919f)
#define TWO_BY_SQRT3 (2.0f * 0.57735026919f)
#define SQRT3_BY_2 (0.86602540378f)
#define SQ(x) ((x) * (x))
#define ABS(x) ((x) > 0 ? (x) : -(x))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define CLAMP(x, lower, upper) (MIN(upper, MAX(x, lower)))
#define FLOAT_EQU(floatA, floatB) ((ABS((floatA) - (floatB))) < 0.000001f)
//extern inline void clarke_transform(float Ia, float Ib, float Ic, float *Ialpha, float *Ibeta);
//
//extern inline void park_transform(float Ialpha, float Ibeta, float Theta, float *Id, float *Iq);
extern void inversePark(float ud, float uq, float Theta, float *uAlpha, float *uBeta);
extern int SVPWM(float uAlpha, float uBeta, float *tA, float *tB, float *tC);
#endif //BOOOOMFOC_STSPIN32G4_EVB_SVPWM_H