3#if defined(ESP_H) && defined(ARDUINO_ARCH_ESP32) && defined(SOC_MCPWM_SUPPORTED) && !defined(SIMPLEFOC_ESP32_USELEDC)
6#pragma message("SimpleFOC: compiling for ESP32 MCPWM driver")
10int esp32_gpio_nr(
int pin) {
11 #if defined(BOARD_HAS_PIN_REMAP) && !defined(BOARD_USES_HW_GPIO_NUMBERS)
12 return digitalPinToGPIONumber(pin);
23 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
24 else pwm_frequency =
_constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX);
27 if(!_findBestGroup(1, pwm_frequency, &group, &timer)) {
28 SIMPLEFOC_ESP32_DRV_DEBUG(
"Not enough pins available for 1PWM!");
31 SIMPLEFOC_ESP32_DRV_DEBUG(
"Configuring 1PWM in group: "+String(group)+
" on timer: "+String(timer));
33 int pins[1] = { esp32_gpio_nr(
pinA) };
34 return _configurePinsMCPWM(pwm_frequency, group, timer, 1, pins);
42 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
43 else pwm_frequency =
_constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX);
46 int ret = _findBestGroup(2, pwm_frequency, &group, &timer);
48 SIMPLEFOC_ESP32_DRV_DEBUG(
"Not enough pins available for 2PWM!");
53 SIMPLEFOC_ESP32_DRV_DEBUG(
"Configuring 2PWM in group: "+String(group)+
" on timer: "+String(timer));
55 int pins[2] = { esp32_gpio_nr(
pinA), esp32_gpio_nr(
pinB) };
56 return _configurePinsMCPWM(pwm_frequency, group, timer, 2, pins);
58 SIMPLEFOC_ESP32_DRV_DEBUG(
"Configuring 2PWM as two 1PWM drivers");
59 ESP32MCPWMDriverParams*
params[2];
64 for(
int i =0; i<2; i++){
65 int timer = _findLastTimer(i);
66 SIMPLEFOC_ESP32_DRV_DEBUG(
"Configuring 1PWM in group: "+String(i)+
" on timer: "+String(timer));
67 void* p = _configurePinsMCPWM(pwm_frequency, i, timer, 1, pins[i]);
69 SIMPLEFOC_ESP32_DRV_DEBUG(
"Error configuring 1PWM");
72 params[i] = (ESP32MCPWMDriverParams*)p;
76 ESP32MCPWMDriverParams* ret_params =
new ESP32MCPWMDriverParams{
77 .pwm_frequency =
params[0]->pwm_frequency,
80 for(
int i =0; i<2; i++){
81 ret_params->timers[i] =
params[i]->timers[0];
82 ret_params->oper[i] =
params[i]->oper[0];
83 ret_params->comparator[i] =
params[i]->comparator[0];
84 ret_params->generator[i] =
params[i]->generator[0];
86 ret_params->mcpwm_period =
params[0]->mcpwm_period;
95 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
96 else pwm_frequency =
_constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX);
99 if(!_findBestGroup(3, pwm_frequency, &group, &timer)) {
100 SIMPLEFOC_ESP32_DRV_DEBUG(
"Not enough pins available for 3PWM!");
103 SIMPLEFOC_ESP32_DRV_DEBUG(
"Configuring 3PWM in group: "+String(group)+
" on timer: "+String(timer));
105 int pins[3] = { esp32_gpio_nr(
pinA), esp32_gpio_nr(
pinB), esp32_gpio_nr(
pinC) };
106 return _configurePinsMCPWM(pwm_frequency, group, timer, 3, pins);
115 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
116 else pwm_frequency =
_constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX);
119 int ret = _findBestGroup(4, pwm_frequency, &group, &timer);
121 SIMPLEFOC_ESP32_DRV_DEBUG(
"Not enough pins available for 4PWM!");
125 SIMPLEFOC_ESP32_DRV_DEBUG(
"Configuring 4PWM in group: "+String(group)+
" on timer: "+String(timer));
128 return _configurePinsMCPWM(pwm_frequency, group, timer, 4, pins);
130 SIMPLEFOC_ESP32_DRV_DEBUG(
"Configuring 4PWM as two 2PWM drivers");
131 ESP32MCPWMDriverParams*
params[2];
135 int pins[2][2] = {{ esp32_gpio_nr(
pinA), esp32_gpio_nr(
pinB) },{ esp32_gpio_nr(
pinC), esp32_gpio_nr(pinD) }};
136 for(
int i =0; i<2; i++){
137 int timer = _findNextTimer(i);
138 SIMPLEFOC_ESP32_DRV_DEBUG(
"Configuring 2PWM in group: "+String(i)+
" on timer: "+String(timer));
139 void* p = _configurePinsMCPWM(pwm_frequency, i, timer, 2, pins[i]);
141 SIMPLEFOC_ESP32_DRV_DEBUG(
"Error configuring 2PWM");
144 params[i] = (ESP32MCPWMDriverParams*)p;
148 ESP32MCPWMDriverParams* ret_params =
new ESP32MCPWMDriverParams{
149 .pwm_frequency =
params[0]->pwm_frequency,
154 for(
int i =0; i<4; i++){
155 ret_params->comparator[i] =
params[(int)floor(i/2)]->comparator[i%2];
156 ret_params->generator[i] =
params[(int)floor(i/2)]->generator[i%2];
158 ret_params->mcpwm_period =
params[0]->mcpwm_period;
165 if(!pwm_frequency || !
_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
166 else pwm_frequency =
_constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX);
169 if(!_findBestGroup(6, pwm_frequency, &group, &timer)) {
170 SIMPLEFOC_ESP32_DRV_DEBUG(
"Not enough pins available for 6PWM!");
173 SIMPLEFOC_ESP32_DRV_DEBUG(
"Configuring 6PWM in group: "+String(group)+
" on timer: "+String(timer));
176 return _configure6PWMPinsMCPWM(pwm_frequency, group, timer,
dead_zone, pins);
182 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[0], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period, dc_a);
183 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[1], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period,
dc_b);
184 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[2], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period,
dc_c);
191 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[0], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period, dc_a);
198 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[0], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period, dc_a);
199 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[1], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period,
dc_b);
209 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[0], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period, dc_1a);
210 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[1], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period,
dc_1b);
211 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[2], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period,
dc_2a);
212 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[3], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period,
dc_2b);
216#if SIMPLEFOC_ESP32_HW_DEADTIME == true
217 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[0], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period, dc_a);
218 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[1], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period,
dc_b);
219 _setDutyCycle(((ESP32MCPWMDriverParams*)
params)->comparator[2], ((ESP32MCPWMDriverParams*)
params)->mcpwm_period,
dc_c);
222 _forcePhaseState(((ESP32MCPWMDriverParams*)
params)->generator[0], ((ESP32MCPWMDriverParams*)
params)->generator[1],
phase_state[0]);
223 _forcePhaseState(((ESP32MCPWMDriverParams*)
params)->generator[2], ((ESP32MCPWMDriverParams*)
params)->generator[3],
phase_state[1]);
224 _forcePhaseState(((ESP32MCPWMDriverParams*)
params)->generator[4], ((ESP32MCPWMDriverParams*)
params)->generator[5],
phase_state[2]);
226 uint32_t period = ((ESP32MCPWMDriverParams*)
params)->mcpwm_period;
const int const int const int pinC
GenericCurrentSenseParams * params
void * _configure4PWM(long pwm_frequency, const int pin1A, const int pin1B, const int pin2A, const int pin2B)
void * _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, const int pinA_l, const int pinB_h, const int pinB_l, const int pinC_h, const int pinC_l)
void * _configure2PWM(long pwm_frequency, const int pinA, const int pinB)
void _writeDutyCycle2PWM(float dc_a, float dc_b, void *params)
void _writeDutyCycle1PWM(float dc_a, void *params)
#define SIMPLEFOC_DRIVER_INIT_FAILED
void _writeDutyCycle4PWM(float dc_1a, float dc_1b, float dc_2a, float dc_2b, void *params)
void * _configure3PWM(long pwm_frequency, const int pinA, const int pinB, const int pinC)
void _writeDutyCycle6PWM(float dc_a, float dc_b, float dc_c, PhaseState *phase_state, void *params)
void * _configure1PWM(long pwm_frequency, const int pinA)
void _writeDutyCycle3PWM(float dc_a, float dc_b, float dc_c, void *params)
float const int const int const int pinB_h
float const int const int const int const int pinB_l
float const int const int const int const int const int pinC_h
float float PhaseState * phase_state
float const int const int const int const int const int const int pinC_l
float const int const int pinA_l
#define _constrain(amt, low, high)