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