좀 더 작은 tid- 비트 : AVR과 같은 명시적인 "오픈 드레인"모드가없고 Uno와 같은 Arduino ATmega328 기반 보드가없는 마이크로 컨트롤러의 경우이 "오픈 드레인"모드는 래퍼 기능을 작성하여 시뮬레이션 할 수 있습니다. a를 보낼 때 단순히 핀을 "출력 LOW"로 설정하고 a를 보낼 때 0
핀을 "입력 LOW"(높은 임피던스 모드, 내부 풀업 저항 NOT)로 구성합니다 1
. 이런 식으로 같은 효과를 얻을 수 있습니다. 이 최신 32 비트 ARM 코어 마이크로 컨트롤러에는 훨씬 더 많은 옵션이 있습니다.
또한, 위에 링크 된 STM32 Reference Manual의 p146은 다음과 같습니다 [추가 된 부분은 대괄호 안에 있습니다] .
– 오픈 드레인 모드 : 출력 레지스터의 "0"은 N-MOS를 활성화합니다 ( 핀을 GND에 연결하여 적극적으로 LOW를 구동 함) . 출력 레지스터의 "1"은 포트를 Hi-Z (P- MOS는 활성화되지 않음) [고 임피던스 모드-풀업 또는 풀다운 저항이없는 플로팅 입력과 동일]
– 푸시 풀 모드 : 출력 레지스터의 "0"은 N-MOS를 활성화하고 [핀을 GND에 연결하여 적극적으로 LOW를 구동합니다] , 출력 레지스터의 "1"은 P-MOS를 활성화 합니다. VCC에 대한 핀]
Arduino 코드에서 "래퍼 함수"는 다음과 같이 구현 될 수 있습니다.
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);
}
}
Arduino 에서 내부 풀업 저항 을 켜 려면 다음을 수행하십시오.
pinMode(pin, INPUT_PULLUP);
또는 (같은 것) :
pinMode(pin, INPUT);
digitalWrite(pin, HIGH);
추가 자료 :