つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション36 ~ 反転シュミットトリガ

 今回は反転シュミットトリガを利用した発振回路について紹介し、Arduinoを用いて発振回路の発振周期を調べてみる。

1. シュミットトリガ

 シュミットトリガとは、入力に対して閾値を越えるとHIGH、閾値以下はLOWを出力するが、出力がLOWからHIGHになるときの閾値とHIGHからLOWになるときの閾値が異なる(ヒステリシスがあるという)という特性がある。スイッチ等で閾値付近にノイズが入る場合、出力がノイズにより大きく変わる(チャタリング)ことを防止し、出力を安定化させる目的に使われることが多い。

2. 反転シュミットトリガ

 反転シュミットトリガとは、シュミットトリガの出力を反転、すなわち入力が閾値以下だとHIGHで閾値以上はLOWを出力するデバイスで、シュミットトリガと同様に閾値はヒステリシスを有している。 Tinkercadの反転シュミットトリガは74HC14で、6個の回路がパッケージされているICとなっていて、下に示すように電源VccとGND以外はすべて入力・出力にピンが割り当てられている。

74HC14のピン割り当て
74HC14のピン割り当て

なお詳細なデータシートは http://akizukidenshi.com/download/ds/Toshiba/TC74HC14AP_datasheet_ja_20140301.pdf

3. 反転シュミットトリガによる発振回路

 反転シュミットトリガの出力をCR回路を介して入力に戻す構成により、発振回路を構成できる。詳しい動作については「シュミットトリガ回路」の解説(4) - しなぷすのハード製作記を参照。ここでは74HC14の入力1と出力1を用いて、CR回路はC=48uF, R=1kΩとした回路図を以下に示す。

反転シュミットトリガによる発振回路
反転シュミットトリガによる発振回路

動作例としてTinkercadでのシミュレーションを以下に示す。入出力1に加えて入出力2を利用し、コンデンサは入出力1の半分である24uFを接続している。また出力波形をそれぞれオシロスコープで表示し、出力1に対して出力2は周波数が倍になっていることが確認できると思う。

発振回路シミュレーション例
発振回路シミュレーション例

以前、以下のタイマーICの利用で発振回路を紹介したが、タイマーICに対して反転シュミットトリガを用いると1つのデバイスで複数の発振回路を構成できるというメリットがある。(ただしデューティー比は調整できない)

atatat.hatenablog.com

4. Aruduinoを用いた発振周期の測定

 反転シュミットトリガによる発振回路の出力をArduinoの2ピン(HIGHの長さ検出)と3ピン(LOWの長さ検出)に接続し、pulseInを用いてパルス長さを検出する。Tinkercad上での接続(および実行)下図を下に示す。

発振回路のパルス長さ検出
発振回路のパルス長さ検出

スケッチは以下のようになる。パルス長さを10回測定した平均値をシリアルモニターに出力するようにしている。スケッチの説明については上の記事も参照。

unsigned long  thh=0,thl=0,thh_tot=0,thl_tot=0,thh_ave,thl_ave;
int cnt=0;

void setup()
{
  pinMode(2, INPUT_PULLUP);  
  pinMode(3, INPUT_PULLUP);  
  Serial.begin(9600);    
}

void loop()
{
  thh=pulseIn(2,HIGH);//パルス(HIGH)検出
  thl=pulseIn(3,LOW);//パルス(LOW)検出
  thh_tot=thh_tot+thh;
  thl_tot=thl_tot+thl;
  if(cnt==10){
    thh_ave=thh_tot/10;
    thl_ave=thl_tot/10;
    Serial.print("Duration th: ");
    Serial.print(thh_ave);
    Serial.print(",");
    Serial.print(thl_ave);
    Serial.print(",");
    Serial.print(thl_ave+thh_ave);
    Serial.println("us");
    
    cnt=0;
    thh_tot=0;
    thl_tot=0;
  }

 cnt++;
}

起動直後にパルスが長めになるのでシリアルモニタに表示される1回目のパルス長さの結果は採用せず、2回目以後に着目する。 実行結果としては、パルスHIGHの長さが18.1ms, パルスLOWの長さが17.4ms,パルス1周期が35.5msとなった。

反転シュミットトリガの周期の計算値は「シュミットトリガ回路」の解説(4) - しなぷすのハード製作記によると

 \displaystyle T=CR \left( \ln \dfrac{V_{H}-V_{THL}}{V_{H}-V_{TLH}}+\ln \dfrac{V_{TLH}-V_{L}}{V_{THL}-V_{L}} \right)

また閾値電圧は供給するVccに依存しており、データシートから以下の関係になっている。

Vcc VH VL VTLH VTHL
2 2 0 1.25 0.65
4.5 4.5 0 2.7 1.6
6 6 0 3.5 2.3

今回のVccは5Vになるが、VH=5Vとして残りはVcc=4.5V(温度25℃)の数値を使用する。すなわちVTLH=2.7V, VTHL=1.6V,さらにC=48uF, R=1kΩとして上の式で計算するとT=43.9msが得られる。Tinkercadのシミュレーションでは35.5msなので数値に少し開きがあるが、Vccが5Vの場合の正確な閾値を用いていないことや、Tinkercadのモデルがデータシートの仕様をどこまで反映しているかなどの誤差要因があると思われる。 なおデータシートから例えばVTHLは2.3V~3.15Vとばらつきがあるので、実際のデバイスを用いる場合は測定評価が必要かもしれない。

5. まとめ

 今回は反転シュミットトリガを利用した発振回路とArduinoによる発振周期の測定方法について紹介した。