Skip to content

Commit eab9827

Browse files
committed
esp32/MCPWM: Add complementary PWMs.
Signed-off-by: Ihor Nehrutsa <Ihor.Nehrutsa@gmail.com>
1 parent 246ff81 commit eab9827

File tree

1 file changed

+157
-9
lines changed

1 file changed

+157
-9
lines changed

ports/esp32/esp32_mcpwm.c

Lines changed: 157 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
#include "mphalport.h"
4141
#include "esp_err.h"
4242

43-
#if SOC_MCPWM_SUPPORTED | 1
43+
#if SOC_MCPWM_SUPPORTED
4444

4545
// #if SOC_TEMP_SENSOR_SUPPORTED
4646

@@ -190,7 +190,7 @@ STATIC void gen_action_config7(mcpwm_gen_handle_t gena, mcpwm_gen_handle_t genb,
190190
STATIC void dead_time_config7(esp32_mcpwm_obj_t *self, mcpwm_gen_handle_t gena, mcpwm_gen_handle_t genb) {
191191
mcpwm_dead_time_config_t dead_time_config = {
192192
.posedge_delay_ticks = self->deadtime_ticks,
193-
.negedge_delay_ticks = 0
193+
.negedge_delay_ticks = 0,
194194
};
195195
check_esp_err(mcpwm_generator_set_dead_time(gena, gena, &dead_time_config));
196196
dead_time_config.posedge_delay_ticks = 0;
@@ -212,7 +212,7 @@ STATIC void dead_time_config8(esp32_mcpwm_obj_t *self, mcpwm_gen_handle_t gena,
212212
mcpwm_dead_time_config_t dead_time_config = {
213213
.posedge_delay_ticks = self->deadtime_ticks,
214214
.negedge_delay_ticks = 0,
215-
.flags.invert_output = true
215+
.flags.invert_output = true,
216216
};
217217
check_esp_err(mcpwm_generator_set_dead_time(gena, gena, &dead_time_config));
218218
dead_time_config.posedge_delay_ticks = 0;
@@ -254,7 +254,7 @@ STATIC void dead_time_config10(esp32_mcpwm_obj_t *self, mcpwm_gen_handle_t gena,
254254
mcpwm_dead_time_config_t dead_time_config = {
255255
.posedge_delay_ticks = self->deadtime_ticks,
256256
.negedge_delay_ticks = 0,
257-
.flags.invert_output = true
257+
.flags.invert_output = true,
258258
};
259259
check_esp_err(mcpwm_generator_set_dead_time(gena, gena, &dead_time_config));
260260
dead_time_config.posedge_delay_ticks = 0;
@@ -339,6 +339,140 @@ STATIC void dead_time_config13(esp32_mcpwm_obj_t *self, mcpwm_gen_handle_t gena,
339339
check_esp_err(mcpwm_generator_set_dead_time(genb, genb, &dead_time_config));
340340
}
341341

342+
// https://github.com/espressif/esp-idf/blob/3b748a6cb76c2db7c6368a0dea32a88bc58bc44d/examples/peripherals/mcpwm/mcpwm_bldc_hall_control/main/mcpwm_bldc_hall_control_example_main.c#L263
343+
STATIC void gen_action_config14(mcpwm_gen_handle_t gena, mcpwm_gen_handle_t genb, mcpwm_cmpr_handle_t cmpa, mcpwm_cmpr_handle_t cmpb) {
344+
check_esp_err(mcpwm_generator_set_action_on_timer_event(gena,
345+
MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
346+
check_esp_err(mcpwm_generator_set_action_on_compare_event(gena,
347+
MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, cmpa, MCPWM_GEN_ACTION_LOW)));
348+
check_esp_err(mcpwm_generator_set_action_on_brake_event(gena,
349+
MCPWM_GEN_BRAKE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_OPER_BRAKE_MODE_CBC, MCPWM_GEN_ACTION_LOW)));
350+
check_esp_err(mcpwm_generator_set_action_on_brake_event(gena,
351+
MCPWM_GEN_BRAKE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_OPER_BRAKE_MODE_CBC, MCPWM_GEN_ACTION_LOW)));
352+
353+
check_esp_err(mcpwm_generator_set_action_on_timer_event(genb,
354+
MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH)));
355+
check_esp_err(mcpwm_generator_set_action_on_compare_event(genb,
356+
MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, cmpb, MCPWM_GEN_ACTION_LOW)));
357+
check_esp_err(mcpwm_generator_set_action_on_brake_event(genb,
358+
MCPWM_GEN_BRAKE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_OPER_BRAKE_MODE_CBC, MCPWM_GEN_ACTION_LOW)));
359+
check_esp_err(mcpwm_generator_set_action_on_brake_event(genb,
360+
MCPWM_GEN_BRAKE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_OPER_BRAKE_MODE_CBC, MCPWM_GEN_ACTION_LOW)));
361+
}
362+
// +
363+
STATIC void dead_time_config14(esp32_mcpwm_obj_t *self, mcpwm_gen_handle_t gena, mcpwm_gen_handle_t genb) {
364+
mcpwm_dead_time_config_t dead_time_config = {
365+
.posedge_delay_ticks = self->deadtime_ticks,
366+
.negedge_delay_ticks = 0,
367+
.flags.invert_output = false,
368+
};
369+
check_esp_err(mcpwm_generator_set_dead_time(gena, gena, &dead_time_config));
370+
dead_time_config.posedge_delay_ticks = 0;
371+
dead_time_config.negedge_delay_ticks = self->deadtime_ticks;
372+
dead_time_config.flags.invert_output = true;
373+
check_esp_err(mcpwm_generator_set_dead_time(genb, genb, &dead_time_config));
374+
}
375+
376+
STATIC void esp32_mcpwm_motor_force_10(esp32_mcpwm_obj_t *self)
377+
{
378+
// because gen_low is inverted by dead time module, so we need to set force level to 1 and get 0
379+
check_esp_err(mcpwm_generator_set_force_level(self->genb, 1, true));
380+
check_esp_err(mcpwm_generator_set_force_level(self->gena, -1, true));
381+
}
382+
383+
STATIC void esp32_mcpwm_motor_force0_1(esp32_mcpwm_obj_t *self)
384+
{
385+
check_esp_err(mcpwm_generator_set_force_level(self->gena, 0, true));
386+
check_esp_err(mcpwm_generator_set_force_level(self->genb, -1, true));
387+
}
388+
/*
389+
STATIC void esp32_mcpwm_motor_coast(esp32_mcpwm_obj_t *self)
390+
{
391+
check_esp_err(mcpwm_generator_set_force_level(self->gena, 0, true));
392+
check_esp_err(mcpwm_generator_set_force_level(self->genb, 0, true));
393+
}
394+
395+
STATIC void esp32_mcpwm_motor_brake(esp32_mcpwm_obj_t *self)
396+
{
397+
check_esp_err(mcpwm_generator_set_force_level(self->gena, 1, true));
398+
check_esp_err(mcpwm_generator_set_force_level(self->genb, 1, true));
399+
}
400+
*/
401+
STATIC void esp32_mcpwm_motor_force00(esp32_mcpwm_obj_t *self)
402+
{
403+
check_esp_err(mcpwm_generator_set_force_level(self->gena, 0, true));
404+
// because gen_low is inverted by dead time module, so we need to set force level to 1 and get 0
405+
check_esp_err(mcpwm_generator_set_force_level(self->genb, 1, true));
406+
}
407+
408+
STATIC void esp32_mcpwm_motor_force10(esp32_mcpwm_obj_t *self)
409+
{
410+
check_esp_err(mcpwm_generator_set_force_level(self->gena, 1, true));
411+
// because gen_low is inverted by dead time module, so we need to set force level to 1 and get 0
412+
check_esp_err(mcpwm_generator_set_force_level(self->genb, 1, true));
413+
}
414+
415+
STATIC void esp32_mcpwm_motor_force01(esp32_mcpwm_obj_t *self)
416+
{
417+
check_esp_err(mcpwm_generator_set_force_level(self->gena, 0, true));
418+
// because gen_low is inverted by dead time module, so we need to set force level to 0 and get 1
419+
check_esp_err(mcpwm_generator_set_force_level(self->genb, 0, true));
420+
}
421+
422+
STATIC void esp32_mcpwm_motor_force_1_1(esp32_mcpwm_obj_t *self)
423+
{
424+
check_esp_err(mcpwm_generator_set_force_level(self->gena, -1, true));
425+
check_esp_err(mcpwm_generator_set_force_level(self->genb, -1, true));
426+
}
427+
428+
STATIC mp_obj_t mcpwm_force00(mp_obj_t self) {
429+
esp32_mcpwm_motor_force00(self);
430+
return mp_const_none;
431+
}
432+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcpwm_force00_obj, mcpwm_force00);
433+
434+
STATIC mp_obj_t mcpwm_force10(mp_obj_t self) {
435+
esp32_mcpwm_motor_force10(self);
436+
return mp_const_none;
437+
}
438+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcpwm_force10_obj, mcpwm_force10);
439+
440+
STATIC mp_obj_t mcpwm_force01(mp_obj_t self) {
441+
esp32_mcpwm_motor_force01(self);
442+
return mp_const_none;
443+
}
444+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcpwm_force01_obj, mcpwm_force01);
445+
446+
STATIC mp_obj_t mcpwm_force_1_1(mp_obj_t self) {
447+
esp32_mcpwm_motor_force_1_1(self);
448+
return mp_const_none;
449+
}
450+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcpwm_force_1_1_obj, mcpwm_force_1_1);
451+
452+
STATIC mp_obj_t mcpwm_force_10(mp_obj_t self) {
453+
esp32_mcpwm_motor_force_10(self);
454+
return mp_const_none;
455+
}
456+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcpwm_force_10_obj, mcpwm_force_10);
457+
458+
STATIC mp_obj_t mcpwm_force0_1(mp_obj_t self) {
459+
esp32_mcpwm_motor_force0_1(self);
460+
return mp_const_none;
461+
}
462+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcpwm_force0_1_obj, mcpwm_force0_1);
463+
/*
464+
STATIC mp_obj_t mcpwm_coast(mp_obj_t self) {
465+
esp32_mcpwm_motor_coast(self);
466+
return mp_const_none;
467+
}
468+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcpwm_coast_obj, mcpwm_coast);
469+
470+
STATIC mp_obj_t mcpwm_brake(mp_obj_t self) {
471+
esp32_mcpwm_motor_brake(self);
472+
return mp_const_none;
473+
}
474+
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcpwm_brake_obj, mcpwm_brake);
475+
*/
342476
STATIC void esp32_mcpwm_set_compare_value(esp32_mcpwm_obj_t *self, uint32_t compare_value) {
343477
check_esp_err(mcpwm_comparator_set_compare_value(self->cmpa, compare_value));
344478
check_esp_err(mcpwm_comparator_set_compare_value(self->cmpb, compare_value));
@@ -354,14 +488,14 @@ STATIC void esp32_mcpwm_disable(esp32_mcpwm_obj_t *self) {
354488
check_esp_err(mcpwm_timer_disable(self->timer));
355489
}
356490

357-
STATIC mp_obj_t mcpwm_resume(mp_obj_t self_in) {
358-
esp32_mcpwm_enable(self_in);
491+
STATIC mp_obj_t mcpwm_resume(mp_obj_t self) {
492+
esp32_mcpwm_enable(self);
359493
return mp_const_none;
360494
}
361495
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcpwm_resume_obj, mcpwm_resume);
362496

363-
STATIC mp_obj_t mcpwm_pause(mp_obj_t self_in) {
364-
esp32_mcpwm_disable(self_in);
497+
STATIC mp_obj_t mcpwm_pause(mp_obj_t self) {
498+
esp32_mcpwm_disable(self);
365499
return mp_const_none;
366500
}
367501
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mcpwm_pause_obj, mcpwm_pause);
@@ -519,6 +653,10 @@ STATIC void configure_mcpwm(esp32_mcpwm_obj_t *self) {
519653
gen_action_config13(self->gena, self->genb, self->cmpa, self->cmpb);
520654
dead_time_config13(self, self->gena, self->genb);
521655
break;
656+
case 14:
657+
gen_action_config14(self->gena, self->genb, self->cmpa, self->cmpb);
658+
dead_time_config14(self, self->gena, self->genb);
659+
break;
522660
default:
523661
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("out of MCPWM action range [1-13]:%d"), self->action);
524662
break;
@@ -542,7 +680,7 @@ STATIC void mp_esp32_mcpwm_init_helper(esp32_mcpwm_obj_t *self,
542680
{ MP_QSTR_sync, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1}},
543681
{ MP_QSTR_xor, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1}},
544682
{ MP_QSTR_deadtime, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1}},
545-
{ MP_QSTR_waveform, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 7}},
683+
{ MP_QSTR_waveform, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 14}},
546684
};
547685
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
548686
mp_arg_parse_all(n_args, pos_args, kw_args,
@@ -733,6 +871,16 @@ STATIC const mp_rom_map_elem_t mcpwm_locals_dict_table[] = {
733871
{ MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&mcpwm_freq_obj) },
734872
{ MP_ROM_QSTR(MP_QSTR_pause), MP_ROM_PTR(&mcpwm_pause_obj) },
735873
{ MP_ROM_QSTR(MP_QSTR_resume), MP_ROM_PTR(&mcpwm_resume_obj) },
874+
{ MP_ROM_QSTR(MP_QSTR_force_10), MP_ROM_PTR(&mcpwm_force_10_obj) },
875+
{ MP_ROM_QSTR(MP_QSTR_force0_1), MP_ROM_PTR(&mcpwm_force0_1_obj) },
876+
/*
877+
{ MP_ROM_QSTR(MP_QSTR_coast), MP_ROM_PTR(&mcpwm_coast_obj) },
878+
{ MP_ROM_QSTR(MP_QSTR_brake), MP_ROM_PTR(&mcpwm_brake_obj) },
879+
*/
880+
{ MP_ROM_QSTR(MP_QSTR_force00), MP_ROM_PTR(&mcpwm_force00_obj) },
881+
{ MP_ROM_QSTR(MP_QSTR_force10), MP_ROM_PTR(&mcpwm_force10_obj) },
882+
{ MP_ROM_QSTR(MP_QSTR_force01), MP_ROM_PTR(&mcpwm_force01_obj) },
883+
{ MP_ROM_QSTR(MP_QSTR_force_1_1), MP_ROM_PTR(&mcpwm_force_1_1_obj) },
736884
};
737885
STATIC MP_DEFINE_CONST_DICT(mcpwm_locals_dict, mcpwm_locals_dict_table);
738886

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy