|
1 | 1 | /*******************************************************************
|
2 |
| - ESP32 PWM, SERVO and TONE Library, Version 4.2.4 |
| 2 | + ESP32 PWM, SERVO and TONE Library, Version 4.2.5 |
3 | 3 | by dlloydev https://github.com/Dlloydev/ESP32-ESP32S2-AnalogWrite
|
4 | 4 | This Library is licensed under the MIT License
|
5 | 5 | *******************************************************************/
|
@@ -44,16 +44,26 @@ float Pwm::write(uint8_t pin, uint32_t duty, uint32_t frequency, uint8_t resolut
|
44 | 44 | }
|
45 | 45 | return config[ch].frequency;
|
46 | 46 | }
|
47 |
| - |
48 | 47 | 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 | + } |
50 | 64 | float countPerUs;
|
51 | 65 | uint32_t duty = config[ch].servoDefUs;
|
52 | 66 | 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; |
57 | 67 | countPerUs = ((1 << config[ch].resolution) - 1) / (1000000.0 / config[ch].frequency);
|
58 | 68 | if (value < config[ch].servoMinUs) { // degrees
|
59 | 69 | if (value < 0) value = 0;
|
@@ -120,7 +130,7 @@ float Pwm::readMicroseconds(uint8_t pin) {
|
120 | 130 |
|
121 | 131 | uint8_t Pwm::attach(uint8_t pin) {
|
122 | 132 | uint8_t chan = attached(pin);
|
123 |
| - if (chan == 253) { // pin is free |
| 133 | + if (chan == 253) { // free channels exist |
124 | 134 | for (uint8_t ch = 0; ch < chMax; ch++) {
|
125 | 135 | if (config[ch].pin == 255) { // ch is free
|
126 | 136 | config[ch].pin = pin;
|
@@ -328,7 +338,6 @@ void Pwm::wr_ch_pair(uint8_t ch, uint32_t frequency, uint8_t bits) {
|
328 | 338 |
|
329 | 339 | void Pwm::wr_duty(uint8_t ch, uint32_t duty) {
|
330 | 340 | if (config[ch].duty != duty) {
|
331 |
| - ledcSetup(ch, config[ch].frequency, config[ch].resolution); |
332 | 341 | ledcWrite(ch, duty);
|
333 | 342 | config[ch].duty = duty;
|
334 | 343 | }
|
|
0 commit comments