Skip to content

Commit f2d83ba

Browse files
authored
allow to set pin to OUTPUT_OPEN_DRAIN in analogWriteMode (#7841)
* allow to set pin to OUTPUT_OPEN_DRAIN in analogWrite * remove parameter with default value * Update core_esp8266_wiring_pwm.cpp * update documentation accordingly
1 parent 53e5688 commit f2d83ba

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

cores/esp8266/Arduino.h

+1
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ int digitalRead(uint8_t pin);
171171
int analogRead(uint8_t pin);
172172
void analogReference(uint8_t mode);
173173
void analogWrite(uint8_t pin, int val);
174+
void analogWriteMode(uint8_t pin, int val, bool openDrain);
174175
void analogWriteFreq(uint32_t freq);
175176
void analogWriteResolution(int res);
176177
void analogWriteRange(uint32_t range);

cores/esp8266/core_esp8266_wiring_pwm.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ extern void __analogWriteFreq(uint32_t freq) {
4444
}
4545

4646
extern void __analogWrite(uint8_t pin, int val) {
47+
analogWriteMode(pin, val, false);
48+
}
49+
50+
extern void __analogWriteMode(uint8_t pin, int val, bool openDrain) {
4751
if (pin > 16) {
4852
return;
4953
}
@@ -62,7 +66,11 @@ extern void __analogWrite(uint8_t pin, int val) {
6266
analogMap &= ~(1 << pin);
6367
}
6468
else {
65-
pinMode(pin, OUTPUT);
69+
if(openDrain) {
70+
pinMode(pin, OUTPUT_OPEN_DRAIN);
71+
} else {
72+
pinMode(pin, OUTPUT);
73+
}
6674
}
6775
uint32_t high = (analogPeriod * val) / analogScale;
6876
uint32_t low = analogPeriod - high;
@@ -88,6 +96,7 @@ extern void __analogWriteResolution(int res) {
8896
}
8997

9098
extern void analogWrite(uint8_t pin, int val) __attribute__((weak, alias("__analogWrite")));
99+
extern void analogWriteMode(uint8_t pin, int val, bool openDrain) __attribute__((weak, alias("__analogWriteMode")));
91100
extern void analogWriteFreq(uint32_t freq) __attribute__((weak, alias("__analogWriteFreq")));
92101
extern void analogWriteRange(uint32_t range) __attribute__((weak, alias("__analogWriteRange")));
93102
extern void analogWriteResolution(int res) __attribute__((weak, alias("__analogWriteResolution")));

doc/reference.rst

+3
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ PWM range may be changed by calling ``analogWriteRange(new_range)`` or
109109
``analogWriteResolution(bits)``. ``new_range`` may be from 15...65535
110110
or ``bits`` may be from 4...16.
111111

112+
The function ``analogWriteMode(pin, value, openDrain)`` allows to sets
113+
the pin mode to ``OUTPUT_OPEN_DRAIN`` instead of ``OUTPUT``.
114+
112115
**NOTE:** The default ``analogWrite`` range was 1023 in releases before
113116
3.0, but this lead to incompatibility with external libraries which
114117
depended on the Arduino core default of 256. Existing applications which

0 commit comments

Comments
 (0)