HPM SDK
HPMicro Software Development Kit
hpm_motor_math.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 #ifndef HPM_BLDC_MATH_H
8 #define HPM_BLDC_MATH_H
9 
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)
33 
38 #ifdef CONFIG_MATH_HAS_EXTRA_CONFIG
39 #include CONFIG_MATH_HAS_EXTRA_CONFIG
40 #endif
41 
42 #ifdef __cplusplus
43 extern "C"
44 {
45 #endif
46 
47 #ifndef HPM_MOTOR_MATH_MOD
48 #define HPM_MOTOR_MATH_MOD HPM_MOTOR_MATH_MOD_FP
49 #endif
50 
51 #ifndef HPM_QMATH_N
52 #define HPM_QMATH_N HPM_QMATH_MOD_Q31
53 #endif
54 
55 #ifndef HPM_SOFT_Q_N
56 #define HPM_SOFT_Q_N (15)
57 #endif
58 
59 #include <stdint.h>
60 #if HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_Q_SW
61  typedef int32_t HPM_MOTOR_MATH_TYPE;
62 #elif HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_Q_HW
63  #ifndef HPM_QMATH_N
64  #define HPM_QMATH_N HPM_QMATH_MOD_Q31
65  #endif
66  #if (HPM_QMATH_N == HPM_QMATH_MOD_Q15)
67  typedef int16_t HPM_MOTOR_MATH_TYPE;/*Q15格式*/
68  #elif (HPM_QMATH_N == HPM_QMATH_MOD_Q31)
69  typedef int32_t HPM_MOTOR_MATH_TYPE;/*Q31格式*/
70  #endif
71 #elif HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_DSP_FP
72  typedef float HPM_MOTOR_MATH_TYPE;
73 #elif HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_FP
74  typedef float HPM_MOTOR_MATH_TYPE;
75 #endif
76 
84 
92 
101 
110 
118 
127 
135 
144 
153 
161 
170 
178 
180 {
182  int64_t q64;
183  double x1 = x;
184  x1 *= (1 << HPM_SOFT_Q_N);
185  x1 += (x < 0.0f ? -0.5f : 0.5f);
186  q64 = (HPM_MOTOR_MATH_TYPE)x1;
187  if (q64 >= INT32_MAX) {
188  q64 = INT32_MAX;
189  } else if (q64 <= INT32_MIN) {
190  q64 = INT32_MIN;
191  } else {
192  q31 = (HPM_MOTOR_MATH_TYPE)q64;
193  }
194  return q31;
195 }
197 {
198  float val;
199  val = (double)x/(1<<HPM_SOFT_Q_N);
200  return val;
201 }
202 
203 #if HPM_MOTOR_MATH_MOD == HPM_MOTOR_MATH_MOD_Q_SW
204  /*软件*/
205 #if (HPM_QMATH_N != HPM_QMATH_MOD_Q31)
206  #error "SOFT Q_MATH only support q31"
207 #endif
208  #include <math.h>
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
216  /*Qmath*/
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)
224 
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
234  #include <math.h>
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)
242 #endif
243 
244 #ifdef __cplusplus
245 }
246 #endif
247 
253 #endif
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.