Skip to content

ledc_write max_duty bug #11049

Open
@scrtrees

Description

@scrtrees

https://github.com/espressif/arduino-esp32/blame/9e2f75564127a9853f80f3eb637b264406cb2f30/cores/esp32/esp32-hal-ledc.c#L181

//Fixing if all bits in resolution is set = LEDC FULL ON
    uint32_t max_duty = (1 << bus->channel_resolution) - 1;

    if ((duty == max_duty) && (max_duty != 1)) {
      duty = max_duty + 1;

If a user want to set resolution as 5 and set duty 31/32, it should be failed.
Duty ratio should be like as below.

channel_resolution = 5, duty = 0 → duty ratio = 0/32
channel_resolution = 5, duty = 1 → duty ratio = 1/32
channel_resolution = 5, duty = 2 → duty ratio = 2/32
...
channel_resolution = 5, duty = 30 → duty ratio = 30/32
channel_resolution = 5, duty = 31 → duty ratio = 31/32
channel_resolution = 5, duty = 32 → duty ratio = 32/32

However, current code makes it like below.

channel_resolution = 5, duty = 31 → duty ratio = 32/32 -> WRONG RATIO
channel_resolution = 5, duty = 32 → duty ratio = 32/32

The code on top just need to be deleted.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions