1 /*
2 * Copyright (c) 2023 HPMicro
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7 #ifndef HPM_MCL_LOOP_H
8 #define HPM_MCL_LOOP_H
9
10 #include "hpm_mcl_common.h"
11 #include "hpm_mcl_encoder.h"
12 #include "hpm_mcl_analog.h"
13 #include "hpm_mcl_control.h"
14 #include "hpm_mcl_drivers.h"
15 #include "hpm_mcl_path_plan.h"
16
17 typedef enum {
18 loop_status_null = 0,
19 loop_status_init = 1,
20 loop_status_run = 2,
21 loop_status_fail = 3,
22 } mcl_loop_status_t;
23
24 /**
25 * @brief Algorithms used in loops
26 *
27 */
28 typedef enum {
29 mcl_mode_foc = 1,
30 mcl_mode_block = 2,
31 mcl_mode_hardware_foc = 3,
32 mcl_mode_step_foc = 4,
33 } mcl_loop_mode_t;
34
35 /**
36 * @brief Loop Configuration
37 *
38 */
39 typedef struct {
40 mcl_loop_mode_t mode;
41 bool enable_speed_loop;
42 bool enable_position_loop;
43 } mcl_loop_cfg_t;
44
45 /**
46 * @brief Loop operation data
47 *
48 */
49 typedef struct {
50 mcl_loop_status_t status;
51 mcl_loop_cfg_t *cfg;
52 mcl_encoder_t *encoder;
53 mcl_analog_t *analog;
54 mcl_control_t *control;
55 mcl_drivers_t *drivers;
56 mcl_path_plan_t *path;
57 hpm_mcl_type_t *const_vbus;
58 struct {
59 float *current_ts;
60 float *speed_ts;
61 float *position_ts;
62 } const_time;
63 mcl_user_value_t ref_id;
64 mcl_user_value_t ref_iq;
65 mcl_user_value_t ref_speed;
66 mcl_user_value_t ref_position;
67 struct {
68 float id;
69 float iq;
70 float speed;
71 float position;
72 } exec_ref;
73 struct {
74 float speed_ts;
75 float position_ts;
76 } time;
77 void *hardware;
78 bool enable;
79 } mcl_loop_t;
80
81 #ifdef __cplusplus
82 extern "C" {
83 #endif
84
85 /**
86 * @brief Initialisation loop data
87 *
88 * @param loop @ref mcl_loop_t
89 * @param cfg @ref mcl_loop_cfg_t
90 * @param mcl_cfg @ref mcl_cfg_t
91 * @param encoder @ref mcl_encoder_t
92 * @param analog @ref mcl_analog_t
93 * @param control @ref mcl_control_t
94 * @param drivers @ref mcl_drivers_t
95 * @param path @ref mcl_path_plan_t
96 * @return hpm_mcl_stat_t
97 */
98 hpm_mcl_stat_t hpm_mcl_loop_init(mcl_loop_t *loop, mcl_loop_cfg_t *cfg, mcl_cfg_t *mcl_cfg,
99 mcl_encoder_t *encoder, mcl_analog_t *analog,
100 mcl_control_t *control, mcl_drivers_t *drivers, mcl_path_plan_t *path);
101
102 /**
103 * @brief Setting the d-axis current
104 *
105 * @param loop @ref mcl_loop_t
106 * @param id @ref mcl_user_value_t
107 * @return hpm_mcl_stat_t
108 */
109 hpm_mcl_stat_t hpm_mcl_loop_set_current_d(mcl_loop_t *loop, mcl_user_value_t id);
110
111 /**
112 * @brief Setting the q-axis current
113 *
114 * @param loop @ref mcl_loop_t
115 * @param iq @ref mcl_user_value_t
116 * @return hpm_mcl_stat_t
117 */
118 hpm_mcl_stat_t hpm_mcl_loop_set_current_q(mcl_loop_t *loop, mcl_user_value_t iq);
119
120 /**
121 * @brief Setting the speed loop speed feed
122 *
123 * @param loop @ref mcl_loop_t
124 * @param speed @ref mcl_user_value_t
125 * @return hpm_mcl_stat_t
126 */
127 hpm_mcl_stat_t hpm_mcl_loop_set_speed(mcl_loop_t *loop, mcl_user_value_t speed);
128
129 /**
130 * @brief Setting the position parameters
131 *
132 * @param loop @ref mcl_loop_t
133 * @param position @ref mcl_user_value_t
134 * @return hpm_mcl_stat_t
135 */
136 hpm_mcl_stat_t hpm_mcl_loop_set_position(mcl_loop_t *loop, mcl_user_value_t position);
137
138 /**
139 * @brief Invalid user-set values in all loops
140 *
141 * @param loop @ref mcl_loop_t
142 * @return hpm_mcl_stat_t
143 */
144 hpm_mcl_stat_t hpm_mcl_loop_disable_all_user_set_value(mcl_loop_t *loop);
145
146 /**
147 * @brief Motor Loop, Periodic Recall
148 *
149 * @param loop @ref mcl_loop_t
150 * @return hpm_mcl_stat_t
151 */
152 hpm_mcl_stat_t hpm_mcl_loop(mcl_loop_t *loop);
153
154 /**
155 * @brief Enable Loop
156 *
157 * @param loop @ref mcl_loop_t
158 */
hpm_mcl_loop_enable(mcl_loop_t * loop)159 static inline void hpm_mcl_loop_enable(mcl_loop_t *loop)
160 {
161 loop->enable = true;
162 }
163
164 /**
165 * @brief Disable Loop
166 *
167 * @param loop @ref mcl_loop_t
168 */
hpm_mcl_loop_disable(mcl_loop_t * loop)169 static inline void hpm_mcl_loop_disable(mcl_loop_t *loop)
170 {
171 loop->enable = false;
172 }
173
174 /**
175 * @brief Enable position loop
176 *
177 * @param loop @ref mcl_loop_t
178 */
hpm_mcl_enable_position_loop(mcl_loop_t * loop)179 static inline void hpm_mcl_enable_position_loop(mcl_loop_t *loop)
180 {
181 loop->cfg->enable_position_loop = true;
182 }
183
184 /**
185 * @brief Disable position loop
186 *
187 * @param loop @ref mcl_loop_t
188 */
hpm_mcl_disable_position_loop(mcl_loop_t * loop)189 static inline void hpm_mcl_disable_position_loop(mcl_loop_t *loop)
190 {
191 loop->cfg->enable_position_loop = false;
192 }
193
194 /**
195 * @brief Enable speed loop
196 *
197 * @param loop @ref mcl_loop_t
198 */
hpm_mcl_enable_speed_loop(mcl_loop_t * loop)199 static inline void hpm_mcl_enable_speed_loop(mcl_loop_t *loop)
200 {
201 loop->cfg->enable_speed_loop = true;
202 }
203
204 /**
205 * @brief Disable speed loop
206 *
207 * @param loop @ref mcl_loop_t
208 */
hpm_mcl_disable_speed_loop(mcl_loop_t * loop)209 static inline void hpm_mcl_disable_speed_loop(mcl_loop_t *loop)
210 {
211 loop->cfg->enable_speed_loop = false;
212 }
213
214 #ifdef __cplusplus
215 }
216 #endif
217
218 #endif
219