Skip to content

Commit 4b8e37f

Browse files
committed
Use registers to set duty cycle
mcpwm_set_duty is not safe to use in an interrupt
1 parent 9eeeb63 commit 4b8e37f

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

src/drivers/hardware_specific/esp32/esp32_mcu.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,13 @@ void _configureTimerFrequency(long pwm_frequency, mcpwm_dev_t* mcpwm_num, mcpwm
113113
mcpwm_num->timer[1].timer_cfg0.timer_period_upmethod = 0;
114114
mcpwm_num->timer[2].timer_cfg0.timer_period_upmethod = 0;
115115
_delay(1);
116-
// _delay(1);
116+
mcpwm_num->operators[0].gen_stmp_cfg.gen_a_upmethod=2;
117+
mcpwm_num->operators[0].gen_stmp_cfg.gen_b_upmethod=2;
118+
mcpwm_num->operators[1].gen_stmp_cfg.gen_a_upmethod=2;
119+
mcpwm_num->operators[1].gen_stmp_cfg.gen_b_upmethod=2;
120+
mcpwm_num->operators[2].gen_stmp_cfg.gen_a_upmethod=2;
121+
mcpwm_num->operators[2].gen_stmp_cfg.gen_b_upmethod=2;
122+
_delay(1);
117123
//restart the timers
118124
mcpwm_start(mcpwm_unit, MCPWM_TIMER_0);
119125
mcpwm_start(mcpwm_unit, MCPWM_TIMER_1);
@@ -322,11 +328,16 @@ void _writeDutyCycle2PWM(float dc_a, float dc_b, void* params){
322328
// - hardware speciffic
323329
// ESP32 uses MCPWM
324330
void IRAM_ATTR _writeDutyCycle3PWM(float dc_a, float dc_b, float dc_c, void* params){
325-
// se the PWM on the slot timers
331+
// Use the PWM on the slot timers
326332
// transform duty cycle from [0,1] to [0,100]
327-
mcpwm_set_duty(((ESP32MCPWMDriverParams*)params)->mcpwm_unit, MCPWM_TIMER_0, ((ESP32MCPWMDriverParams*)params)->mcpwm_operator1, dc_a*100.0);
328-
mcpwm_set_duty(((ESP32MCPWMDriverParams*)params)->mcpwm_unit, MCPWM_TIMER_1, ((ESP32MCPWMDriverParams*)params)->mcpwm_operator1, dc_b*100.0);
329-
mcpwm_set_duty(((ESP32MCPWMDriverParams*)params)->mcpwm_unit, MCPWM_TIMER_2, ((ESP32MCPWMDriverParams*)params)->mcpwm_operator1, dc_c*100.0);
333+
((ESP32MCPWMDriverParams *)params)->mcpwm_dev->operators[0].timestamp[0].gen= ((ESP32MCPWMDriverParams *)params)->mcpwm_dev -> timer[0].timer_cfg0.timer_period * dc_a;
334+
((ESP32MCPWMDriverParams *)params)->mcpwm_dev->operators[1].timestamp[0].gen= ((ESP32MCPWMDriverParams *)params)->mcpwm_dev -> timer[1].timer_cfg0.timer_period * dc_b;
335+
((ESP32MCPWMDriverParams *)params)->mcpwm_dev->operators[2].timestamp[0].gen= ((ESP32MCPWMDriverParams *)params)->mcpwm_dev -> timer[2].timer_cfg0.timer_period * dc_c;
336+
337+
// mcpwm_set_duty(((ESP32MCPWMDriverParams*)params)->mcpwm_unit, MCPWM_TIMER_0, ((ESP32MCPWMDriverParams*)params)->mcpwm_operator1, dc_a*100.0);
338+
// mcpwm_set_duty(((ESP32MCPWMDriverParams*)params)->mcpwm_unit, MCPWM_TIMER_1, ((ESP32MCPWMDriverParams*)params)->mcpwm_operator1, dc_b*100.0);
339+
// mcpwm_set_duty(((ESP32MCPWMDriverParams*)params)->mcpwm_unit, MCPWM_TIMER_2, ((ESP32MCPWMDriverParams*)params)->mcpwm_operator1, dc_c*100.0);
340+
330341
}
331342

332343
bool IRAM_ATTR _getPwmState(void* params){

0 commit comments

Comments
 (0)