mcpwm.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733
  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. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. #include <stdio.h>
  14. #include "esp_log.h"
  15. #include "esp_err.h"
  16. #include "esp_intr.h"
  17. #include "esp_intr_alloc.h"
  18. #include "freertos/FreeRTOS.h"
  19. #include "freertos/semphr.h"
  20. #include "freertos/xtensa_api.h"
  21. #include "freertos/task.h"
  22. #include "soc/mcpwm_reg.h"
  23. #include "soc/mcpwm_struct.h"
  24. #include "soc/io_mux_reg.h"
  25. #include "soc/gpio_sig_map.h"
  26. #include "driver/mcpwm.h"
  27. #include "driver/periph_ctrl.h"
  28. static mcpwm_dev_t *MCPWM[2] = {&MCPWM0, &MCPWM1};
  29. static const char *MCPWM_TAG = "MCPWM";
  30. static portMUX_TYPE mcpwm_spinlock = portMUX_INITIALIZER_UNLOCKED;
  31. #define MCPWM_CHECK(a, str, ret_val) if (!(a)) { \
  32. ESP_LOGE(MCPWM_TAG,"%s:%d (%s):%s", __FILE__, __LINE__, __FUNCTION__, str); \
  33. return (ret_val); \
  34. }
  35. #define MCPWM_UNIT_NUM_ERROR "MCPWM UNIT NUM ERROR"
  36. #define MCPWM_TIMER_ERROR "MCPWM TIMER NUM ERROR"
  37. #define MCPWM_PARAM_ADDR_ERROR "MCPWM PARAM ADDR ERROR"
  38. #define MCPWM_DUTY_TYPE_ERROR "MCPWM DUTY TYPE ERROR"
  39. #define MCPWM_GPIO_ERROR "MCPWM GPIO NUM ERROR"
  40. #define MCPWM_OP_ERROR "MCPWM OPERATOR ERROR"
  41. #define MCPWM_DB_ERROR "MCPWM DEADTIME TYPE ERROR"
  42. #define MCPWM_BASE_CLK (2 * APB_CLK_FREQ) //2*APB_CLK_FREQ 160Mhz
  43. #define MCPWM_CLK_PRESCL 15 //MCPWM clock prescale
  44. #define TIMER_CLK_PRESCALE 9 //MCPWM timer prescales
  45. #define MCPWM_CLK (MCPWM_BASE_CLK/(MCPWM_CLK_PRESCL +1))
  46. #define MCPWM_PIN_IGNORE (-1)
  47. #define OFFSET_FOR_GPIO_IDX_1 6
  48. #define OFFSET_FOR_GPIO_IDX_2 75
  49. esp_err_t mcpwm_gpio_init(mcpwm_unit_t mcpwm_num, mcpwm_io_signals_t io_signal, int gpio_num)
  50. {
  51. if (gpio_num == MCPWM_PIN_IGNORE) {
  52. //IGNORE
  53. return ESP_OK;
  54. }
  55. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  56. MCPWM_CHECK((GPIO_IS_VALID_GPIO(gpio_num)), MCPWM_GPIO_ERROR, ESP_ERR_INVALID_ARG);
  57. periph_module_enable(PERIPH_PWM0_MODULE + mcpwm_num);
  58. PIN_FUNC_SELECT(GPIO_PIN_MUX_REG[gpio_num], PIN_FUNC_GPIO);
  59. bool mcpwm_gpio_sig = (io_signal <= MCPWM2B);
  60. if (mcpwm_num == MCPWM_UNIT_0) {
  61. if (mcpwm_gpio_sig) {
  62. MCPWM_CHECK((GPIO_IS_VALID_OUTPUT_GPIO(gpio_num)), MCPWM_GPIO_ERROR, ESP_ERR_INVALID_ARG);
  63. gpio_set_direction(gpio_num, GPIO_MODE_OUTPUT);
  64. gpio_matrix_out(gpio_num, PWM0_OUT0A_IDX + io_signal, 0, 0);
  65. } else {
  66. gpio_set_direction(gpio_num, GPIO_MODE_INPUT);
  67. gpio_matrix_in(gpio_num, PWM0_SYNC0_IN_IDX + io_signal - OFFSET_FOR_GPIO_IDX_1, 0);
  68. }
  69. } else { //MCPWM_UNIT_1
  70. if (mcpwm_gpio_sig) {
  71. MCPWM_CHECK((GPIO_IS_VALID_OUTPUT_GPIO(gpio_num)), MCPWM_GPIO_ERROR, ESP_ERR_INVALID_ARG);
  72. gpio_set_direction(gpio_num, GPIO_MODE_OUTPUT);
  73. gpio_matrix_out(gpio_num, PWM1_OUT0A_IDX + io_signal, 0, 0);
  74. } else if (io_signal >= MCPWM_SYNC_0 && io_signal < MCPWM_FAULT_2) {
  75. gpio_set_direction(gpio_num, GPIO_MODE_INPUT);
  76. gpio_matrix_in(gpio_num, PWM1_SYNC0_IN_IDX + io_signal - OFFSET_FOR_GPIO_IDX_1, 0);
  77. } else {
  78. gpio_set_direction(gpio_num, GPIO_MODE_INPUT);
  79. gpio_matrix_in(gpio_num, PWM1_SYNC0_IN_IDX + io_signal - OFFSET_FOR_GPIO_IDX_2, 0);
  80. }
  81. }
  82. return ESP_OK;
  83. }
  84. esp_err_t mcpwm_set_pin(mcpwm_unit_t mcpwm_num, const mcpwm_pin_config_t *mcpwm_pin)
  85. {
  86. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  87. mcpwm_gpio_init(mcpwm_num, MCPWM0A, mcpwm_pin->mcpwm0a_out_num); //MCPWM0A
  88. mcpwm_gpio_init(mcpwm_num, MCPWM0B, mcpwm_pin->mcpwm0b_out_num); //MCPWM0B
  89. mcpwm_gpio_init(mcpwm_num, MCPWM1A, mcpwm_pin->mcpwm1a_out_num); //MCPWM1A
  90. mcpwm_gpio_init(mcpwm_num, MCPWM1B, mcpwm_pin->mcpwm1b_out_num); //MCPWM1B
  91. mcpwm_gpio_init(mcpwm_num, MCPWM2A, mcpwm_pin->mcpwm2a_out_num); //MCPWM2A
  92. mcpwm_gpio_init(mcpwm_num, MCPWM2B, mcpwm_pin->mcpwm2b_out_num); //MCPWM2B
  93. mcpwm_gpio_init(mcpwm_num, MCPWM_SYNC_0, mcpwm_pin->mcpwm_sync0_in_num); //SYNC0
  94. mcpwm_gpio_init(mcpwm_num, MCPWM_SYNC_1, mcpwm_pin->mcpwm_sync1_in_num); //SYNC1
  95. mcpwm_gpio_init(mcpwm_num, MCPWM_SYNC_2, mcpwm_pin->mcpwm_sync2_in_num); //SYNC2
  96. mcpwm_gpio_init(mcpwm_num, MCPWM_FAULT_0, mcpwm_pin->mcpwm_fault0_in_num); //FAULT0
  97. mcpwm_gpio_init(mcpwm_num, MCPWM_FAULT_0, mcpwm_pin->mcpwm_fault1_in_num); //FAULT1
  98. mcpwm_gpio_init(mcpwm_num, MCPWM_FAULT_0, mcpwm_pin->mcpwm_fault2_in_num); //FAULT2
  99. mcpwm_gpio_init(mcpwm_num, MCPWM_CAP_0, mcpwm_pin->mcpwm_cap0_in_num); //CAP0
  100. mcpwm_gpio_init(mcpwm_num, MCPWM_CAP_1, mcpwm_pin->mcpwm_cap1_in_num); //CAP1
  101. mcpwm_gpio_init(mcpwm_num, MCPWM_CAP_2, mcpwm_pin->mcpwm_cap2_in_num); //CAP2
  102. return ESP_OK;
  103. }
  104. esp_err_t mcpwm_start(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num)
  105. {
  106. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  107. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  108. portENTER_CRITICAL(&mcpwm_spinlock);
  109. MCPWM[mcpwm_num]->timer[timer_num].mode.start = 2;
  110. portEXIT_CRITICAL(&mcpwm_spinlock);
  111. return ESP_OK;
  112. }
  113. esp_err_t mcpwm_stop(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num)
  114. {
  115. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  116. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  117. portENTER_CRITICAL(&mcpwm_spinlock);
  118. MCPWM[mcpwm_num]->timer[timer_num].mode.start = 0;
  119. portEXIT_CRITICAL(&mcpwm_spinlock);
  120. return ESP_OK;
  121. }
  122. esp_err_t mcpwm_set_frequency(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, uint32_t frequency)
  123. {
  124. uint32_t mcpwm_num_of_pulse;
  125. uint32_t previous_period;
  126. uint32_t set_duty_a, set_duty_b;
  127. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  128. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  129. portENTER_CRITICAL(&mcpwm_spinlock);
  130. mcpwm_num_of_pulse = MCPWM_CLK / (frequency * (TIMER_CLK_PRESCALE + 1));
  131. previous_period = MCPWM[mcpwm_num]->timer[timer_num].period.period;
  132. MCPWM[mcpwm_num]->timer[timer_num].period.prescale = TIMER_CLK_PRESCALE;
  133. MCPWM[mcpwm_num]->timer[timer_num].period.period = mcpwm_num_of_pulse;
  134. MCPWM[mcpwm_num]->timer[timer_num].period.upmethod = 0;
  135. set_duty_a = (((MCPWM[mcpwm_num]->channel[timer_num].cmpr_value[0].cmpr_val) * mcpwm_num_of_pulse) / previous_period);
  136. set_duty_b = (((MCPWM[mcpwm_num]->channel[timer_num].cmpr_value[1].cmpr_val) * mcpwm_num_of_pulse) / previous_period);
  137. MCPWM[mcpwm_num]->channel[timer_num].cmpr_value[0].cmpr_val = set_duty_a;
  138. MCPWM[mcpwm_num]->channel[timer_num].cmpr_value[1].cmpr_val = set_duty_b;
  139. MCPWM[mcpwm_num]->channel[timer_num].cmpr_cfg.a_upmethod = 0;
  140. MCPWM[mcpwm_num]->channel[timer_num].cmpr_cfg.b_upmethod = 0;
  141. portEXIT_CRITICAL(&mcpwm_spinlock);
  142. return ESP_OK;
  143. }
  144. esp_err_t mcpwm_set_duty(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_operator_t op_num, float duty)
  145. {
  146. uint32_t set_duty;
  147. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  148. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  149. MCPWM_CHECK(op_num < MCPWM_OPR_MAX, MCPWM_OP_ERROR, ESP_ERR_INVALID_ARG);
  150. portENTER_CRITICAL(&mcpwm_spinlock);
  151. set_duty = (MCPWM[mcpwm_num]->timer[timer_num].period.period) * (duty) / 100;
  152. MCPWM[mcpwm_num]->channel[timer_num].cmpr_value[op_num].cmpr_val = set_duty;
  153. MCPWM[mcpwm_num]->channel[timer_num].cmpr_cfg.a_upmethod = BIT(0);
  154. MCPWM[mcpwm_num]->channel[timer_num].cmpr_cfg.b_upmethod = BIT(0);
  155. portEXIT_CRITICAL(&mcpwm_spinlock);
  156. return ESP_OK;
  157. }
  158. esp_err_t mcpwm_set_duty_in_us(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_operator_t op_num, uint32_t duty)
  159. {
  160. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  161. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  162. MCPWM_CHECK(op_num < MCPWM_OPR_MAX, MCPWM_OP_ERROR, ESP_ERR_INVALID_ARG);
  163. portENTER_CRITICAL(&mcpwm_spinlock);
  164. MCPWM[mcpwm_num]->channel[timer_num].cmpr_value[op_num].cmpr_val = duty;
  165. MCPWM[mcpwm_num]->channel[timer_num].cmpr_cfg.a_upmethod = BIT(0);
  166. MCPWM[mcpwm_num]->channel[timer_num].cmpr_cfg.b_upmethod = BIT(0);
  167. portEXIT_CRITICAL(&mcpwm_spinlock);
  168. return ESP_OK;
  169. }
  170. esp_err_t mcpwm_set_duty_type(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_operator_t op_num,
  171. mcpwm_duty_type_t duty_num)
  172. {
  173. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  174. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  175. MCPWM_CHECK(op_num < MCPWM_OPR_MAX, MCPWM_OP_ERROR, ESP_ERR_INVALID_ARG);
  176. MCPWM_CHECK(duty_num < MCPWM_DUTY_MODE_MAX, MCPWM_DUTY_TYPE_ERROR, ESP_ERR_INVALID_ARG);
  177. portENTER_CRITICAL(&mcpwm_spinlock);
  178. if (op_num == MCPWM_OPR_A) {
  179. if (MCPWM[mcpwm_num]->timer[timer_num].mode.mode == MCPWM_UP_COUNTER) {
  180. if (duty_num == MCPWM_DUTY_MODE_1) {
  181. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 1;
  182. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utea = 2;
  183. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utep = 0;
  184. } else { //MCPWM_DUTY_MODE_0
  185. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 2;
  186. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utea = 1;
  187. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utep = 0;
  188. }
  189. } else if (MCPWM[mcpwm_num]->timer[timer_num].mode.mode == MCPWM_DOWN_COUNTER) {
  190. if (duty_num == MCPWM_DUTY_MODE_1) {
  191. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtep = 2;
  192. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtea = 1;
  193. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtez = 0;
  194. } else { //MCPWM_DUTY_MODE_0
  195. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtep = 1;
  196. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtea = 2;
  197. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtez = 0;
  198. }
  199. } else { //Timer count up-down
  200. if (duty_num == MCPWM_DUTY_MODE_1) {
  201. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 1;
  202. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utea = 2;
  203. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtea = 1;
  204. } else { //MCPWM_DUTY_MODE_0
  205. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 2;
  206. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utea = 1;
  207. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtea = 2;
  208. }
  209. }
  210. }
  211. if (op_num == MCPWM_OPR_B) {
  212. if (MCPWM[mcpwm_num]->timer[timer_num].mode.mode == MCPWM_UP_COUNTER) {
  213. if (duty_num == MCPWM_DUTY_MODE_1) {
  214. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 1;
  215. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].uteb = 2;
  216. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utep = 0;
  217. } else { //MCPWM_DUTY_MODE_0
  218. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 2;
  219. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].uteb = 1;
  220. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utep = 0;
  221. }
  222. } else if (MCPWM[mcpwm_num]->timer[timer_num].mode.mode == MCPWM_DOWN_COUNTER) {
  223. if (duty_num == MCPWM_DUTY_MODE_1) {
  224. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtep = 2;
  225. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dteb = 1;
  226. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtez = 0;
  227. } else { //MCPWM_DUTY_MODE_0
  228. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtep = 1;
  229. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dteb = 2;
  230. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtez = 0;
  231. }
  232. } else { //Timer count up-down
  233. if (duty_num == MCPWM_DUTY_MODE_1) {
  234. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 1;
  235. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].uteb = 2;
  236. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dteb = 1;
  237. } else { //MCPWM_DUTY_MODE_0
  238. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 2;
  239. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].uteb = 1;
  240. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dteb = 2;
  241. }
  242. }
  243. }
  244. portEXIT_CRITICAL(&mcpwm_spinlock);
  245. return ESP_OK;
  246. }
  247. esp_err_t mcpwm_init(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, const mcpwm_config_t *mcpwm_conf)
  248. {
  249. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  250. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  251. periph_module_enable(PERIPH_PWM0_MODULE + mcpwm_num);
  252. portENTER_CRITICAL(&mcpwm_spinlock);
  253. MCPWM[mcpwm_num]->clk_cfg.prescale = MCPWM_CLK_PRESCL;
  254. mcpwm_set_frequency(mcpwm_num, timer_num, mcpwm_conf->frequency);
  255. MCPWM[mcpwm_num]->timer[timer_num].mode.mode = mcpwm_conf ->counter_mode;
  256. mcpwm_set_duty(mcpwm_num, timer_num, 0, mcpwm_conf->cmpr_a);
  257. mcpwm_set_duty(mcpwm_num, timer_num, 1, mcpwm_conf->cmpr_b);
  258. mcpwm_set_duty_type(mcpwm_num, timer_num, 0, mcpwm_conf->duty_mode);
  259. mcpwm_set_duty_type(mcpwm_num, timer_num, 1, mcpwm_conf->duty_mode);
  260. mcpwm_start(mcpwm_num, timer_num);
  261. MCPWM[mcpwm_num]->timer_sel.operator0_sel = 0;
  262. MCPWM[mcpwm_num]->timer_sel.operator1_sel = 1;
  263. MCPWM[mcpwm_num]->timer_sel.operator2_sel = 2;
  264. MCPWM[mcpwm_num]->update_cfg.global_up_en = 1;
  265. MCPWM[mcpwm_num]->update_cfg.global_force_up = 1;
  266. MCPWM[mcpwm_num]->update_cfg.global_force_up = 0;
  267. portEXIT_CRITICAL(&mcpwm_spinlock);
  268. return ESP_OK;
  269. }
  270. uint32_t mcpwm_get_frequency(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num)
  271. {
  272. uint32_t frequency;
  273. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  274. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  275. frequency = MCPWM_CLK / ((MCPWM[mcpwm_num]->timer[timer_num].period.period) * (TIMER_CLK_PRESCALE + 1));
  276. return frequency;
  277. }
  278. float mcpwm_get_duty(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_operator_t op_num)
  279. {
  280. float duty;
  281. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  282. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  283. MCPWM_CHECK(op_num < MCPWM_OPR_MAX, MCPWM_OP_ERROR, ESP_ERR_INVALID_ARG);
  284. portENTER_CRITICAL(&mcpwm_spinlock);
  285. duty = 100.0 * (MCPWM[mcpwm_num]->channel[timer_num].cmpr_value[op_num].cmpr_val) / (MCPWM[mcpwm_num]->timer[timer_num].period.period);
  286. portEXIT_CRITICAL(&mcpwm_spinlock);
  287. return duty;
  288. }
  289. esp_err_t mcpwm_set_signal_high(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_operator_t op_num)
  290. {
  291. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  292. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  293. MCPWM_CHECK(op_num < MCPWM_OPR_MAX, MCPWM_OP_ERROR, ESP_ERR_INVALID_ARG);
  294. portENTER_CRITICAL(&mcpwm_spinlock);
  295. if (op_num == MCPWM_OPR_A) {
  296. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 2;
  297. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utea = 2;
  298. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utep = 2;
  299. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtez = 2;
  300. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtea = 2;
  301. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtep = 2;
  302. } else { //MCPWM_OPR_B
  303. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 2;
  304. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].uteb = 2;
  305. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utep = 2;
  306. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtez = 2;
  307. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dteb = 2;
  308. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtep = 2;
  309. }
  310. portEXIT_CRITICAL(&mcpwm_spinlock);
  311. return ESP_OK;
  312. }
  313. esp_err_t mcpwm_set_signal_low(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_operator_t op_num)
  314. {
  315. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  316. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  317. MCPWM_CHECK(op_num < MCPWM_OPR_MAX, MCPWM_OP_ERROR, ESP_ERR_INVALID_ARG);
  318. portENTER_CRITICAL(&mcpwm_spinlock);
  319. if (op_num == 0) {
  320. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 1;
  321. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utea = 1;
  322. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utep = 1;
  323. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtez = 1;
  324. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtea = 1;
  325. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtep = 1;
  326. } if (op_num == 1) {
  327. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utez = 1;
  328. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].uteb = 1;
  329. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].utep = 1;
  330. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtez = 1;
  331. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dteb = 1;
  332. MCPWM[mcpwm_num]->channel[timer_num].generator[op_num].dtep = 1;
  333. }
  334. portEXIT_CRITICAL(&mcpwm_spinlock);
  335. return ESP_OK;
  336. }
  337. esp_err_t mcpwm_carrier_enable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num)
  338. {
  339. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  340. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  341. portENTER_CRITICAL(&mcpwm_spinlock);
  342. MCPWM[mcpwm_num]->channel[timer_num].carrier_cfg.en = 1;
  343. portEXIT_CRITICAL(&mcpwm_spinlock);
  344. return ESP_OK;
  345. }
  346. esp_err_t mcpwm_carrier_disable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num)
  347. {
  348. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  349. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  350. portENTER_CRITICAL(&mcpwm_spinlock);
  351. MCPWM[mcpwm_num]->channel[timer_num].carrier_cfg.en = 0;
  352. portEXIT_CRITICAL(&mcpwm_spinlock);
  353. return ESP_OK;
  354. }
  355. esp_err_t mcpwm_carrier_set_period(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, uint8_t carrier_period)
  356. {
  357. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  358. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  359. portENTER_CRITICAL(&mcpwm_spinlock);
  360. MCPWM[mcpwm_num]->channel[timer_num].carrier_cfg.prescale = carrier_period;
  361. portEXIT_CRITICAL(&mcpwm_spinlock);
  362. return ESP_OK;
  363. }
  364. esp_err_t mcpwm_carrier_set_duty_cycle(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, uint8_t carrier_duty)
  365. {
  366. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  367. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  368. portENTER_CRITICAL(&mcpwm_spinlock);
  369. MCPWM[mcpwm_num]->channel[timer_num].carrier_cfg.duty = carrier_duty;
  370. portEXIT_CRITICAL(&mcpwm_spinlock);
  371. return ESP_OK;
  372. }
  373. esp_err_t mcpwm_carrier_oneshot_mode_enable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, uint8_t pulse_width)
  374. {
  375. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  376. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  377. portENTER_CRITICAL(&mcpwm_spinlock);
  378. MCPWM[mcpwm_num]->channel[timer_num].carrier_cfg.oshtwth = pulse_width;
  379. portEXIT_CRITICAL(&mcpwm_spinlock);
  380. return ESP_OK;
  381. }
  382. esp_err_t mcpwm_carrier_oneshot_mode_disable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num)
  383. {
  384. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  385. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  386. portENTER_CRITICAL(&mcpwm_spinlock);
  387. MCPWM[mcpwm_num]->channel[timer_num].carrier_cfg.oshtwth = 0;
  388. portEXIT_CRITICAL(&mcpwm_spinlock);
  389. return ESP_OK;
  390. }
  391. esp_err_t mcpwm_carrier_output_invert(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num,
  392. mcpwm_carrier_out_ivt_t carrier_ivt_mode)
  393. {
  394. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  395. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  396. portENTER_CRITICAL(&mcpwm_spinlock);
  397. MCPWM[mcpwm_num]->channel[timer_num].carrier_cfg.out_invert = carrier_ivt_mode;
  398. portEXIT_CRITICAL(&mcpwm_spinlock);
  399. return ESP_OK;
  400. }
  401. esp_err_t mcpwm_carrier_init(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, const mcpwm_carrier_config_t *carrier_conf)
  402. {
  403. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  404. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  405. portENTER_CRITICAL(&mcpwm_spinlock);
  406. mcpwm_carrier_enable(mcpwm_num, timer_num);
  407. mcpwm_carrier_set_period(mcpwm_num, timer_num, carrier_conf->carrier_period);
  408. mcpwm_carrier_set_duty_cycle(mcpwm_num, timer_num, carrier_conf->carrier_duty);
  409. if (carrier_conf->carrier_os_mode == MCPWM_ONESHOT_MODE_EN) {
  410. mcpwm_carrier_oneshot_mode_enable(mcpwm_num, timer_num, carrier_conf->pulse_width_in_os);
  411. } else {
  412. mcpwm_carrier_oneshot_mode_disable(mcpwm_num, timer_num);
  413. }
  414. mcpwm_carrier_output_invert(mcpwm_num, timer_num, carrier_conf->carrier_ivt_mode);
  415. MCPWM[mcpwm_num]->channel[timer_num].carrier_cfg.in_invert = 0;
  416. portEXIT_CRITICAL(&mcpwm_spinlock);
  417. return ESP_OK;
  418. }
  419. esp_err_t mcpwm_deadtime_enable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_deadtime_type_t dt_mode,
  420. uint32_t red, uint32_t fed)
  421. {
  422. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  423. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  424. MCPWM_CHECK(dt_mode < MCPWM_DEADTIME_TYPE_MAX, MCPWM_DB_ERROR, ESP_ERR_INVALID_ARG );
  425. portENTER_CRITICAL(&mcpwm_spinlock);
  426. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_upmethod = BIT(0);
  427. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_upmethod = BIT(0);
  428. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.clk_sel = 0;
  429. MCPWM[mcpwm_num]->channel[timer_num].db_red_cfg.red = red;
  430. MCPWM[mcpwm_num]->channel[timer_num].db_fed_cfg.fed = fed;
  431. switch (dt_mode) {
  432. case MCPWM_BYPASS_RED:
  433. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outbypass = 0; //S0
  434. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.a_outbypass = 1; //S1
  435. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_outinvert = 0; //S2
  436. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_outinvert = 0; //S3
  437. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_insel = 0; //S4
  438. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_insel = 1; //S5
  439. break;
  440. case MCPWM_BYPASS_FED:
  441. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outbypass = 1; //S0
  442. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.a_outbypass = 0; //S1
  443. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_outinvert = 0; //S2
  444. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_outinvert = 0; //S3
  445. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_insel = 0; //S4
  446. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_insel = 0; //S5
  447. break;
  448. case MCPWM_ACTIVE_HIGH_MODE:
  449. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outbypass = 0; //S0
  450. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.a_outbypass = 0; //S1
  451. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_outinvert = 0; //S2
  452. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_outinvert = 0; //S3
  453. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_insel = 0; //S4
  454. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_insel = 1; //S5
  455. break;
  456. case MCPWM_ACTIVE_LOW_MODE:
  457. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outbypass = 0; //S0
  458. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.a_outbypass = 0; //S1
  459. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_outinvert = 1; //S2
  460. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_outinvert = 1; //S3
  461. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_insel = 0; //S4
  462. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_insel = 1; //S5
  463. break;
  464. case MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE:
  465. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outbypass = 0; //S0
  466. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.a_outbypass = 0; //S1
  467. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_outinvert = 0; //S2
  468. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_outinvert = 1; //S3
  469. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_insel = 0; //S4
  470. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_insel = 1; //S5
  471. break;
  472. case MCPWM_ACTIVE_LOW_COMPLIMENT_MODE:
  473. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outbypass = 0; //S0
  474. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.a_outbypass = 0; //S1
  475. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_outinvert = 1; //S2
  476. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_outinvert = 0; //S3
  477. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_insel = 1; //S4
  478. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_insel = 0; //S5
  479. break;
  480. case MCPWM_ACTIVE_RED_FED_FROM_PWMXA:
  481. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outbypass = 0; //S0
  482. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_outinvert = 0; //S3
  483. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_insel = 1; //S4
  484. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.a_outswap = 1; //S6
  485. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outswap = 0; //S7
  486. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.deb_mode = 1; //S8
  487. break;
  488. case MCPWM_ACTIVE_RED_FED_FROM_PWMXB:
  489. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outbypass = 0; //S0
  490. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_outinvert = 0; //S3
  491. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_insel = 0; //S4
  492. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.a_outswap = 1; //S6
  493. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outswap = 0; //S7
  494. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.deb_mode = 1; //S8
  495. break;
  496. default :
  497. break;
  498. }
  499. portEXIT_CRITICAL(&mcpwm_spinlock);
  500. return ESP_OK;
  501. }
  502. esp_err_t mcpwm_deadtime_disable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num)
  503. {
  504. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  505. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  506. portENTER_CRITICAL(&mcpwm_spinlock);
  507. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outbypass = 1; //S0
  508. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.a_outbypass = 1; //S1
  509. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_outinvert = 0; //S2
  510. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_outinvert = 0; //S3
  511. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.red_insel = 0; //S4
  512. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.fed_insel = 0; //S5
  513. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.a_outswap = 0; //S6
  514. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.b_outswap = 0; //S7
  515. MCPWM[mcpwm_num]->channel[timer_num].db_cfg.deb_mode = 0; //S8
  516. portEXIT_CRITICAL(&mcpwm_spinlock);
  517. return ESP_OK;
  518. }
  519. esp_err_t mcpwm_fault_init(mcpwm_unit_t mcpwm_num, mcpwm_fault_input_level_t intput_level, mcpwm_fault_signal_t fault_sig)
  520. {
  521. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  522. portENTER_CRITICAL(&mcpwm_spinlock);
  523. switch (fault_sig) {
  524. case MCPWM_SELECT_F0:
  525. MCPWM[mcpwm_num]->fault_detect.f0_en = 1;
  526. MCPWM[mcpwm_num]->fault_detect.f0_pole = intput_level;
  527. break;
  528. case MCPWM_SELECT_F1:
  529. MCPWM[mcpwm_num]->fault_detect.f1_en = 1;
  530. MCPWM[mcpwm_num]->fault_detect.f1_pole = intput_level;
  531. break;
  532. case MCPWM_SELECT_F2:
  533. MCPWM[mcpwm_num]->fault_detect.f2_en = 1;
  534. MCPWM[mcpwm_num]->fault_detect.f2_pole = intput_level;
  535. break;
  536. default :
  537. break;
  538. }
  539. portEXIT_CRITICAL(&mcpwm_spinlock);
  540. return ESP_OK;
  541. }
  542. esp_err_t mcpwm_fault_deinit(mcpwm_unit_t mcpwm_num, mcpwm_fault_signal_t fault_sig)
  543. {
  544. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  545. portENTER_CRITICAL(&mcpwm_spinlock);
  546. if (fault_sig == MCPWM_SELECT_F0) {
  547. MCPWM[mcpwm_num]->fault_detect.f0_en = 0;
  548. } else if (fault_sig == MCPWM_SELECT_F1) {
  549. MCPWM[mcpwm_num]->fault_detect.f1_en = 0;
  550. } else { //MCPWM_SELECT_F2
  551. MCPWM[mcpwm_num]->fault_detect.f2_en = 0;
  552. }
  553. portEXIT_CRITICAL(&mcpwm_spinlock);
  554. return ESP_OK;
  555. }
  556. esp_err_t mcpwm_fault_set_cyc_mode(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_fault_signal_t fault_sig,
  557. mcpwm_action_on_pwmxa_t action_on_pwmxa, mcpwm_action_on_pwmxb_t action_on_pwmxb)
  558. {
  559. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  560. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  561. portENTER_CRITICAL(&mcpwm_spinlock);
  562. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg1.cbcpulse = BIT(0);
  563. if (fault_sig == MCPWM_SELECT_F0) {
  564. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f0_cbc = 1;
  565. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f0_ost = 0;
  566. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_cbc_d = action_on_pwmxa;
  567. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_cbc_u = action_on_pwmxa;
  568. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_cbc_d = action_on_pwmxb;
  569. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_cbc_u = action_on_pwmxb;
  570. } else if (fault_sig == MCPWM_SELECT_F1) {
  571. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f1_cbc = 1;
  572. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f1_ost = 0;
  573. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_cbc_d = action_on_pwmxa;
  574. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_cbc_u = action_on_pwmxa;
  575. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_cbc_d = action_on_pwmxb;
  576. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_cbc_u = action_on_pwmxb;
  577. } else { //MCPWM_SELECT_F2
  578. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f2_cbc = 1;
  579. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f2_ost = 0;
  580. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_cbc_d = action_on_pwmxa;
  581. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_cbc_u = action_on_pwmxa;
  582. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_cbc_d = action_on_pwmxb;
  583. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_cbc_u = action_on_pwmxb;
  584. }
  585. portEXIT_CRITICAL(&mcpwm_spinlock);
  586. return ESP_OK;
  587. }
  588. esp_err_t mcpwm_fault_set_oneshot_mode(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_fault_signal_t fault_sig,
  589. mcpwm_action_on_pwmxa_t action_on_pwmxa, mcpwm_action_on_pwmxb_t action_on_pwmxb)
  590. {
  591. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  592. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  593. portENTER_CRITICAL(&mcpwm_spinlock);
  594. if (fault_sig == MCPWM_SELECT_F0) {
  595. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f0_ost = 1;
  596. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f0_cbc = 0;
  597. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_ost_d = action_on_pwmxa;
  598. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_ost_u = action_on_pwmxa;
  599. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_ost_d = action_on_pwmxb;
  600. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_ost_u = action_on_pwmxb;
  601. } else if (fault_sig == MCPWM_SELECT_F1) {
  602. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f1_ost = 1;
  603. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f1_cbc = 0;
  604. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_ost_d = action_on_pwmxa;
  605. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_ost_u = action_on_pwmxa;
  606. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_ost_d = action_on_pwmxb;
  607. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_ost_u = action_on_pwmxb;
  608. } else { //MCPWM_SELECT_F2
  609. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f2_ost = 1;
  610. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.f2_cbc = 0;
  611. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_ost_d = action_on_pwmxa;
  612. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.a_ost_u = action_on_pwmxa;
  613. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_ost_d = action_on_pwmxb;
  614. MCPWM[mcpwm_num]->channel[timer_num].tz_cfg0.b_ost_u = action_on_pwmxb;
  615. }
  616. portEXIT_CRITICAL(&mcpwm_spinlock);
  617. return ESP_OK;
  618. }
  619. esp_err_t mcpwm_capture_enable(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t cap_sig, mcpwm_capture_on_edge_t cap_edge,
  620. uint32_t num_of_pulse)
  621. {
  622. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  623. portENTER_CRITICAL(&mcpwm_spinlock);
  624. MCPWM[mcpwm_num]->cap_timer_cfg.timer_en = 1;
  625. MCPWM[mcpwm_num]->cap_cfg_ch[cap_sig].en = 1;
  626. MCPWM[mcpwm_num]->cap_cfg_ch[cap_sig].mode = (1 << cap_edge);
  627. MCPWM[mcpwm_num]->cap_cfg_ch[cap_sig].prescale = num_of_pulse;
  628. portEXIT_CRITICAL(&mcpwm_spinlock);
  629. return ESP_OK;
  630. }
  631. esp_err_t mcpwm_capture_disable(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t cap_sig)
  632. {
  633. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  634. portENTER_CRITICAL(&mcpwm_spinlock);
  635. MCPWM[mcpwm_num]->cap_cfg_ch[cap_sig].en = 0;
  636. portEXIT_CRITICAL(&mcpwm_spinlock);
  637. return ESP_OK;
  638. }
  639. uint32_t mcpwm_capture_signal_get_value(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t cap_sig)
  640. {
  641. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  642. return MCPWM[mcpwm_num]->cap_val_ch[cap_sig];
  643. }
  644. uint32_t mcpwm_capture_signal_get_edge(mcpwm_unit_t mcpwm_num, mcpwm_capture_signal_t cap_sig)
  645. {
  646. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  647. if (cap_sig == MCPWM_SELECT_CAP0) {
  648. return ( MCPWM[mcpwm_num]->cap_status.cap0_edge + 1);
  649. } else if (cap_sig == MCPWM_SELECT_CAP1) {
  650. return (MCPWM[mcpwm_num]->cap_status.cap1_edge + 1);
  651. } else { //MCPWM_SELECT_CAP2
  652. return (MCPWM[mcpwm_num]->cap_status.cap2_edge + 1);
  653. }
  654. return 0;
  655. }
  656. esp_err_t mcpwm_sync_enable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_sync_signal_t sync_sig,
  657. uint32_t phase_val)
  658. {
  659. uint32_t set_phase;
  660. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  661. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  662. portENTER_CRITICAL(&mcpwm_spinlock);
  663. set_phase = (MCPWM[mcpwm_num]->timer[timer_num].period.period) * (phase_val) / 1000;
  664. MCPWM[mcpwm_num]->timer[timer_num].sync.timer_phase = set_phase;
  665. if (timer_num == MCPWM_TIMER_0) {
  666. MCPWM[mcpwm_num]->timer_synci_cfg.t0_in_sel = sync_sig;
  667. } else if (timer_num == MCPWM_TIMER_1) {
  668. MCPWM[mcpwm_num]->timer_synci_cfg.t1_in_sel = sync_sig;
  669. } else { //MCPWM_TIMER_2
  670. MCPWM[mcpwm_num]->timer_synci_cfg.t2_in_sel = sync_sig;
  671. }
  672. MCPWM[mcpwm_num]->timer[timer_num].sync.out_sel = 0;
  673. MCPWM[mcpwm_num]->timer[timer_num].sync.in_en = 1;
  674. portEXIT_CRITICAL(&mcpwm_spinlock);
  675. return ESP_OK;
  676. }
  677. esp_err_t mcpwm_sync_disable(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num)
  678. {
  679. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  680. MCPWM_CHECK(timer_num < MCPWM_TIMER_MAX, MCPWM_TIMER_ERROR, ESP_ERR_INVALID_ARG);
  681. portENTER_CRITICAL(&mcpwm_spinlock);
  682. MCPWM[mcpwm_num]->timer[timer_num].sync.in_en = 0;
  683. portEXIT_CRITICAL(&mcpwm_spinlock);
  684. return ESP_OK;
  685. }
  686. esp_err_t mcpwm_isr_register(mcpwm_unit_t mcpwm_num, void (*fn)(void *), void *arg, int intr_alloc_flags, intr_handle_t *handle)
  687. {
  688. esp_err_t ret;
  689. MCPWM_CHECK(mcpwm_num < MCPWM_UNIT_MAX, MCPWM_UNIT_NUM_ERROR, ESP_ERR_INVALID_ARG);
  690. MCPWM_CHECK(fn != NULL, MCPWM_PARAM_ADDR_ERROR, ESP_ERR_INVALID_ARG);
  691. ret = esp_intr_alloc((ETS_PWM0_INTR_SOURCE + mcpwm_num), intr_alloc_flags, fn, arg, handle);
  692. return ret;
  693. }