2
2
3
3
#if defined(ESP_H) && defined(ARDUINO_ARCH_ESP32) && defined(SOC_MCPWM_SUPPORTED) && !defined(SIMPLEFOC_ESP32_USELEDC)
4
4
5
+ #ifndef SIMPLEFOC_ESP32_HW_DEADTIME
6
+ #define SIMPLEFOC_ESP32_HW_DEADTIME true // TODO: Change to false when sw-deadtime & phase_state is approved ready for general use.
7
+ #endif
8
+
5
9
// define bldc motor slots array
6
10
bldc_3pwm_motor_slots_t esp32_bldc_3pwm_motor_slots[4 ] = {
7
11
{_EMPTY_SLOT, &MCPWM0, MCPWM_UNIT_0, MCPWM_OPR_A, MCPWM0A, MCPWM1A, MCPWM2A}, // 1st motor will be MCPWM0 channel A
@@ -41,18 +45,36 @@ void _configureTimerFrequency(long pwm_frequency, mcpwm_dev_t* mcpwm_num, mcpwm
41
45
42
46
mcpwm_config_t pwm_config;
43
47
pwm_config.counter_mode = MCPWM_UP_DOWN_COUNTER; // Up-down counter (triangle wave)
44
- pwm_config.duty_mode = MCPWM_DUTY_MODE_0; // Active HIGH
48
+ pwm_config.duty_mode = ( _isset (dead_zone) || SIMPLEFOC_PWM_ACTIVE_HIGH == true ) ? MCPWM_DUTY_MODE_0 : MCPWM_DUTY_MODE_1 ; // Normally Active HIGH (MCPWM_DUTY_MODE_0)
45
49
pwm_config.frequency = 2 *pwm_frequency; // set the desired freq - just a placeholder for now https://github.com/simplefoc/Arduino-FOC/issues/76
46
50
mcpwm_init (mcpwm_unit, MCPWM_TIMER_0, &pwm_config); // Configure PWM0A & PWM0B with above settings
47
51
mcpwm_init (mcpwm_unit, MCPWM_TIMER_1, &pwm_config); // Configure PWM1A & PWM1B with above settings
48
52
mcpwm_init (mcpwm_unit, MCPWM_TIMER_2, &pwm_config); // Configure PWM2A & PWM2B with above settings
49
53
50
54
if (_isset (dead_zone)){
51
55
// dead zone is configured
52
- float dead_time = (float )(_MCPWM_FREQ / (pwm_frequency)) * dead_zone;
53
- mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_0, MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE, dead_time/2.0 , dead_time/2.0 );
54
- mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_1, MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE, dead_time/2.0 , dead_time/2.0 );
55
- mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_2, MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE, dead_time/2.0 , dead_time/2.0 );
56
+
57
+ // When using hardware deadtime, setting the phase_state parameter is not supported.
58
+ #if SIMPLEFOC_ESP32_HW_DEADTIME == true
59
+ float dead_time = (float )(_MCPWM_FREQ / (pwm_frequency)) * dead_zone;
60
+ mcpwm_deadtime_type_t pwm_mode;
61
+ if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == true ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == true )) {pwm_mode = MCPWM_ACTIVE_HIGH_COMPLIMENT_MODE;} // Normal, noninverting driver
62
+ else if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == true ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == false )){pwm_mode = MCPWM_ACTIVE_HIGH_MODE;} // Inverted lowside driver
63
+ else if ((SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH == false ) && (SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH == true )) {pwm_mode = MCPWM_ACTIVE_LOW_MODE;} // Inverted highside driver
64
+ 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!
65
+ mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_0, pwm_mode, dead_time/2.0 , dead_time/2.0 );
66
+ mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_1, pwm_mode, dead_time/2.0 , dead_time/2.0 );
67
+ mcpwm_deadtime_enable (mcpwm_unit, MCPWM_TIMER_2, pwm_mode, dead_time/2.0 , dead_time/2.0 );
68
+ #else // Software deadtime
69
+ for (int i = 0 ; i < 3 ; i++){
70
+ 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
71
+ 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
72
+
73
+ 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
74
+ 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
75
+ }
76
+ #endif
77
+
56
78
}
57
79
_delay (100 );
58
80
@@ -369,7 +391,10 @@ void* _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, cons
369
391
ESP32MCPWMDriverParams* params = new ESP32MCPWMDriverParams {
370
392
.pwm_frequency = pwm_frequency,
371
393
.mcpwm_dev = m_slot.mcpwm_num ,
372
- .mcpwm_unit = m_slot.mcpwm_unit
394
+ .mcpwm_unit = m_slot.mcpwm_unit ,
395
+ .mcpwm_operator1 = m_slot.mcpwm_operator1 ,
396
+ .mcpwm_operator2 = m_slot.mcpwm_operator2 ,
397
+ .deadtime = _isset (dead_zone) ? dead_zone : 0
373
398
};
374
399
return params;
375
400
}
@@ -381,15 +406,26 @@ void* _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, cons
381
406
// - BLDC driver - 6PWM setting
382
407
// - hardware specific
383
408
void _writeDutyCycle6PWM (float dc_a, float dc_b, float dc_c, PhaseState *phase_state, void * params){
384
- // se the PWM on the slot timers
409
+ // set the PWM on the slot timers
385
410
// transform duty cycle from [0,1] to [0,100.0]
386
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_0, MCPWM_OPR_A, dc_a*100.0 );
387
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_0, MCPWM_OPR_B, dc_a*100.0 );
388
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_1, MCPWM_OPR_A, dc_b*100.0 );
389
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_1, MCPWM_OPR_B, dc_b*100.0 );
390
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_2, MCPWM_OPR_A, dc_c*100.0 );
391
- mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_2, MCPWM_OPR_B, dc_c*100.0 );
392
- _UNUSED (phase_state);
411
+ #if SIMPLEFOC_ESP32_HW_DEADTIME == true
412
+ // Hardware deadtime does deadtime insertion internally
413
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_0, MCPWM_OPR_A, dc_a*100 .0f );
414
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_0, MCPWM_OPR_B, dc_a*100 .0f );
415
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_1, MCPWM_OPR_A, dc_b*100 .0f );
416
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_1, MCPWM_OPR_B, dc_b*100 .0f );
417
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_2, MCPWM_OPR_A, dc_c*100 .0f );
418
+ mcpwm_set_duty (((ESP32MCPWMDriverParams*)params)->mcpwm_unit , MCPWM_TIMER_2, MCPWM_OPR_B, dc_c*100 .0f );
419
+ _UNUSED (phase_state);
420
+ #else
421
+ float deadtime = 0 .5f *((ESP32MCPWMDriverParams*)params)->deadtime ;
422
+ 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 );
423
+ 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 );
424
+ 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 );
425
+ 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 );
426
+ 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 );
427
+ 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 );
428
+ #endif
393
429
}
394
430
395
431
#endif
0 commit comments