-
Notifications
You must be signed in to change notification settings - Fork 7.7k
Closed
Labels
Area: Peripherals APIRelates to peripheral's APIs.Relates to peripheral's APIs.Status: SolvedThe issue has been resolved and requires no further action.The issue has been resolved and requires no further action.
Milestone
Description
Board
ESP32
Device Description
ESP32-WROOM
Hardware Configuration
GPIO19 is LED PWM Pin
Version
v2.0.4
IDE Name
arduino-cli
Operating System
macOS 12.4
Flash frequency
40MHz
PSRAM enabled
no
Upload speed
921600
Description
ledcWrite makes it impossible to set the duty cycle to 50% for 1bit PWM because of this:
arduino-esp32/cores/esp32/esp32-hal-ledc.c
Lines 89 to 96 in 9432163
//Fixing if all bits in resolution is set = LEDC FULL ON | |
uint32_t max_duty = (1 << channels_resolution[chan]) - 1; | |
if(duty == max_duty){ | |
duty = max_duty + 1; | |
} | |
ledc_set_duty(group, channel, duty); |
when channels_resolution[chan]
is 1 the possible duty cycles should be 0 (0%), 1 (50%) and 2(100%).
But for a duty of 1 max_duty
will be 1 (1<<1 - 1
) and since duty == max_duty
the duty will be set to 2
Sketch
void setup() {
uint8_t channel = 0;
uint8_t bits = 1;
uint8_t pin = 19;
uint32_t freq = 40 * 1000 * 1000 // 40 MHz
uint8_t duty = 1; // 50% duty
ledcSetup(channel, freq, bits);
ledcAttachPin(pin, channel);
ledcWrite(channel, duty);
}
void loop(){}
Debug Message
None
Other Steps to Reproduce
No response
I have checked existing issues, online documentation and the Troubleshooting Guide
- I confirm I have checked existing issues, online documentation and Troubleshooting guide.To pick up a draggable item, press the space bar. While dragging, use the arrow keys to move the item. Press space again to drop the item in its new position, or press escape to cancel.
Metadata
Metadata
Assignees
Labels
Area: Peripherals APIRelates to peripheral's APIs.Relates to peripheral's APIs.Status: SolvedThe issue has been resolved and requires no further action.The issue has been resolved and requires no further action.
Type
Projects
Status
Done
Activity
lbernstone commentedon Jul 31, 2022
1-bit PWM means the duty cycle is fixed at 50%. https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/ledc.html#supported-range-of-frequency-and-duty-resolutions
mhuttner commentedon Jul 31, 2022
Yes, but i can not manage to configure it to get output on the pin.
Removing the
ledcWrite(channel, duty);
results in no output.If i comment out
the example above works as expected and i get a PWM Signal.
P-R-O-C-H-Y commentedon Aug 1, 2022
Hi @mhuttner, this part of code was added, because of a simple reason. If all bits from given resolution are set, then LEDC should be full on.
Quick example is on 8-bit resolution. The value is between 0-255, thats 8 bits. But without this piece of code the 255 won't be 100% on, you need to write 256 to be fully on, but it makes no sense.
According to @lbernstone mentioned link, I will make a PR to change 1-bit resolution to be 0 - fully off and 1 be 50%. It makes sense.
With 1 bit you can never set duty to 0% , 50% and 100%. Thats 3 values, you have only 2 available (0/1).
If you need to be able to set these, select 2 bits resolution.
Example using only 2 bits:
0 - always low
1 -> actually sets to 1 - 25% duty
2 -> actually sets to 2 - 50% duty
3 -> actually sets to 4 - always high (100% duty)
With this change, we loose the value 1 for all resolutions, but for most use cases, it affordable price.
P-R-O-C-H-Y commentedon Aug 1, 2022
@mhuttner Can you please test your code with this change:
Thanks!
6 remaining items