Skip to content

Commit 3c9ba03

Browse files
committed
Update pwmWrite.cpp
When using tone() with the ESP32-C3, the minimum frequency is limited to153 Hz. Update servo ye to enforce limits (0.0-1.0).
1 parent dad348f commit 3c9ba03

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

src/pwmWrite.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ float Pwm::write(uint8_t pin, uint32_t duty, uint32_t frequency, uint8_t resolut
4848
float Pwm::writeServo(uint8_t pin, float value, float speed, float ke) {
4949
uint8_t ch = attached(pin);
5050
wr_servo(pin, value, speed, ke);
51-
return (ke < 1.0) ? mem[ch].ye : value; // normalized easing duty (0.0 - 1.0)
51+
return mem[ch].ye; // normalized easing position (0.0 - 1.0)
5252
}
5353

5454
float Pwm::writeServo(uint8_t pin, float value) {
@@ -69,15 +69,19 @@ float Pwm::writeServo(uint8_t pin, float value) {
6969
}
7070
}
7171
wr_servo(pin, value, mem[ch].speed, mem[ch].ke);
72-
return (mem[ch].ke < 1.0) ? mem[ch].ye : value; // normalized easing duty (0.0 - 1.0)
72+
return mem[ch].ye; // normalized easing position (0.0 - 1.0)
7373
}
7474

7575
void Pwm::tone(uint8_t pin, uint32_t frequency, uint16_t duration, uint16_t interval) {
7676
uint8_t ch = attach(pin);
7777
if (ch < chMax) {
7878
uint32_t ms = millis();
7979
static bool durDone = false;
80+
#if defined(CONFIG_IDF_TARGET_ESP32C3)
81+
if (frequency < 153) frequency = 153;
82+
#else
8083
if (frequency < 4) frequency = 4;
84+
#endif
8185
if (!durDone) {
8286
if (frequency != mem[ch].frequency && (ms - mem[ch].startMs > interval)) {
8387
mem[ch].startMs = ms;
@@ -138,7 +142,7 @@ uint8_t Pwm::attach(uint8_t pin) {
138142

139143
uint8_t Pwm::attach(uint8_t pin, uint8_t ch) {
140144
if (mem[ch].pin == 255) {
141-
mem[ch].pin = pin;
145+
mem[ch].pin = pin;
142146
ledcSetup(ch, mem[ch].frequency, mem[ch].resolution);
143147
if (sync) pause(ch);
144148
ledcAttachPin(pin, ch);
@@ -165,7 +169,7 @@ uint8_t Pwm::attachInvert(uint8_t pin) {
165169

166170
uint8_t Pwm::attachInvert(uint8_t pin, uint8_t ch) {
167171
if (mem[ch].pin == 255) {
168-
mem[ch].pin = pin;
172+
mem[ch].pin = pin;
169173
ledcSetup(ch, mem[ch].frequency, mem[ch].resolution);
170174
if (sync) pause(ch);
171175
ledc_attach_with_invert(pin, ch);
@@ -380,10 +384,14 @@ void Pwm::wr_servo(uint8_t pin, float value, float speed, float ke) {
380384
if (duty > mem[ch].startDuty) {
381385
mem[ch].te = (float)(now - mem[ch].startMs) / mem[ch].deltaMs;
382386
mem[ch].ye = (-(ke + 1.0f) * (2.0f * mem[ch].te - 1.0f) / (2.0f * (-4.0f * ke * fabsf(mem[ch].te - 0.5f) + ke - 1.0f))) + 0.5f;
387+
if (isnan(mem[ch].ye) || mem[ch].ye < 0.0) mem[ch].ye = 0.0;
388+
else if (mem[ch].ye > 1.0) mem[ch].ye = 1.0;
383389
easeDuty = mem[ch].startDuty + (mem[ch].deltaDuty * mem[ch].ye);
384390
} else {
385391
mem[ch].te = 1 - ((float)(now - mem[ch].startMs) / mem[ch].deltaMs);
386392
mem[ch].ye = 1 - (((ke + 1.0f) * (2.0f * mem[ch].te - 1.0f) / (2.0f * (-4.0f * ke * fabsf(mem[ch].te - 0.5f) + ke - 1.0f))) + 0.5f);
393+
if (isnan(mem[ch].ye) || mem[ch].ye < 0.0) mem[ch].ye = 0.0;
394+
else if (mem[ch].ye > 1.0) mem[ch].ye = 1.0;
387395
easeDuty = duty + (mem[ch].deltaDuty * mem[ch].ye);
388396
}
389397
ledcWrite(ch, easeDuty);

0 commit comments

Comments
 (0)