7 #ifndef HPM_BLDC_MATH_H
8 #define HPM_BLDC_MATH_H
21 #define HPM_MOTOR_MATH_MOD_Q_SW (1)
22 #define HPM_MOTOR_MATH_MOD_Q_HW (2)
23 #define HPM_MOTOR_MATH_MOD_DSP_FP (3)
24 #define HPM_MOTOR_MATH_MOD_Q_ALL (4)
25 #define HPM_MOTOR_MATH_MOD_FP (5)
31 #define HPM_QMATH_MOD_Q15 (15)
32 #define HPM_QMATH_MOD_Q31 (31)
38 #ifdef CONFIG_MATH_HAS_EXTRA_CONFIG
39 #include CONFIG_MATH_HAS_EXTRA_CONFIG
47 #ifndef HPM_MOTOR_MATH_MOD
48 #define HPM_MOTOR_MATH_MOD HPM_MOTOR_MATH_MOD_FP
52 #define HPM_QMATH_N HPM_QMATH_MOD_Q31
56 #define HPM_SOFT_Q_N (15)
60 #if HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_Q_SW
62 #elif HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_Q_HW
64 #define HPM_QMATH_N HPM_QMATH_MOD_Q31
66 #if (HPM_QMATH_N == HPM_QMATH_MOD_Q15)
68 #elif (HPM_QMATH_N == HPM_QMATH_MOD_Q31)
71 #elif HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_DSP_FP
73 #elif HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_FP
185 x1 += (x < 0.0f ? -0.5f : 0.5f);
187 if (q64 >= INT32_MAX) {
189 }
else if (q64 <= INT32_MIN) {
203 #if HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_Q_SW
205 #if (HPM_QMATH_N != HPM_QMATH_MOD_Q31)
206 #error "SOFT Q_MATH only support q31"
209 #define HPM_MOTOR_MATH_FL_MDF(from_f32) soft_conv_float_to_q31(from_f32)
210 #define HPM_MOTOR_MATH_MDF_FL(from_mdf) soft_conv_q31_to_float(from_mdf)
211 #define HPM_MOTOR_MATH_MUL(x, y) ((((int64_t)x)*y)>>HPM_SOFT_Q_N)
212 #define HPM_MOTOR_MATH_DIV(x, y) ((((int64_t)x)<<HPM_SOFT_Q_N)/y)
213 #define HPM_MOTOR_MATH_ATAN2(x, y) atan2f(x, y)
214 #define HPM_MOTOR_MATH_FABS(x) abs(x)
215 #elif HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_Q_HW
217 #define HPM_MOTOR_MATH_FL_MDF(from_f32) hpm_dsp_hw_f32_q(from_f32)
218 #define HPM_MOTOR_MATH_MDF_FL(from_mdf) hpm_dsp_hw_q_f32(from_mdf)
219 #define HPM_MOTOR_MATH_MUL(x, y) hpm_dsp_hw_mul_q(x, y)
220 #define HPM_MOTOR_MATH_DIV(x, y) hpm_dsp_hw_div_q(x, y)
221 #define HPM_MOTOR_MATH_ATAN2(x, y) hpm_dsp_hw_atan2_q(x, y)
222 #define HPM_MOTOR_MATH_ATAN(x) hpm_dsp_hw_atan_q(x)
223 #define HPM_MOTOR_MATH_FABS(x) hpm_dsp_hw_abs_q(x)
225 #elif HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_DSP_FP
226 #define HPM_MOTOR_MATH_FL_MDF(from_f32) (from_f32)
227 #define HPM_MOTOR_MATH_MDF_FL(from_mdf) (from_mdf)
228 #define HPM_MOTOR_MATH_MUL(x, y) hpm_dsp_hw_mul_fp(x, y)
229 #define HPM_MOTOR_MATH_DIV(x, y) hpm_dsp_hw_div_fp(x, y)
230 #define HPM_MOTOR_MATH_ATAN2(x, y) hpm_dsp_hw_atan2_fp(x, y)
231 #define HPM_MOTOR_MATH_ATAN(x) hpm_dsp_hw_atan_fp(x)
232 #define HPM_MOTOR_MATH_FABS(x) hpm_dsp_hw_abs_fp(x)
233 #elif HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_FP
235 #define HPM_MOTOR_MATH_FL_MDF(from_f32) (from_f32)
236 #define HPM_MOTOR_MATH_MDF_FL(from_mdf) (from_mdf)
237 #define HPM_MOTOR_MATH_MUL(x, y) (x*y)
238 #define HPM_MOTOR_MATH_DIV(x, y) (x/y)
239 #define HPM_MOTOR_MATH_ATAN2(x, y) atan2(x, y)
240 #define HPM_MOTOR_MATH_ATAN(x) atan(x)
241 #define HPM_MOTOR_MATH_FABS(x) abs(x)
static float soft_conv_q31_to_float(HPM_MOTOR_MATH_TYPE x)
Definition: hpm_motor_math.h:196
static HPM_MOTOR_MATH_TYPE soft_conv_float_to_q31(float x)
Definition: hpm_motor_math.h:179
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_abs_q(HPM_MOTOR_MATH_TYPE x)
Q-format absolute.
Definition: hpm_motor_math.c:77
float hpm_dsp_hw_q_f32(HPM_MOTOR_MATH_TYPE from_mdf)
Q format to floating point conversion.
Definition: hpm_motor_math.c:25
float HPM_MOTOR_MATH_TYPE
Definition: hpm_motor_math.h:74
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_f32_q(float from_f32)
Floating point to Q format conversion.
Definition: hpm_motor_math.c:13
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_mul_q(HPM_MOTOR_MATH_TYPE x, HPM_MOTOR_MATH_TYPE y)
Q-format multiplication.
Definition: hpm_motor_math.c:37
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_div_q(HPM_MOTOR_MATH_TYPE x, HPM_MOTOR_MATH_TYPE y)
Q-format division.
Definition: hpm_motor_math.c:48
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_abs_fp(HPM_MOTOR_MATH_TYPE x)
Floating-point absolute.
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_mul_fp(HPM_MOTOR_MATH_TYPE x, HPM_MOTOR_MATH_TYPE y)
Floating-point multiplication.
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_div_fp(HPM_MOTOR_MATH_TYPE x, HPM_MOTOR_MATH_TYPE y)
Floating-point division.
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_atan_q(HPM_MOTOR_MATH_TYPE x)
Q-format atan.
Definition: hpm_motor_math.c:59
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_atan2_fp(HPM_MOTOR_MATH_TYPE x, HPM_MOTOR_MATH_TYPE y)
Floating-point atan2.
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_atan2_q(HPM_MOTOR_MATH_TYPE x, HPM_MOTOR_MATH_TYPE y)
Q-format atan2.
Definition: hpm_motor_math.c:68
#define HPM_SOFT_Q_N
Definition: hpm_motor_math.h:56
HPM_MOTOR_MATH_TYPE hpm_dsp_hw_atan_fp(HPM_MOTOR_MATH_TYPE x)
Floating-point atan.