• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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