• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #pragma once
16 
17 #include "soc/soc_caps.h"
18 #if SOC_MCPWM_SUPPORTED
19 
20 #include "esp_err.h"
21 #include "soc/soc.h"
22 #include "driver/gpio.h"
23 #include "driver/periph_ctrl.h"
24 #include "esp_intr_alloc.h"
25 #include "hal/mcpwm_types.h"
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 
32 /**
33  * @brief IO signals for the MCPWM
34  *
35  *        - 6 MCPWM output pins that generate PWM signals
36  *        - 3 MCPWM fault input pins to detect faults like overcurrent, overvoltage, etc.
37  *        - 3 MCPWM sync input pins to synchronize MCPWM outputs signals
38  *        - 3 MCPWM capture input pins to gather feedback from controlled motors, using e.g. hall sensors
39  */
40 typedef enum {
41     MCPWM0A = 0,        /*!<PWM0A output pin*/
42     MCPWM0B,            /*!<PWM0B output pin*/
43     MCPWM1A,            /*!<PWM1A output pin*/
44     MCPWM1B,            /*!<PWM1B output pin*/
45     MCPWM2A,            /*!<PWM2A output pin*/
46     MCPWM2B,            /*!<PWM2B output pin*/
47     MCPWM_SYNC_0,       /*!<SYNC0  input pin*/
48     MCPWM_SYNC_1,       /*!<SYNC1  input pin*/
49     MCPWM_SYNC_2,       /*!<SYNC2  input pin*/
50     MCPWM_FAULT_0,      /*!<FAULT0 input pin*/
51     MCPWM_FAULT_1,      /*!<FAULT1 input pin*/
52     MCPWM_FAULT_2,      /*!<FAULT2 input pin*/
53     MCPWM_CAP_0 = 84,   /*!<CAP0   input pin*/
54     MCPWM_CAP_1,        /*!<CAP1   input pin*/
55     MCPWM_CAP_2,        /*!<CAP2   input pin*/
56 } mcpwm_io_signals_t;
57 
58 /**
59  * @brief MCPWM pin number for
60  *
61  */
62 typedef struct {
63     int mcpwm0a_out_num;       /*!<MCPWM0A out pin*/
64     int mcpwm0b_out_num;       /*!<MCPWM0A out pin*/
65     int mcpwm1a_out_num;       /*!<MCPWM0A out pin*/
66     int mcpwm1b_out_num;       /*!<MCPWM0A out pin*/
67     int mcpwm2a_out_num;       /*!<MCPWM0A out pin*/
68     int mcpwm2b_out_num;       /*!<MCPWM0A out pin*/
69     int mcpwm_sync0_in_num;    /*!<SYNC0  in pin*/
70     int mcpwm_sync1_in_num;    /*!<SYNC1  in pin*/
71     int mcpwm_sync2_in_num;    /*!<SYNC2  in pin*/
72     int mcpwm_fault0_in_num;   /*!<FAULT0 in pin*/
73     int mcpwm_fault1_in_num;   /*!<FAULT1 in pin*/
74     int mcpwm_fault2_in_num;   /*!<FAULT2 in pin*/
75     int mcpwm_cap0_in_num;     /*!<CAP0   in pin*/
76     int mcpwm_cap1_in_num;     /*!<CAP1   in pin*/
77     int mcpwm_cap2_in_num;     /*!<CAP2   in pin*/
78 } mcpwm_pin_config_t;
79 
80 /**
81  * @brief Select MCPWM unit
82  */
83 typedef enum {
84     MCPWM_UNIT_0 = 0,  /*!<MCPWM unit0 selected*/
85     MCPWM_UNIT_1,      /*!<MCPWM unit1 selected*/
86     MCPWM_UNIT_MAX,    /*!<Num of MCPWM units on ESP32*/
87 } mcpwm_unit_t;
88 
89 _Static_assert(MCPWM_UNIT_MAX == SOC_MCPWM_PERIPH_NUM, "MCPWM unit number not equal to chip capabilities");
90 
91 /**
92  * @brief Select MCPWM timer
93  */
94 typedef enum {
95     MCPWM_TIMER_0 = 0,  /*!<Select MCPWM timer0*/
96     MCPWM_TIMER_1,      /*!<Select MCPWM timer1*/
97     MCPWM_TIMER_2,      /*!<Select MCPWM timer2*/
98     MCPWM_TIMER_MAX,    /*!<Num of MCPWM timers on ESP32*/
99 } mcpwm_timer_t;
100 
101 /**
102  * @brief Select MCPWM operator
103  */
104 typedef enum {
105     MCPWM_GEN_A = 0,  /*!<Select MCPWMXA, where 'X' is operator number*/
106     MCPWM_GEN_B,      /*!<Select MCPWMXB, where 'X' is operator number*/
107     MCPWM_GEN_MAX,    /*!<Num of generators to each operator of MCPWM*/
108 } mcpwm_generator_t;
109 
110 //definitions and macros to be back-compatible before IDFv4.1
111 #define MCPWM_OPR_A     MCPWM_GEN_A         ///< @deprecated
112 #define MCPWM_OPR_B     MCPWM_GEN_B         ///< @deprecated
113 #define MCPWM_OPR_MAX   MCPWM_GEN_MAX       ///< @deprecated
114 typedef mcpwm_generator_t mcpwm_operator_t; ///< @deprecated
115 
116 /**
117  * @brief MCPWM carrier oneshot mode, in this mode the width of the first pulse of carrier can be programmed
118  */
119 typedef enum {
120     MCPWM_ONESHOT_MODE_DIS = 0,  /*!<Enable oneshot mode*/
121     MCPWM_ONESHOT_MODE_EN,       /*!<Disable oneshot mode*/
122 } mcpwm_carrier_os_t;
123 
124 /**
125  * @brief MCPWM carrier output inversion, high frequency carrier signal active with MCPWM signal is high
126  */
127 typedef enum {
128     MCPWM_CARRIER_OUT_IVT_DIS = 0,  /*!<Enable  carrier output inversion*/
129     MCPWM_CARRIER_OUT_IVT_EN,       /*!<Disable carrier output inversion*/
130 } mcpwm_carrier_out_ivt_t;
131 
132 /**
133  * @brief MCPWM select fault signal input
134  */
135 typedef enum {
136     MCPWM_SELECT_F0 = 0,  /*!<Select F0 as input*/
137     MCPWM_SELECT_F1,      /*!<Select F1 as input*/
138     MCPWM_SELECT_F2,      /*!<Select F2 as input*/
139 } mcpwm_fault_signal_t;
140 
141 /**
142  * @brief MCPWM select triggering level of fault signal
143  */
144 typedef enum {
145     MCPWM_LOW_LEVEL_TGR = 0,  /*!<Fault condition occurs when fault input signal goes from high to low, currently not supported*/
146     MCPWM_HIGH_LEVEL_TGR,     /*!<Fault condition occurs when fault input signal goes low to high*/
147 } mcpwm_fault_input_level_t;
148 
149 
150 /// @deprecated MCPWM select action to be taken on MCPWMXA when fault occurs
151 typedef mcpwm_output_action_t mcpwm_action_on_pwmxa_t;
152 #define MCPWM_NO_CHANGE_IN_MCPWMXA  MCPWM_ACTION_NO_CHANGE      /*!< @deprecated No change in MCPWMXA output*/
153 #define MCPWM_FORCE_MCPWMXA_LOW     MCPWM_ACTION_FORCE_LOW      /*!< @deprecated Make MCPWMXA output low*/
154 #define MCPWM_FORCE_MCPWMXA_HIGH    MCPWM_ACTION_FORCE_HIGH     /*!< @deprecated Make MCPWMXA output high*/
155 #define MCPWM_TOG_MCPWMXA           MCPWM_ACTION_TOGGLE         /*!< @deprecated Make MCPWMXA output toggle*/
156 
157 /// @deprecated MCPWM select action to be taken on MCPWMXB when fault occurs
158 typedef mcpwm_output_action_t mcpwm_action_on_pwmxb_t;
159 #define MCPWM_NO_CHANGE_IN_MCPWMXB  MCPWM_ACTION_NO_CHANGE      /*!< @deprecated No change in MCPWMXB output*/
160 #define MCPWM_FORCE_MCPWMXB_LOW     MCPWM_ACTION_FORCE_LOW      /*!< @deprecated Make MCPWMXB output low*/
161 #define MCPWM_FORCE_MCPWMXB_HIGH    MCPWM_ACTION_FORCE_HIGH     /*!< @deprecated Make MCPWMXB output high*/
162 #define MCPWM_TOG_MCPWMXB           MCPWM_ACTION_TOGGLE         /*!< @deprecated Make MCPWMXB output toggle*/
163 
164 /**
165  * @brief MCPWM select capture signal input
166  */
167 typedef enum {
168     MCPWM_SELECT_CAP0 = 0, /*!<Select CAP0 as input*/
169     MCPWM_SELECT_CAP1,     /*!<Select CAP1 as input*/
170     MCPWM_SELECT_CAP2,     /*!<Select CAP2 as input*/
171 } mcpwm_capture_signal_t;
172 
173 /**
174  * @brief MCPWM config structure
175  */
176 typedef struct {
177     uint32_t frequency;              /*!<Set frequency of MCPWM in Hz*/
178     float cmpr_a;                    /*!<Set % duty cycle for operator a(MCPWMXA), i.e for 62.3% duty cycle, duty_a = 62.3*/
179     float cmpr_b;                    /*!<Set % duty cycle for operator b(MCPWMXB), i.e for 48% duty cycle, duty_b = 48.0*/
180     mcpwm_duty_type_t duty_mode;     /*!<Set type of duty cycle*/
181     mcpwm_counter_type_t counter_mode;  /*!<Set  type of MCPWM counter*/
182 } mcpwm_config_t;
183 
184 /**
185  * @brief MCPWM config carrier structure
186  */
187 typedef struct {
188     uint8_t carrier_period;                    /*!<Set carrier period = (carrier_period + 1)*800ns, carrier_period should be < 16*/
189     uint8_t carrier_duty;                      /*!<Set carrier duty cycle, carrier_duty should be less than 8 (increment every 12.5%)*/
190     uint8_t pulse_width_in_os;                 /*!<Set pulse width of first pulse in one shot mode = (carrier period)*(pulse_width_in_os + 1), should be less then 16*/
191     mcpwm_carrier_os_t carrier_os_mode;        /*!<Enable or disable carrier oneshot mode*/
192     mcpwm_carrier_out_ivt_t carrier_ivt_mode;  /*!<Invert output of carrier*/
193 } mcpwm_carrier_config_t;
194 
195 /**
196  * @brief This function initializes each gpio signal for MCPWM
197  *        @note
198  *        This function initializes one gpio at a time.
199  *
200  * @param mcpwm_num set MCPWM unit(0-1)
201  * @param io_signal set MCPWM signals, each MCPWM unit has 6 output(MCPWMXA, MCPWMXB) and 9 input(SYNC_X, FAULT_X, CAP_X)
202  *                  'X' is timer_num(0-2)
203  * @param gpio_num set this to configure gpio for MCPWM, if you want to use gpio16, gpio_num = 16
204  *
205  * @return
206  *     - ESP_OK Success
207  *     - ESP_ERR_INVALID_ARG Parameter error
208  */
209 esp_err_t mcpwm_gpio_init(mcpwm_unit_t mcpwm_num, mcpwm_io_signals_t io_signal, int gpio_num);
210 
211 /**
212  * @brief Initialize MCPWM gpio structure
213  *        @note
214  *        This function can be used to initialize more then one gpio at a time.
215  *
216  * @param mcpwm_num set MCPWM unit(0-1)
217  * @param mcpwm_pin MCPWM pin structure
218  *
219  * @return
220  *     - ESP_OK Success
221  *     - ESP_ERR_INVALID_ARG Parameter error
222  */
223 esp_err_t mcpwm_set_pin(mcpwm_unit_t mcpwm_num, const mcpwm_pin_config_t *mcpwm_pin);
224 
225 /**
226  * @brief Initialize MCPWM parameters
227  *
228  * @param mcpwm_num set MCPWM unit(0-1)
229  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers.
230  * @param mcpwm_conf configure structure mcpwm_config_t
231  *
232  * @return
233  *     - ESP_OK Success
234  *     - ESP_ERR_INVALID_ARG Parameter error
235  */
236 esp_err_t mcpwm_init( mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, const mcpwm_config_t  *mcpwm_conf);
237 
238 /**
239  * @brief Set frequency(in Hz) of MCPWM timer
240  *
241  * @param mcpwm_num set MCPWM unit(0-1)
242  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
243  * @param frequency set the frequency in Hz of each timer
244  *
245  * @return
246  *     - ESP_OK Success
247  *     - ESP_ERR_INVALID_ARG Parameter error
248  */
249 esp_err_t mcpwm_set_frequency(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, uint32_t frequency);
250 
251 /**
252  * @brief Set duty cycle of each operator(MCPWMXA/MCPWMXB)
253  *
254  * @param mcpwm_num set MCPWM unit(0-1)
255  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
256  * @param gen set the generator(MCPWMXA/MCPWMXB), 'X' is operator number selected
257  * @param duty set duty cycle in %(i.e for 62.3% duty cycle, duty = 62.3) of each operator
258  *
259  * @return
260  *     - ESP_OK Success
261  *     - ESP_ERR_INVALID_ARG Parameter error
262  */
263 esp_err_t mcpwm_set_duty(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_generator_t gen, float duty);
264 
265 /**
266  * @brief Set duty cycle of each operator(MCPWMXA/MCPWMXB) in us
267  *
268  * @param mcpwm_num set MCPWM unit(0-1)
269  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
270  * @param gen set the generator(MCPWMXA/MCPWMXB), 'x' is operator number selected
271  * @param duty_in_us set duty value in microseconds of each operator
272  *
273  * @return
274  *     - ESP_OK Success
275  *     - ESP_ERR_INVALID_ARG Parameter error
276  */
277 esp_err_t mcpwm_set_duty_in_us(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_generator_t gen, uint32_t duty_in_us);
278 
279 /**
280  * @brief Set duty either active high or active low(out of phase/inverted)
281  *        @note
282  *        Call this function every time after mcpwm_set_signal_high or mcpwm_set_signal_low to resume with previously set duty cycle
283  *
284  * @param mcpwm_num set MCPWM unit(0-1)
285  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
286  * @param gen set the generator(MCPWMXA/MCPWMXB), 'x' is operator number selected
287  * @param duty_type set active low or active high duty type
288  *
289  * @return
290  *     - ESP_OK Success
291  *     - ESP_ERR_INVALID_ARG Parameter error
292  */
293 esp_err_t mcpwm_set_duty_type(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_generator_t gen, mcpwm_duty_type_t duty_type);
294 
295 /**
296 * @brief Get frequency of timer
297 *
298 * @param mcpwm_num set MCPWM unit(0-1)
299 * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
300 *
301 * @return
302 *     - frequency of timer
303 */
304 uint32_t mcpwm_get_frequency(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num);
305 
306 /**
307  * @brief Get duty cycle of each operator
308  *
309  * @param mcpwm_num set MCPWM unit(0-1)
310  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
311  * @param gen set the generator(MCPWMXA/MCPWMXB), 'x' is operator number selected
312  *
313  * @return
314  *     - duty cycle in % of each operator(56.7 means duty is 56.7%)
315  */
316 float mcpwm_get_duty(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_operator_t gen);
317 
318 /**
319  * @brief Use this function to set MCPWM signal high
320  *
321  * @param mcpwm_num set MCPWM unit(0-1)
322  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
323  * @param gen set the operator(MCPWMXA/MCPWMXB), 'x' is timer number selected
324 
325  *
326  * @return
327  *     - ESP_OK Success
328  *     - ESP_ERR_INVALID_ARG Parameter error
329  */
330 esp_err_t mcpwm_set_signal_high(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_generator_t gen);
331 
332 /**
333  * @brief Use this function to set MCPWM signal low
334  *
335  * @param mcpwm_num set MCPWM unit(0-1)
336  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
337  * @param gen set the operator(MCPWMXA/MCPWMXB), 'x' is timer number selected
338 
339  *
340  * @return
341  *     - ESP_OK Success
342  *     - ESP_ERR_INVALID_ARG Parameter error
343  */
344 esp_err_t mcpwm_set_signal_low(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_generator_t gen);
345 
346 /**
347  * @brief Start MCPWM signal on timer 'x'
348  *
349  * @param mcpwm_num set MCPWM unit(0-1)
350  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
351  *
352  * @return
353  *     - ESP_OK Success
354  *     - ESP_ERR_INVALID_ARG Parameter error
355  */
356 esp_err_t mcpwm_start(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num);
357 
358 /**
359  * @brief Start MCPWM signal on timer 'x'
360  *
361  * @param mcpwm_num set MCPWM unit(0-1)
362  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
363  *
364  * @return
365  *     - ESP_OK Success
366  *     - ESP_ERR_INVALID_ARG Parameter error
367  */
368 esp_err_t mcpwm_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num);
369 
370 /**
371  * @brief  Initialize carrier configuration
372  *
373  * @param mcpwm_num set MCPWM unit(0-1)
374  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
375  * @param carrier_conf configure structure mcpwm_carrier_config_t
376  *
377  * @return
378  *     - ESP_OK Success
379  *     - ESP_ERR_INVALID_ARG Parameter error
380  */
381 esp_err_t mcpwm_carrier_init(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, const mcpwm_carrier_config_t *carrier_conf);
382 
383 /**
384 * @brief Enable MCPWM carrier submodule, for respective timer
385 *
386 * @param mcpwm_num set MCPWM unit(0-1)
387 * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
388 *
389 * @return
390 *     - ESP_OK Success
391 *     - ESP_ERR_INVALID_ARG Parameter error
392 */
393 esp_err_t mcpwm_carrier_enable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num);
394 
395 /**
396  * @brief Disable MCPWM carrier submodule, for respective timer
397  *
398  * @param mcpwm_num set MCPWM unit(0-1)
399  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
400  *
401  * @return
402  *     - ESP_OK Success
403  *     - ESP_ERR_INVALID_ARG Parameter error
404  */
405 esp_err_t mcpwm_carrier_disable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num);
406 
407 /**
408  * @brief Set period of carrier
409  *
410  * @param mcpwm_num set MCPWM unit(0-1)
411  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
412  * @param carrier_period set the carrier period of each timer, carrier period = (carrier_period + 1)*800ns
413  *                    (carrier_period <= 15)
414  *
415  * @return
416  *     - ESP_OK Success
417  *     - ESP_ERR_INVALID_ARG Parameter error
418  */
419 esp_err_t mcpwm_carrier_set_period(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, uint8_t carrier_period);
420 
421 /**
422  * @brief Set duty_cycle of carrier
423  *
424  * @param mcpwm_num set MCPWM unit(0-1)
425  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
426  * @param carrier_duty set duty_cycle of carrier , carrier duty cycle = carrier_duty*12.5%
427  *                  (chop_duty <= 7)
428  *
429  * @return
430  *     - ESP_OK Success
431  *     - ESP_ERR_INVALID_ARG Parameter error
432  */
433 esp_err_t mcpwm_carrier_set_duty_cycle(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, uint8_t carrier_duty);
434 
435 /**
436  * @brief Enable and set width of first pulse in carrier oneshot mode
437  *
438  * @param mcpwm_num set MCPWM unit(0-1)
439  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
440  * @param pulse_width set pulse width of first pulse in oneshot mode, width = (carrier period)*(pulse_width +1)
441  *                    (pulse_width <= 15)
442  *
443  * @return
444  *     - ESP_OK Success
445  *     - ESP_ERR_INVALID_ARG Parameter error
446  */
447 esp_err_t mcpwm_carrier_oneshot_mode_enable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, uint8_t pulse_width);
448 
449 /**
450  * @brief Disable oneshot mode, width of first pulse = carrier period
451  *
452  * @param mcpwm_num set MCPWM unit(0-1)
453  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
454  *
455  * @return
456  *     - ESP_OK Success
457  *     - ESP_ERR_INVALID_ARG Parameter error
458  */
459 esp_err_t mcpwm_carrier_oneshot_mode_disable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num);
460 
461 /**
462  * @brief Enable or disable carrier output inversion
463  *
464  * @param mcpwm_num set MCPWM unit(0-1)
465  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
466  * @param carrier_ivt_mode enable or disable carrier output inversion
467  *
468  * @return
469  *     - ESP_OK Success
470  *     - ESP_ERR_INVALID_ARG Parameter error
471  */
472 esp_err_t mcpwm_carrier_output_invert(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num,
473                                       mcpwm_carrier_out_ivt_t carrier_ivt_mode);
474 
475 /**
476  * @brief Enable and initialize deadtime for each MCPWM timer
477  *
478  * @param mcpwm_num set MCPWM unit(0-1)
479  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
480  * @param dt_mode set deadtime mode
481  * @param red set rising edge delay = red*100ns
482  * @param fed set rising edge delay = fed*100ns
483  *
484  * @return
485  *     - ESP_OK Success
486  *     - ESP_ERR_INVALID_ARG Parameter error
487  */
488 esp_err_t mcpwm_deadtime_enable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_deadtime_type_t dt_mode,
489                                 uint32_t red, uint32_t fed);
490 
491 /**
492  * @brief Disable deadtime on MCPWM timer
493  *
494  * @param mcpwm_num set MCPWM unit(0-1)
495  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
496  *
497  * @return
498  *     - ESP_OK Success
499  *     - ESP_ERR_INVALID_ARG Parameter error
500  */
501 esp_err_t mcpwm_deadtime_disable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num);
502 
503 /**
504  * @brief Initialize fault submodule, currently low level triggering is not supported
505  *
506  * @param mcpwm_num set MCPWM unit(0-1)
507  * @param intput_level set fault signal level, which will cause fault to occur
508  * @param fault_sig set the fault pin, which needs to be enabled
509  *
510  * @return
511  *     - ESP_OK Success
512  *     - ESP_ERR_INVALID_ARG Parameter error
513  */
514 esp_err_t mcpwm_fault_init(mcpwm_unit_t mcpwm_num, mcpwm_fault_input_level_t intput_level, mcpwm_fault_signal_t fault_sig);
515 
516 /**
517  * @brief Set oneshot mode on fault detection, once fault occur in oneshot mode reset is required to resume MCPWM signals
518  *        @note
519  *        currently low level triggering is not supported
520  *
521  * @param mcpwm_num set MCPWM unit(0-1)
522  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
523  * @param fault_sig set the fault pin, which needs to be enabled for oneshot mode
524  * @param action_on_pwmxa action to be taken on MCPWMXA when fault occurs, either no change or high or low or toggle
525  * @param action_on_pwmxb action to be taken on MCPWMXB when fault occurs, either no change or high or low or toggle
526  *
527  * @return
528  *     - ESP_OK Success
529  *     - ESP_ERR_INVALID_ARG Parameter error
530  */
531 esp_err_t mcpwm_fault_set_oneshot_mode(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_fault_signal_t fault_sig,
532                                        mcpwm_output_action_t action_on_pwmxa, mcpwm_output_action_t action_on_pwmxb);
533 
534 /**
535  * @brief Set cycle-by-cycle mode on fault detection, once fault occur in cyc mode MCPWM signal resumes as soon as fault signal becomes inactive
536  *        @note
537  *        currently low level triggering is not supported
538  *
539  * @param mcpwm_num set MCPWM unit(0-1)
540  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
541  * @param fault_sig set the fault pin, which needs to be enabled for cyc mode
542  * @param action_on_pwmxa action to be taken on MCPWMXA when fault occurs, either no change or high or low or toggle
543  * @param action_on_pwmxb action to be taken on MCPWMXB when fault occurs, either no change or high or low or toggle
544  *
545  * @return
546  *     - ESP_OK Success
547  *     - ESP_ERR_INVALID_ARG Parameter error
548  */
549 esp_err_t mcpwm_fault_set_cyc_mode(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_fault_signal_t fault_sig,
550                                    mcpwm_output_action_t action_on_pwmxa, mcpwm_output_action_t action_on_pwmxb);
551 
552 /**
553  * @brief Disable fault signal
554  *
555  * @param mcpwm_num set MCPWM unit(0-1)
556  * @param fault_sig fault pin, which needs to be disabled
557  *
558  * @return
559  *     - ESP_OK Success
560  *     - ESP_ERR_INVALID_ARG Parameter error
561  */
562 esp_err_t mcpwm_fault_deinit(mcpwm_unit_t mcpwm_num, mcpwm_fault_signal_t fault_sig);
563 
564 /**
565  * @brief Initialize capture submodule
566  *
567  * @param mcpwm_num set MCPWM unit(0-1)
568  * @param cap_edge set capture edge, BIT(0) - negative edge, BIT(1) - positive edge
569  * @param cap_sig capture pin, which needs to be enabled
570  * @param num_of_pulse count time between rising/falling edge between 2 *(pulses mentioned), counter uses APB_CLK
571  *
572  * @return
573  *     - ESP_OK Success
574  *     - ESP_ERR_INVALID_ARG Parameter error
575  */
576 
577 esp_err_t mcpwm_capture_enable(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t cap_sig, mcpwm_capture_on_edge_t cap_edge,
578                                uint32_t num_of_pulse);
579 
580 /**
581  * @brief Disable capture signal
582  *
583  * @param mcpwm_num set MCPWM unit(0-1)
584  * @param cap_sig capture pin, which needs to be disabled
585  *
586  * @return
587  *     - ESP_OK Success
588  *     - ESP_ERR_INVALID_ARG Parameter error
589  */
590 esp_err_t mcpwm_capture_disable(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t cap_sig);
591 
592 /**
593  * @brief Get capture value
594  *
595  * @param mcpwm_num set MCPWM unit(0-1)
596  * @param cap_sig capture pin on which value is to be measured
597  *
598  * @return
599  *     Captured value
600  */
601 uint32_t mcpwm_capture_signal_get_value(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t cap_sig);
602 
603 /**
604  * @brief Get edge of capture signal
605  *
606  * @param mcpwm_num set MCPWM unit(0-1)
607  * @param cap_sig capture pin of whose edge is to be determined
608  *
609  * @return
610  *     Capture signal edge: 1 - positive edge, 2 - negtive edge
611  */
612 uint32_t mcpwm_capture_signal_get_edge(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t cap_sig);
613 
614 /**
615  * @brief Initialize sync submodule
616  *
617  * @param mcpwm_num set MCPWM unit(0-1)
618  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
619  * @param sync_sig set the synchronization pin, which needs to be enabled
620  * @param phase_val phase value in 1/1000 (for 86.7%, phase_val = 867) which timer moves to on sync signal
621  *
622  * @return
623  *     - ESP_OK Success
624  *     - ESP_ERR_INVALID_ARG Parameter error
625  */
626 esp_err_t mcpwm_sync_enable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_sync_signal_t sync_sig,
627                             uint32_t phase_val);
628 
629 /**
630  * @brief Disable sync submodule on given timer
631  *
632  * @param mcpwm_num set MCPWM unit(0-1)
633  * @param timer_num set timer number(0-2) of MCPWM, each MCPWM unit has 3 timers
634  *
635  * @return
636  *     - ESP_OK Success
637  *     - ESP_ERR_INVALID_ARG Parameter error
638  */
639 esp_err_t mcpwm_sync_disable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num);
640 
641 /**
642  * @brief Register MCPWM interrupt handler, the handler is an ISR.
643  *        the handler will be attached to the same CPU core that this function is running on.
644  *
645  * @param mcpwm_num set MCPWM unit(0-1)
646  * @param fn interrupt handler function.
647  * @param arg user-supplied argument passed to the handler function.
648  * @param intr_alloc_flags flags used to allocate the interrupt. One or multiple (ORred)
649  *        ESP_INTR_FLAG_* values. see esp_intr_alloc.h for more info.
650  * @param handle pointer to return handle. If non-NULL, a handle for the interrupt will
651  *        be returned here.
652  *
653  * @return
654  *     - ESP_OK Success
655  *     - ESP_ERR_INVALID_ARG Function pointer error.
656  */
657 esp_err_t mcpwm_isr_register(mcpwm_unit_t mcpwm_num, void (*fn)(void *), void *arg, int intr_alloc_flags, intr_handle_t *handle);
658 
659 
660 #ifdef __cplusplus
661 }
662 #endif
663 
664 #endif  //SOC_MCPWM_SUPPORTED
665