Skip to content

Commit 2ac8b02

Browse files
committed
Fix Servo jitter
1 parent e6cd054 commit 2ac8b02

File tree

3 files changed

+20
-11
lines changed

3 files changed

+20
-11
lines changed

library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"keywords": "pwm, servo, tone, esp32, analogWrite, esp32-s2, esp32-s3, esp32-c3, ledc",
44
"description": "ESP32 PWM, SERVO, TONE and NOTE. Smart GPIO pin management and advanced control features.",
55
"license": "MIT",
6-
"version": "4.2.4",
6+
"version": "4.2.5",
77
"frameworks": "arduino",
88
"platforms": "espressif32",
99
"repository": {

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=ESP32 ESP32S2 AnalogWrite
2-
version=4.2.4
2+
version=4.2.5
33
author=David Lloyd
44
maintainer=David Lloyd <[email protected]>
55
sentence=ESP32 PWM, SERVO, TONE and NOTE.

src/pwmWrite.cpp

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************
2-
ESP32 PWM, SERVO and TONE Library, Version 4.2.4
2+
ESP32 PWM, SERVO and TONE Library, Version 4.2.5
33
by dlloydev https://github.com/Dlloydev/ESP32-ESP32S2-AnalogWrite
44
This Library is licensed under the MIT License
55
*******************************************************************/
@@ -44,16 +44,26 @@ float Pwm::write(uint8_t pin, uint32_t duty, uint32_t frequency, uint8_t resolut
4444
}
4545
return config[ch].frequency;
4646
}
47-
4847
uint32_t Pwm::writeServo(uint8_t pin, float value) {
49-
uint8_t ch = attach(pin);
48+
uint8_t ch = attached(pin);
49+
if (ch == 253) { // free channels exist
50+
for (uint8_t c = 0; c < chMax; c++) {
51+
if (config[c].pin == 255 && ch == 253) { //first free ch
52+
config[c].pin = pin;
53+
ch = c;
54+
if (config[ch].frequency < 40 || config[ch].frequency > 900) config[ch].frequency = 50;
55+
if (config[ch].resolution > widthMax) config[ch].resolution = widthMax;
56+
else if (config[ch].resolution < 14 && widthMax == 20) config[ch].resolution = 16;
57+
else if (config[ch].resolution < 14) config[ch].resolution = 14;
58+
ledcSetup(ch, config[ch].frequency, config[ch].resolution);
59+
if (sync) pause(ch);
60+
ledcAttachPin(pin, ch);
61+
}
62+
}
63+
}
5064
float countPerUs;
5165
uint32_t duty = config[ch].servoDefUs;
5266
if (ch < chMax) { // write PWM
53-
if (config[ch].frequency < 40 || config[ch].frequency > 900) config[ch].frequency = 50;
54-
if (config[ch].resolution > widthMax) config[ch].resolution = widthMax;
55-
else if (config[ch].resolution < 14 && widthMax == 20) config[ch].resolution = 16;
56-
else if (config[ch].resolution < 14) config[ch].resolution = 14;
5767
countPerUs = ((1 << config[ch].resolution) - 1) / (1000000.0 / config[ch].frequency);
5868
if (value < config[ch].servoMinUs) { // degrees
5969
if (value < 0) value = 0;
@@ -120,7 +130,7 @@ float Pwm::readMicroseconds(uint8_t pin) {
120130

121131
uint8_t Pwm::attach(uint8_t pin) {
122132
uint8_t chan = attached(pin);
123-
if (chan == 253) { // pin is free
133+
if (chan == 253) { // free channels exist
124134
for (uint8_t ch = 0; ch < chMax; ch++) {
125135
if (config[ch].pin == 255) { // ch is free
126136
config[ch].pin = pin;
@@ -328,7 +338,6 @@ void Pwm::wr_ch_pair(uint8_t ch, uint32_t frequency, uint8_t bits) {
328338

329339
void Pwm::wr_duty(uint8_t ch, uint32_t duty) {
330340
if (config[ch].duty != duty) {
331-
ledcSetup(ch, config[ch].frequency, config[ch].resolution);
332341
ledcWrite(ch, duty);
333342
config[ch].duty = duty;
334343
}

0 commit comments

Comments
 (0)