はじめに
今さらながらArduinoを動かしながら勉強中の私ですが、ハードによるチャタリング対策の回路を動作させてみた際に、Arduino Unoのシュミットトリガ入力のスレッショルド電圧(閾値電圧)が実測できそうだったので、確認してみました。今回はその内容を参考までに紹介します。
回路図
今回の回路図・ブレッドボード接続図は下記になります。(参照:ハードによるチャタリング対策と同じです)
プログラム
プログラムは下記のとおりです。(ボタンを押している間Lチカ【マイコンLチカ道場 Arduino編 1-1】と同じです。)ボタンを押すとLEDが点灯、離した瞬間に消灯するプログラムです。
const int LED1 = 12;
const int SW1 = 2;
int a = 0;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(SW1, INPUT_PULLUP); //SW1を入力に設定、内蔵プルアップ有効
}
void loop() {
a = digitalRead(SW1); //SW1の状態を読み込み、aに代入
if (a == LOW){
digitalWrite(LED1, HIGH);
} else {
digitalWrite(LED1, LOW);
}
}
動作確認
上記の回路とプログラムで、入力ピンの電圧をゆっくり変化させたときに、いつ出力が変化してLチカするかを確認することで、入力のスレッショルド電圧を確認したいと思います。
スイッチを短く押して離したときのスイッチ電圧、マイコン入力電圧、出力電圧の波形をオシロスコープで見てみました。
スイッチONによりC1が放電して、入力ピン電圧が約2.2Vまで落ちた際にLEDが点灯しています。また、スイッチを離して入力電圧が2.6Vまで上昇した際にLEDが消灯していることが確認できました。
よってHIGH⇒LOW(VIL)は2.2V、LOW⇒HIGH(VIH)は2.6V、その差であるヒステリシス電圧は0.4Vであることがわかりました。
入力ピンによって差がないか確認してみました。スイッチを接続するピンを「2」から「3」、「4」に変更して、同様に波形を見てみました。
ピン3、ピン4もピン2と同じ結果(HIGH⇒LOWは2.2V、LOW⇒HIGHは2.6V)となりました。よって今回はピンによるばらつきは確認できませんでした。別のボード(マイコンIC)で試すとばらつきが出てくるのかもしれません。
データシートから、今回の結果が間違ってないか確認してみました。Arduino Unoで使われているマイコンのデータシートはここから見ることが出来ます。(秋月電子のサイト:ATMEGA328-P、pdf直リンではないですが、30Mbyte以上有るので注意してください)
データシートの609~610ページ(多いなw)あたりの図35-25、図35-26から、5Vの時の入力スレッショルド電圧はVIH=2.6V、VIL=2.1Vあたりであり、ほぼ一致していることが確認できました。
まとめ
Arduino Unoで使われているATMEGA328-Pのシュミットトリガ入力のスレッショルド電圧(閾値電圧)を実測で確認してみました。測定結果は約VIH=2.6V、VIL=2.1Vであり、ほぼデータシートのとおりの値であることを確認出来ました。