@@ -49,15 +49,28 @@ void _configureTimerFrequency(long pwm_frequency, mcpwm_dev_t* mcpwm_num, mcpwm
49
49
50
50
if (_isset (dead_zone)){
51
51
// dead zone is configured
52
- float dead_time = (float )(_MCPWM_FREQ / (pwm_frequency)) * dead_zone;
53
- mcpwm_deadtime_type_t pwm_mode;
54
- if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == true ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == true )) {pwm_mode = MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE;} // Normal, noninverting driver
55
- else if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == true ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == false )){pwm_mode = MCPWM_ACTIVE_HIGH_MODE;} // Inverted lowside driver
56
- else if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == false ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == true )) {pwm_mode = MCPWM_ACTIVE_LOW_MODE;} // Inverted highside driver
57
- else if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == false ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == false )){pwm_mode = MCPWM_ACTIVE_LOW_COMPLIMENT_MODE;} // Inverted low- & highside driver. Caution: This may short the FETs on reset of the ESP32, as both pins get pulled low!
58
- mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_0, pwm_mode, dead_time/2.0 , dead_time/2.0 );
59
- mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_1, pwm_mode, dead_time/2.0 , dead_time/2.0 );
60
- mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_2, pwm_mode, dead_time/2.0 , dead_time/2.0 );
52
+
53
+ // When using hardware deadtime, setting the phase_state parameter is not supported.
54
+ #if SIMPLEFOC_ESP32_HW_DEADTIME == true
55
+ float dead_time = (float )(_MCPWM_FREQ / (pwm_frequency)) * dead_zone;
56
+ mcpwm_deadtime_type_t pwm_mode;
57
+ if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == true ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == true )) {pwm_mode = MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE;} // Normal, noninverting driver
58
+ else if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == true ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == false )){pwm_mode = MCPWM_ACTIVE_HIGH_MODE;} // Inverted lowside driver
59
+ else if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == false ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == true )) {pwm_mode = MCPWM_ACTIVE_LOW_MODE;} // Inverted highside driver
60
+ else if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == false ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == false )){pwm_mode = MCPWM_ACTIVE_LOW_COMPLIMENT_MODE;} // Inverted low- & highside driver. Caution: This may short the FETs on reset of the ESP32, as both pins get pulled low!
61
+ mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_0, pwm_mode, dead_time/2.0 , dead_time/2.0 );
62
+ mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_1, pwm_mode, dead_time/2.0 , dead_time/2.0 );
63
+ mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_2, pwm_mode, dead_time/2.0 , dead_time/2.0 );
64
+ #else // Software deadtime
65
+ for (int i = 0 ; i < 3 ; i++){
66
+ if (SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == true ) {mcpwm_set_duty_type (mcpwm_unit, (mcpwm_timer_t ) i, MCPWM_GEN_A, MCPWM_DUTY_MODE_0);} // Normal, noninverted highside
67
+ else if (SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == false ) {mcpwm_set_duty_type (mcpwm_unit, (mcpwm_timer_t ) i, MCPWM_GEN_A, MCPWM_DUTY_MODE_1);} // Inverted highside driver
68
+
69
+ if (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == true ) {mcpwm_set_duty_type (mcpwm_unit, (mcpwm_timer_t ) i, MCPWM_GEN_B, MCPWM_DUTY_MODE_1);} // Normal, complementary lowside
70
+ else if (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == false ) {mcpwm_set_duty_type (mcpwm_unit, (mcpwm_timer_t ) i, MCPWM_GEN_B, MCPWM_DUTY_MODE_0);} // Inverted lowside driver
71
+ }
72
+ #endif
73
+
61
74
}
62
75
_delay (100 );
63
76
@@ -374,7 +387,10 @@ void* _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, cons
374
387
ESP32MCPWMDriverParams* params = new ESP32MCPWMDriverParams {
375
388
.pwm_frequency = pwm_frequency,
376
389
.mcpwm_dev = m_slot.mcpwm_num ,
377
- .mcpwm_unit = m_slot.mcpwm_unit
390
+ .mcpwm_unit = m_slot.mcpwm_unit ,
391
+ .mcpwm_operator1 = m_slot.mcpwm_operator1 ,
392
+ .mcpwm_operator2 = m_slot.mcpwm_operator2 ,
393
+ .deadtime = _isset (dead_zone) ? dead_zone : 0
378
394
};
379
395
return params;
380
396
}
@@ -386,15 +402,26 @@ void* _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, cons
386
402
// - BLDC driver - 6PWM setting
387
403
// - hardware specific
388
404
void _writeDutyCycle6PWM (float dc_a, float dc_b, float dc_c, PhaseState *phase_state, void * params){
389
- // se the PWM on the slot timers
405
+ // set the PWM on the slot timers
390
406
// transform duty cycle from [0,1] to [0,100.0]
391
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_0, MCPWM_OPR_A, dc_a*100.0 );
392
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_0, MCPWM_OPR_B, dc_a*100.0 );
393
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_1, MCPWM_OPR_A, dc_b*100.0 );
394
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_1, MCPWM_OPR_B, dc_b*100.0 );
395
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_2, MCPWM_OPR_A, dc_c*100.0 );
396
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_2, MCPWM_OPR_B, dc_c*100.0 );
397
- _UNUSED (phase_state);
407
+ #if SIMPLEFOC_ESP32_HW_DEADTIME == true
408
+ // Hardware deadtime does deadtime insertion internally
409
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_0, MCPWM_OPR_A, dc_a*100 .0f );
410
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_0, MCPWM_OPR_B, dc_a*100 .0f );
411
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_1, MCPWM_OPR_A, dc_b*100 .0f );
412
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_1, MCPWM_OPR_B, dc_b*100 .0f );
413
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_2, MCPWM_OPR_A, dc_c*100 .0f );
414
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_2, MCPWM_OPR_B, dc_c*100 .0f );
415
+ _UNUSED (phase_state);
416
+ #else
417
+ float deadtime = 0 .5f *((ESP32MCPWMDriverParams*)params)->deadtime ;
418
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_0, MCPWM_OPR_A, (phase_state[0 ] == PHASE_ON || phase_state[0 ] == PHASE_HI) ? _constrain (dc_a-deadtime, 0 .0f , 1 .0f ) * 100 .0f : 0 );
419
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_0, MCPWM_OPR_B, (phase_state[0 ] == PHASE_ON || phase_state[0 ] == PHASE_LO) ? _constrain (dc_a+deadtime, 0 .0f , 1 .0f ) * 100 .0f : 100 .0f );
420
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_1, MCPWM_OPR_A, (phase_state[1 ] == PHASE_ON || phase_state[1 ] == PHASE_HI) ? _constrain (dc_b-deadtime, 0 .0f , 1 .0f ) * 100 .0f : 0 );
421
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_1, MCPWM_OPR_B, (phase_state[1 ] == PHASE_ON || phase_state[1 ] == PHASE_LO) ? _constrain (dc_b+deadtime, 0 .0f , 1 .0f ) * 100 .0f : 100 .0f );
422
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_2, MCPWM_OPR_A, (phase_state[2 ] == PHASE_ON || phase_state[2 ] == PHASE_HI) ? _constrain (dc_c-deadtime, 0 .0f , 1 .0f ) * 100 .0f : 0 );
423
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_2, MCPWM_OPR_B, (phase_state[2 ] == PHASE_ON || phase_state[2 ] == PHASE_LO) ? _constrain (dc_c+deadtime, 0 .0f , 1 .0f ) * 100 .0f : 100 .0f );
424
+ #endif
398
425
}
399
426
400
427
#endif
0 commit comments