以前に外部接点の絶縁型入力回路を紹介した。
もっと単純な回路にできないものかと思っていたところ...ソフトウェアを工夫することによりGPIO一本だけで実現できてしまうことを発見。まずは、回路図であるが以前に比べるとかなりシンプル。こんな単純な回路で実現できるなんて素晴らしすぎる。(笑)
ポイントはRL回路の過度現象を利用していること。トランスには瞬間的に電圧を掛け電流が流れる前に遮断する。そのため逆起電力は発生しないので逆起電力吸収用のダイオードは省略可能。抵抗も省略可能ではあるがプログラムの誤動作等による破壊を防ぐ意味ではあったほうが安心である。外部接点をベル線(10m)で延長配線した実験の結果、抵抗は100オーム程度が良さそうな感じだ。
次のポイントは電圧を遮断する方法としてGPIOを入力に切り替ること。つまりオープン状態にするということだ。オープン状態での過度現象の電圧降下の傾きがトランス2次側の短絡/解放により大きく変化することを利用している。というかGPIO一本で入出力しようというのだから出力から入力へ切り替えるのは必然でもあるのだが...
ATTiny85 での実験では入力処理にかかる時間は1マイクロ秒程度と高速、かつ、外部電源も内部発振回路も不要な超省電力な絶縁型入力回路なのでIoT用途にもピッタリかもしれない。以前の投稿のように2次側負荷による1次側のインピーダンス変化を検出すれば絶縁型入力回路が構成できることは広く知られているが過度現象だけを利用した絶縁型入力回路っていうのは聞いたことがない...
パルストランス一個と抵抗一本だけで絶縁型入力回路が実現できるなんて、なんか凄くない?(/・ω・)/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#define nop() __asm__ __volatile__ ("nop"::) void setup() { pinMode(0, INPUT_PULLUP); pinMode(1, OUTPUT); } uint8_t isolatedDigitalRead() { uint8_t val; cli(); DDRB |= (1 << PB0); DDRB &= ~(1 << PB0); nop(); nop(); nop(); nop(); val = PINB; sei(); return val & (1 << PB0) ? HIGH : LOW; } void loop() { digitalWrite(1, isolatedDigitalRead()); } |