40
40
#include "mphalport.h"
41
41
#include "esp_err.h"
42
42
43
- #if SOC_MCPWM_SUPPORTED | 1
43
+ #if SOC_MCPWM_SUPPORTED
44
44
45
45
// #if SOC_TEMP_SENSOR_SUPPORTED
46
46
@@ -190,7 +190,7 @@ STATIC void gen_action_config7(mcpwm_gen_handle_t gena, mcpwm_gen_handle_t genb,
190
190
STATIC void dead_time_config7 (esp32_mcpwm_obj_t * self , mcpwm_gen_handle_t gena , mcpwm_gen_handle_t genb ) {
191
191
mcpwm_dead_time_config_t dead_time_config = {
192
192
.posedge_delay_ticks = self -> deadtime_ticks ,
193
- .negedge_delay_ticks = 0
193
+ .negedge_delay_ticks = 0 ,
194
194
};
195
195
check_esp_err (mcpwm_generator_set_dead_time (gena , gena , & dead_time_config ));
196
196
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,
212
212
mcpwm_dead_time_config_t dead_time_config = {
213
213
.posedge_delay_ticks = self -> deadtime_ticks ,
214
214
.negedge_delay_ticks = 0 ,
215
- .flags .invert_output = true
215
+ .flags .invert_output = true,
216
216
};
217
217
check_esp_err (mcpwm_generator_set_dead_time (gena , gena , & dead_time_config ));
218
218
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,
254
254
mcpwm_dead_time_config_t dead_time_config = {
255
255
.posedge_delay_ticks = self -> deadtime_ticks ,
256
256
.negedge_delay_ticks = 0 ,
257
- .flags .invert_output = true
257
+ .flags .invert_output = true,
258
258
};
259
259
check_esp_err (mcpwm_generator_set_dead_time (gena , gena , & dead_time_config ));
260
260
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,
339
339
check_esp_err (mcpwm_generator_set_dead_time (genb , genb , & dead_time_config ));
340
340
}
341
341
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
+ */
342
476
STATIC void esp32_mcpwm_set_compare_value (esp32_mcpwm_obj_t * self , uint32_t compare_value ) {
343
477
check_esp_err (mcpwm_comparator_set_compare_value (self -> cmpa , compare_value ));
344
478
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) {
354
488
check_esp_err (mcpwm_timer_disable (self -> timer ));
355
489
}
356
490
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 );
359
493
return mp_const_none ;
360
494
}
361
495
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (mcpwm_resume_obj , mcpwm_resume );
362
496
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 );
365
499
return mp_const_none ;
366
500
}
367
501
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) {
519
653
gen_action_config13 (self -> gena , self -> genb , self -> cmpa , self -> cmpb );
520
654
dead_time_config13 (self , self -> gena , self -> genb );
521
655
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 ;
522
660
default :
523
661
mp_raise_msg_varg (& mp_type_ValueError , MP_ERROR_TEXT ("out of MCPWM action range [1-13]:%d" ), self -> action );
524
662
break ;
@@ -542,7 +680,7 @@ STATIC void mp_esp32_mcpwm_init_helper(esp32_mcpwm_obj_t *self,
542
680
{ MP_QSTR_sync , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 }},
543
681
{ MP_QSTR_xor , MP_ARG_KW_ONLY | MP_ARG_INT , {.u_int = -1 }},
544
682
{ 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 }},
546
684
};
547
685
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
548
686
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[] = {
733
871
{ MP_ROM_QSTR (MP_QSTR_freq ), MP_ROM_PTR (& mcpwm_freq_obj ) },
734
872
{ MP_ROM_QSTR (MP_QSTR_pause ), MP_ROM_PTR (& mcpwm_pause_obj ) },
735
873
{ 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 ) },
736
884
};
737
885
STATIC MP_DEFINE_CONST_DICT (mcpwm_locals_dict , mcpwm_locals_dict_table );
738
886
0 commit comments