อีกนิดหน่อย tid-bit: สำหรับไมโครคอนโทรลเลอร์ที่ไม่มีโหมด "open drain" อย่างชัดเจนเช่นบอร์ด AVR และบอร์ด Arduino ATmega328 ที่ใช้ ATmega328 เช่น Uno โหมด "open drain" นี้สามารถจำลองได้โดยการเขียนฟังก์ชั่น wrapper เพียงตั้งพินเป็น "เอาท์พุทต่ำ" เมื่อคุณส่ง0
และกำหนดพินเป็น "อินพุตต่ำ" (โหมดอิมพีแดนซ์สูงความต้านทานภายใน pullup - ไม่เปิด) เมื่อคุณส่ง1
เมื่อคุณส่งมัน ด้วยวิธีนี้คุณจะได้รับผลกระทบที่เหมือนกัน ไมโครคอนโทรลเลอร์ ARM แบบ 32 บิตที่ทันสมัยเหล่านี้มีตัวเลือกเพิ่มขึ้นมากมาย
ยิ่งไปกว่านั้น p146 ของคู่มืออ้างอิง STM32 ที่เชื่อมโยงไปยังสถานะด้านบน[การเพิ่มเติมของฉันอยู่ในวงเล็บเหลี่ยม] :
- โหมด Open drain: A“ 0” ใน Output register จะเปิดใช้งาน N-MOS [ดังนั้นจึงขับ LOW อย่างแข็งขันโดยเชื่อมต่อพินกับ GND]ในขณะที่“ 1” ใน Output register ออกจากพอร์ตใน Hi-Z (P- MOS ไม่เคยเปิดใช้งาน) [โหมดความต้านทานสูง - เช่นเดียวกับอินพุตแบบลอยที่ไม่มีตัวต้านทานแบบดึงขึ้นหรือเลื่อนลง]
- โหมด Push-pull: A“ 0” ใน Output register จะเปิดใช้งาน N-MOS [ใช้งาน LOW ต่ำโดยการเชื่อมต่อพินกับ GND]ในขณะที่“ 1” ใน Output register จะเปิดใช้งาน P-MOS [แรงขับสูงโดยการเชื่อมต่อ พินถึง VCC]
ในรหัส Arduino ว่า "ฟังก์ชั่น wrapper" สามารถนำไปใช้เช่นนี้:
digitalWriteOpenDrain(byte pin, bool state)
{
// Actively drive LOW
if (state==LOW)
{
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
}
// High impedance mode
// (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
else //state==HIGH
{
pinMode(pin, INPUT);
digitalWrite(pin, LOW);
}
}
หรือทำให้ง่ายขึ้น:
digitalWriteOpenDrain(byte pin, bool state)
{
digitalWrite(pin, LOW);
// Actively drive LOW
if (state==LOW)
{
pinMode(pin, OUTPUT);
}
// High impedance mode
// (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
else //state==HIGH
{
pinMode(pin, INPUT);
}
}
โปรดทราบว่าในการเปิดตัวต้านทาน pullup ภายในบน Arduino คุณสามารถทำได้:
pinMode(pin, INPUT_PULLUP);
หรือ (สิ่งเดียวกัน):
pinMode(pin, INPUT);
digitalWrite(pin, HIGH);
อ่านเพิ่มเติม: