@@ -75,11 +75,12 @@ bool _ledcAttachChannelAdvanced(uint8_t pin, int _channel, int _group, uint32_t
75
75
ledc_timer.freq_hz = freq;
76
76
ledc_timer.clk_cfg = LEDC_AUTO_CLK;
77
77
if (ledc_timer_config (&ledc_timer) != ESP_OK) {
78
+ SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to configure the timer:" , LEDC_TIMER_0);
78
79
return false ;
79
80
}
80
81
81
82
// if active high is false invert
82
- int pin_high_level = SIMPLEFOC_PWM_ACTIVE_HIGH ? 1 : 0 ;
83
+ int pin_high_level = SIMPLEFOC_PWM_ACTIVE_HIGH ? 0 : 1 ;
83
84
if (inverted) pin_high_level = !pin_high_level;
84
85
85
86
uint32_t duty = ledc_get_duty (group, channel);
@@ -91,28 +92,31 @@ bool _ledcAttachChannelAdvanced(uint8_t pin, int _channel, int _group, uint32_t
91
92
ledc_channel.gpio_num = pin;
92
93
ledc_channel.duty = duty;
93
94
ledc_channel.hpoint = 0 ;
94
- ledc_channel.flags .output_invert = pin_high_level;
95
+ ledc_channel.flags .output_invert = pin_high_level; // 0 is active high, 1 is active low
95
96
if (ledc_channel_config (&ledc_channel)!= ESP_OK) {
97
+ SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to attach channel:" , _channel);
96
98
return false ;
97
99
}
98
100
99
101
return true ;
100
102
}
101
103
104
+
105
+ // returns the number of available channels in the group
106
+ int _availableGroupChannels (int group){
107
+ if (group == 0 ) return LEDC_CHANNELS_GROUP0 - group_channels_used[0 ];
108
+ else if (group == 1 ) return LEDC_CHANNELS_GROUP1 - group_channels_used[1 ];
109
+ return 0 ;
110
+ }
111
+
102
112
// returns the number of the group that has enough channels available
103
113
// returns -1 if no group has enough channels
104
114
//
105
115
// NOT IMPLEMENTED BUT COULD BE USEFUL
106
116
// returns 2 if no group has enough channels but combined they do
107
117
int _findGroupWithChannelsAvailable (int no_channels){
108
- if (group_channels_used[0 ] + no_channels < LEDC_CHANNELS_GROUP0){
109
- return 0 ;
110
- }else if (group_channels_used[1 ] + no_channels < LEDC_CHANNELS_GROUP1){
111
- return 1 ;
112
- }
113
- // else if (group_channels_used[0] + group_channels_used[1] + no_channels < LEDC_CHANNELS){
114
- // return 2;
115
- // }
118
+ if (no_channels <= _availableGroupChannels (0 )) return 0 ;
119
+ if (no_channels <= _availableGroupChannels (1 )) return 1 ;
116
120
return -1 ;
117
121
}
118
122
@@ -132,11 +136,12 @@ void* _configure1PWM(long pwm_frequency, const int pinA) {
132
136
133
137
// configure the channel
134
138
group_channels_used[group] += 1 ;
135
- if (!_ledcAttachChannelAdvanced (pinA, group_channels_used[group], group, pwm_frequency, _PWM_RES_BIT, false )) {
136
- SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to attach channel :" , group_channels_used[group] );
139
+ if (!_ledcAttachChannelAdvanced (pinA, group_channels_used[group], group, pwm_frequency, _PWM_RES_BIT, false )){
140
+ SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to configure pin :" , pinA );
137
141
return SIMPLEFOC_DRIVER_INIT_FAILED;
138
142
}
139
-
143
+
144
+
140
145
ESP32LEDCDriverParams* params = new ESP32LEDCDriverParams {
141
146
.channels = { static_cast <ledc_channel_t >(group_channels_used[group]) },
142
147
.groups = { (ledc_mode_t )group },
@@ -177,9 +182,10 @@ void* _configure2PWM(long pwm_frequency, const int pinA, const int pinB) {
177
182
for (int i = 0 ; i < 2 ; i++){
178
183
group_channels_used[group]++;
179
184
if (!_ledcAttachChannelAdvanced (pins[i], group_channels_used[group], group, pwm_frequency, _PWM_RES_BIT, false )){
180
- SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to attach channel :" , group_channels_used[group ]);
185
+ SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to configure pin :" , pins[i ]);
181
186
return SIMPLEFOC_DRIVER_INIT_FAILED;
182
187
}
188
+
183
189
params->channels [i] = static_cast <ledc_channel_t >(group_channels_used[group]);
184
190
params->groups [i] = (ledc_mode_t )group;
185
191
}
@@ -213,9 +219,10 @@ void* _configure3PWM(long pwm_frequency,const int pinA, const int pinB, const in
213
219
for (int i = 0 ; i < 3 ; i++){
214
220
group_channels_used[group]++;
215
221
if (!_ledcAttachChannelAdvanced (pins[i], group_channels_used[group], group, pwm_frequency, _PWM_RES_BIT, false )){
216
- SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to attach channel :" , group_channels_used[group ]);
222
+ SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to configure pin :" , pins[i ]);
217
223
return SIMPLEFOC_DRIVER_INIT_FAILED;
218
224
}
225
+
219
226
params->channels [i] = static_cast <ledc_channel_t >(group_channels_used[group]);
220
227
params->groups [i] = (ledc_mode_t )group;
221
228
}
@@ -229,31 +236,49 @@ void* _configure4PWM(long pwm_frequency,const int pinA, const int pinB, const in
229
236
if (!pwm_frequency || !_isset (pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
230
237
else pwm_frequency = _constrain (pwm_frequency, 0 , _PWM_FREQUENCY_MAX); // constrain to 50kHz max
231
238
232
- SIMPLEFOC_DEBUG (" EP32-DRV: Configuring 4PWM" );
233
- // check if enough channels available
234
- int group = _findGroupWithChannelsAvailable (4 );
235
- if (group < 0 ){
236
- SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Not enough channels available!" );
237
- return SIMPLEFOC_DRIVER_INIT_FAILED;
238
- }
239
- SIMPLEFOC_DEBUG (" EP32-DRV: 4PWM setup in group: " , (group));
239
+
240
240
ESP32LEDCDriverParams* params = new ESP32LEDCDriverParams {
241
241
.channels = { static_cast <ledc_channel_t >(0 )},
242
242
.groups = { (ledc_mode_t )0 },
243
243
.pwm_frequency = pwm_frequency
244
244
};
245
245
246
+ SIMPLEFOC_DEBUG (" EP32-DRV: Configuring 4PWM" );
247
+ // check if enough channels available
248
+ int group = _findGroupWithChannelsAvailable (4 );
249
+ if (group < 0 ){
250
+ // not enough channels available on any individual group
251
+ // check if their combined number is enough (two channels per group)
252
+ if (_availableGroupChannels (0 ) >=2 && _availableGroupChannels (1 ) >=2 ){
253
+ group = 2 ;
254
+ SIMPLEFOC_DEBUG (" EP32-DRV: WARNING: Not enough available ledc channels for 4pwm in a single group! Using two groups!" );
255
+ SIMPLEFOC_DEBUG (" EP32-DRV: 4PWM setup in groups: 0 and 1!" );
256
+ params->groups [2 ] = (ledc_mode_t )1 ;
257
+ params->groups [3 ] = (ledc_mode_t )1 ;
258
+ }else {
259
+ SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Not enough available ledc channels for 4pwm!" );
260
+ return SIMPLEFOC_DRIVER_INIT_FAILED;
261
+ }
262
+ }else {
263
+ SIMPLEFOC_DEBUG (" EP32-DRV: 4PWM setup in group: " , (group));
264
+ params->groups [0 ] = (ledc_mode_t )group;
265
+ params->groups [1 ] = (ledc_mode_t )group;
266
+ params->groups [2 ] = (ledc_mode_t )group;
267
+ params->groups [3 ] = (ledc_mode_t )group;
268
+ }
269
+
270
+
271
+
246
272
int pins[4 ] = {pinA, pinB, pinC, pinD};
247
273
for (int i = 0 ; i < 4 ; i++){
248
- group_channels_used[group ]++;
249
- if (!_ledcAttachChannelAdvanced (pins[i], group_channels_used[group], group , pwm_frequency, _PWM_RES_BIT, false )){
250
- SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to attach channel :" , group_channels_used[group ]);
274
+ group_channels_used[params-> groups [i] ]++;
275
+ if (!_ledcAttachChannelAdvanced (pins[i], group_channels_used[params-> groups [i]], params-> groups [i] , pwm_frequency, _PWM_RES_BIT, false )){
276
+ SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to configure pin :" , pins[i ]);
251
277
return SIMPLEFOC_DRIVER_INIT_FAILED;
252
278
}
253
- params->channels [i] = static_cast <ledc_channel_t >(group_channels_used[group]);
254
- params->groups [i] = (ledc_mode_t )group;
279
+ params->channels [i] = static_cast <ledc_channel_t >(group_channels_used[params->groups [i]]);
255
280
}
256
- SIMPLEFOC_DEBUG (" EP32-DRV: 4PWM setup successful in group: " , (group) );
281
+ SIMPLEFOC_DEBUG (" EP32-DRV: 4PWM setup successful! " );
257
282
return params;
258
283
}
259
284
@@ -292,13 +317,81 @@ void _writeDutyCycle4PWM(float dc_1a, float dc_1b, float dc_2a, float dc_2b, vo
292
317
}
293
318
294
319
295
- // TODO - implement 6PWM
296
320
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){
297
- SIMPLEFOC_DEBUG (" EP32-DRV: 6PWM not supported!" );
298
- return SIMPLEFOC_DRIVER_INIT_FAILED;
321
+ if (!pwm_frequency || !_isset (pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
322
+ else pwm_frequency = _constrain (pwm_frequency, 0 , _PWM_FREQUENCY_MAX); // constrain to 50kHz max
323
+
324
+ SIMPLEFOC_DEBUG (" EP32-DRV: Configuring 6PWM" );
325
+ SIMPLEFOC_DEBUG (" EP32-DRV: WARNING - 6PWM on LEDC is poorly supported and not tested, consider using MCPWM driver instead!" );
326
+ // check if enough channels available
327
+ int group = _findGroupWithChannelsAvailable (6 );
328
+ if (group < 0 ){
329
+ SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Not enough channels available!" );
330
+ return SIMPLEFOC_DRIVER_INIT_FAILED;
331
+ }
332
+ SIMPLEFOC_DEBUG (" EP32-DRV: 6PWM setup in group: " , (group));
333
+ ESP32LEDCDriverParams* params = new ESP32LEDCDriverParams {
334
+ .channels = { static_cast <ledc_channel_t >(0 )},
335
+ .groups = { (ledc_mode_t )group },
336
+ .pwm_frequency = pwm_frequency,
337
+ .dead_zone = dead_zone
338
+ };
339
+
340
+ int high_side_invert = SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH ? false : true ;
341
+ int low_side_invert = SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH ? true : false ;
342
+
343
+ int pin_pairs[6 ][2 ] = {
344
+ {pinA_h, pinA_l},
345
+ {pinB_h, pinB_l},
346
+ {pinC_h, pinC_l}
347
+ };
348
+
349
+ for (int i = 0 ; i < 3 ; i++){
350
+ group_channels_used[group]++;
351
+ if (!_ledcAttachChannelAdvanced (pin_pairs[i][0 ], group_channels_used[group], group, pwm_frequency, _PWM_RES_BIT, high_side_invert)){
352
+ SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to configure pin:" , pin_pairs[i][0 ]);
353
+ return SIMPLEFOC_DRIVER_INIT_FAILED;
354
+ }
355
+
356
+ params->channels [2 *i] = static_cast <ledc_channel_t >(group_channels_used[group]);
357
+ params->groups [2 *i] = (ledc_mode_t )group;
358
+
359
+ group_channels_used[group]++;
360
+ if (!_ledcAttachChannelAdvanced (pin_pairs[i][1 ], group_channels_used[group], group, pwm_frequency, _PWM_RES_BIT, low_side_invert)){
361
+ SIMPLEFOC_DEBUG (" EP32-DRV: ERROR - Failed to configure pin:" , pin_pairs[i][0 ]);
362
+ return SIMPLEFOC_DRIVER_INIT_FAILED;
363
+ }
364
+
365
+ params->channels [2 *i+1 ] = static_cast <ledc_channel_t >(group_channels_used[group]);
366
+ params->groups [2 *i+1 ] = (ledc_mode_t )group;
367
+ }
368
+
369
+ SIMPLEFOC_DEBUG (" EP32-DRV: 6PWM setup successful in group: " , (group));
370
+ return params;
299
371
}
300
- void _writeDutyCycle6PWM (float dc_a, float dc_b, float dc_c, void * params) {
301
- SIMPLEFOC_DEBUG (" EP32-DRV: 6PWM not supported" );
372
+
373
+ void _setPwmPairDutyCycle ( void * params, int ind_h, int ind_l, float val, float dead_time, PhaseState ps){
374
+ float pwm_h = _constrain (val - dead_time/2.0 , 0 , 1.0 );
375
+ float pwm_l = _constrain (val + dead_time/2.0 , 0 , 1.0 );
376
+
377
+ // determine the phase state and set the pwm accordingly
378
+ // deactivate phases if needed
379
+ if ((ps == PhaseState::PHASE_OFF) || (ps == PhaseState::PHASE_LO)){
380
+ _writeDutyCycle (0 , params, ind_h);
381
+ }else {
382
+ _writeDutyCycle (pwm_h, params, ind_h);
383
+ }
384
+ if ((ps == PhaseState::PHASE_OFF) || (ps == PhaseState::PHASE_HI)){
385
+ _writeDutyCycle (0 , params, ind_l);
386
+ }else {
387
+ _writeDutyCycle (pwm_l, params, ind_l);
388
+ }
389
+ }
390
+
391
+ void _writeDutyCycle6PWM (float dc_a, float dc_b, float dc_c, PhaseState *phase_state, void * params){
392
+ _setPwmPairDutyCycle (params, 0 , 1 , dc_a, ((ESP32LEDCDriverParams*)params)->dead_zone , phase_state[0 ]);
393
+ _setPwmPairDutyCycle (params, 2 , 3 , dc_b, ((ESP32LEDCDriverParams*)params)->dead_zone , phase_state[1 ]);
394
+ _setPwmPairDutyCycle (params, 4 , 5 , dc_c, ((ESP32LEDCDriverParams*)params)->dead_zone , phase_state[2 ]);
302
395
}
303
396
304
397
#endif
0 commit comments