@@ -48,7 +48,7 @@ float Pwm::write(uint8_t pin, uint32_t duty, uint32_t frequency, uint8_t resolut
48
48
float Pwm::writeServo (uint8_t pin, float value, float speed, float ke) {
49
49
uint8_t ch = attached (pin);
50
50
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)
52
52
}
53
53
54
54
float Pwm::writeServo (uint8_t pin, float value) {
@@ -69,15 +69,19 @@ float Pwm::writeServo(uint8_t pin, float value) {
69
69
}
70
70
}
71
71
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)
73
73
}
74
74
75
75
void Pwm::tone (uint8_t pin, uint32_t frequency, uint16_t duration, uint16_t interval) {
76
76
uint8_t ch = attach (pin);
77
77
if (ch < chMax) {
78
78
uint32_t ms = millis ();
79
79
static bool durDone = false ;
80
+ #if defined(CONFIG_IDF_TARGET_ESP32C3)
81
+ if (frequency < 153 ) frequency = 153 ;
82
+ #else
80
83
if (frequency < 4 ) frequency = 4 ;
84
+ #endif
81
85
if (!durDone) {
82
86
if (frequency != mem[ch].frequency && (ms - mem[ch].startMs > interval)) {
83
87
mem[ch].startMs = ms;
@@ -138,7 +142,7 @@ uint8_t Pwm::attach(uint8_t pin) {
138
142
139
143
uint8_t Pwm::attach (uint8_t pin, uint8_t ch) {
140
144
if (mem[ch].pin == 255 ) {
141
- mem[ch].pin = pin;
145
+ mem[ch].pin = pin;
142
146
ledcSetup (ch, mem[ch].frequency , mem[ch].resolution );
143
147
if (sync) pause (ch);
144
148
ledcAttachPin (pin, ch);
@@ -165,7 +169,7 @@ uint8_t Pwm::attachInvert(uint8_t pin) {
165
169
166
170
uint8_t Pwm::attachInvert (uint8_t pin, uint8_t ch) {
167
171
if (mem[ch].pin == 255 ) {
168
- mem[ch].pin = pin;
172
+ mem[ch].pin = pin;
169
173
ledcSetup (ch, mem[ch].frequency , mem[ch].resolution );
170
174
if (sync) pause (ch);
171
175
ledc_attach_with_invert (pin, ch);
@@ -380,10 +384,14 @@ void Pwm::wr_servo(uint8_t pin, float value, float speed, float ke) {
380
384
if (duty > mem[ch].startDuty ) {
381
385
mem[ch].te = (float )(now - mem[ch].startMs ) / mem[ch].deltaMs ;
382
386
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 ;
383
389
easeDuty = mem[ch].startDuty + (mem[ch].deltaDuty * mem[ch].ye );
384
390
} else {
385
391
mem[ch].te = 1 - ((float )(now - mem[ch].startMs ) / mem[ch].deltaMs );
386
392
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 ;
387
395
easeDuty = duty + (mem[ch].deltaDuty * mem[ch].ye );
388
396
}
389
397
ledcWrite (ch, easeDuty);
0 commit comments