@@ -184,13 +184,6 @@ bool ledcWrite(uint8_t pin, uint32_t duty) {
184
184
185
185
uint8_t group = (bus -> channel / 8 ), channel = (bus -> channel % 8 );
186
186
187
- //Fixing if all bits in resolution is set = LEDC FULL ON
188
- uint32_t max_duty = (1 << bus -> channel_resolution ) - 1 ;
189
-
190
- if ((duty == max_duty ) && (max_duty != 1 )) {
191
- duty = max_duty + 1 ;
192
- }
193
-
194
187
ledc_set_duty (group , channel , duty );
195
188
ledc_update_duty (group , channel );
196
189
@@ -211,12 +204,6 @@ bool ledcWriteChannel(uint8_t channel, uint32_t duty) {
211
204
uint32_t resolution = 0 ;
212
205
ledc_ll_get_duty_resolution (LEDC_LL_GET_HW (), group , timer , & resolution );
213
206
214
- uint32_t max_duty = (1 << resolution ) - 1 ;
215
-
216
- if ((duty == max_duty ) && (max_duty != 1 )) {
217
- duty = max_duty + 1 ;
218
- }
219
-
220
207
ledc_set_duty (group , channel , duty );
221
208
ledc_update_duty (group , channel );
222
209
@@ -265,15 +252,16 @@ uint32_t ledcWriteTone(uint8_t pin, uint32_t freq) {
265
252
bus -> channel_resolution = 10 ;
266
253
267
254
uint32_t res_freq = ledc_get_freq (group , timer );
268
- ledcWrite (pin , 0x1FF );
255
+ ledcWrite (pin , 0x200 ); // LEDC 50% duty is 2^10 / 2 = 0x200
269
256
return res_freq ;
270
257
}
271
258
return 0 ;
272
259
}
273
260
274
261
uint32_t ledcWriteNote (uint8_t pin , note_t note , uint8_t octave ) {
275
- const uint16_t noteFrequencyBase [12 ] = {// C C# D Eb E F F# G G# A Bb B
276
- 4186 , 4435 , 4699 , 4978 , 5274 , 5588 , 5920 , 6272 , 6645 , 7040 , 7459 , 7902
262
+ const uint16_t noteFrequencyBase [12 ] = {
263
+ // C C# D Eb E F F# G G# A Bb B
264
+ 4186 , 4435 , 4699 , 4978 , 5274 , 5588 , 5920 , 6272 , 6645 , 7040 , 7459 , 7902
277
265
};
278
266
279
267
if (octave > 8 || note >= NOTE_MAX ) {
@@ -391,13 +379,15 @@ static bool ledcFadeConfig(uint8_t pin, uint32_t start_duty, uint32_t target_dut
391
379
ledc_cbs_t callbacks = {.fade_cb = ledcFnWrapper };
392
380
ledc_cb_register (group , channel , & callbacks , (void * )bus );
393
381
394
- //Fixing if all bits in resolution is set = LEDC FULL ON
395
- uint32_t max_duty = (1 << bus -> channel_resolution ) - 1 ;
382
+ uint32_t max_duty = (1 << bus -> channel_resolution ); // Max LEDC duty
396
383
397
- if ((target_duty == max_duty ) && (max_duty != 1 )) {
398
- target_duty = max_duty + 1 ;
399
- } else if ((start_duty == max_duty ) && (max_duty != 1 )) {
400
- start_duty = max_duty + 1 ;
384
+ if (target_duty > max_duty ) {
385
+ log_w ("Target duty %d was adjusted to the maximum duty %d" , target_duty , max_duty );
386
+ target_duty = max_duty ;
387
+ }
388
+ if (start_duty > max_duty ) {
389
+ log_w ("Starting duty %d was adjusted to the maximum duty %d" , start_duty , max_duty );
390
+ start_duty = max_duty ;
401
391
}
402
392
403
393
#if SOC_LEDC_SUPPORT_FADE_STOP
@@ -411,7 +401,7 @@ static bool ledcFadeConfig(uint8_t pin, uint32_t start_duty, uint32_t target_dut
411
401
// Wait for LEDCs next PWM cycle to update duty (~ 1-2 ms)
412
402
while (ledc_get_duty (group , channel ) != start_duty );
413
403
414
- if (ledc_set_fade_time_and_start (group , channel , target_duty , max_fade_time_ms , LEDC_FADE_NO_WAIT ) != ESP_OK ) {
404
+ if (ledc_set_fade_time_and_start (group , channel , target_duty , _fade_time_ms , LEDC_FADE_NO_WAIT ) != ESP_OK ) {
415
405
log_e ("ledc_set_fade_time_and_start failed" );
416
406
return false;
417
407
}
@@ -446,6 +436,17 @@ void analogWrite(uint8_t pin, int value) {
446
436
return ;
447
437
}
448
438
}
439
+ // Arduino API says that duty goes from 0 to (2^resolution) - 1
440
+ // But LEDC works with duty from 0 to (2^resolution)
441
+ // Therefore, it will adjust Arduino MAX Duty to be the LEDC MAx Duty
442
+ uint32_t max_duty = (1 << bus -> channel_resolution ) - 1 ;
443
+ if (value < 0 || value > max_duty ) {
444
+ log_w ("Duty is out of range. Valid duty range for pin d is 0 to %d" , pin , max_duty );
445
+ return ;
446
+ }
447
+ if ((value == max_duty ) && (max_duty != 1 )) {
448
+ value = max_duty + 1 ;
449
+ }
449
450
ledcWrite (pin , value );
450
451
}
451
452
}
0 commit comments