« Arduino互換機を作りたい(2) | トップページ | 超簡単!無線マイコン TWE-Lite DIP がやって来た! »

2013年9月 2日 (月)

Arduino互換機を作りたい(3)

Atmega328P-PUの自動リセット回路を検討します。

Atmega328P-PUは、作って遊べるArduino互換機(鈴木哲哉さん著)やAtmega328PのデータシートによるとRESETピンを2.5μ秒以上Lowにするとリセットされるようになっています。

一方、ArduinoのIDE(統合開発環境)は、ArduinoをRESETする際にシリアルのDTRをアサート(Onにする。負論理なのでLowにするとOn)します。

つまり、シリアルのDTRをAtmega328P-PUのRESETピンへ接続することが必要です。

ところで、これだけ読むと単にシリアル変換アダプタのDTRをRESETへ接続すれば良さそうなものですが、以下の書籍のどの回路図をみてもDTRとRESETの間にコンデンサが入っています。

さらに、Arduino UNO Rev.3の回路図を見ても入っています。0.1μF(100nF)のコンデンサがいます。作って遊べるArduino互換機には、このコンデンサでパルスに変換していると書かれています。

ちょっとLTSpiceでシミュレーションしてみました。

Pwlsetting_2

上のスクリーンショットのようにPWL(Piecewise Linear)でDTRの電圧の変化を定義してシミュレーションしています。

ここでは、時刻0には、5Vで、続く1m秒の間0Vを継続し、次の1μ秒で0Vに落ちて、以後0Vのままという設定でシミュレーションしました。LTSpiceのPWLの設定は、Simon Bramble の LTspice Tutorial: Part 5 に詳細が解説されています。もっと高度な定義もできるようです。

シミュレーション結果はこんな感じです。

Resetcaponly

ブルーの線は、DTRの電圧の変動を表していて、グリーンの線がRESETピンに現れる電圧です。1m秒まではブルーしか見えませんがグリーンも全く同じ形で重なっています。

DTRがLowとなった瞬間にRESETも0Vになりますが、徐々にコンデンサに充電されて数ミリ秒後には、元通り5Vになっています。これは、DTR=Highのときには、コンデンサの両端共に5Vで同一電圧であったためコンデンサの両端は電位差がなく充電されていなかったものが、DTRが0Vになったことで、コンデンサの両端の間に5Vの電位差(DTR側0V、RESET側5V)が生じコンデンサへの充電が開始されてコンデンサの両端の間に電圧が生じたためですね。

こういう動作をするコンデンサを意図的にここに入れているということは、単にリセットする際にRESETピンをLowにするだけでは、何か都合が悪いか、お行儀が悪いということでしょうね。Lowにして、2.5μ秒以上Lowを維持して、その後、Highになるとリセットされるという方が納得がいく気がするのですが。

ということで、改めてAtmega328Pのデータシートを見てみると「11.4. 外部リセット」にこんな記述がありました。

外部リセットはRESETピンのLowレベルによって生成されます。

(中略)

印加された信号の上昇がリセット閾値電圧(VRST)に達すると(遅延タイマを起動し)、遅延タイマは遅延時間(tTOUT)経過後にMCUを始動します。

どうやらリセットという言葉は再起動までは含まないんですね。(「リセット」という言葉自体は再起動を含んでいるようです。ただ、文脈によって「リセットを開始する」ということを「リセットする」と書いてあったり、再起動まで含めて「リセットする」と書いてあったりするので混乱してしまいました。こちらは英語版のATMEGA328Pのデータシートですが、p.48のFigure 11-4. External Reset During Operationに描かれているRESETのタイミングを見ると一目瞭然です。)再起動させるためには、RESETをHighにする必要があるようです。これで、コンデンサの存在理由がすっきり。

ということで、DTRをRESET(1番ピン)に接続して、負論理(LowでOn)なので、5Vにpull upして、さらに手動リセット用のタクトスイッチも追加するとこう↓なります。

Reset2

でも回路図をじーっと見つめているとふとした疑問が。。。コンデンサが充電されて5Vになった後でDTRがHighになったらどうなるのでしょう?コンデンサの両端の間の電圧5Vは、コンデンサのDTR側を基準にした電位差ですので、ここがGNDに対して5VになったらコンデンサのRESET側は、5V+5Vで10Vでは?

え、ホント?ということで、またまたLTSpice登場です。

Resetcaprevert

DTRが時刻0には5Vで、1m秒の間5Vを継続し、その後、1μ秒で0Vになって、それを3m秒継続して、次の1μ秒で5Vに戻るというシナリオです。

やはりDTRがHigh(5V)に戻った瞬間RESETピンは、10V近くになっています。

Atmega328Pのデータシートの図11-1 リセット回路構成には、「スパイク除去」という回路がRESETピンとRESET回路の間にあり、これが保護してくれて不具合の心配はないのかと思って調べたらこちらにAtmegaがハングすることがあるとの記述が。

対策として、RESETをpull upしている抵抗 と並列にダイオードを逆向きに入れるという手があることが書かれていました。

つまり、こういうことですね↓

Resetcapdiode

回路図とシュミュレーション結果です。DTRの電圧変動のシナリオはコンデンサーだけのときと同じです。だいぶ軽減されています。RESETピンの電圧が5V+シリコンダイオードの順方向電圧(0.6V)を超えるとダイオードを経由して電源V2へ一気にコンデンサーが放電して極端な高電圧になることを防いでくれるということでしょうか。ところで、Atmega328Pのデータシートの図11-1 リセット回路構成を見ていると、RESETピンの内側で30kΩ~60kΩでpull upされています。ひょっとして、外でpull upしなくていいのでは?という気もしますが、Arduino UNO Rev.3の回路図を含めてどこで見かける回路図でもpull upしてますので(なぜ必要なんでしょう?という疑問はありつつも)、ここはそのままにすることに。

ということでまとまった回路図は↓です。

Resetavccupdated2

(追記:2013/9/4)

上のシミュレーションと回路図では手持ちのシリコンダイオードを使っていますが、順方向電圧降下が小さいショットキーバリアダイオードの方がさらに良いかと。

(追記ここまで)

(追記:2013/9/4その2)

シミュレーションにかなり適当(いい加減)なところがあることに気が付きました。DTRが立ち上がってきた時にRESETピンの電圧がどの程度上昇するかは、DTRが立ち上がるスピード、コンデンサーの応答、これらと密接に関連しますが、ダイオードを追加した回路の方であればダイオードの両端の電位差が順方向降下電圧を超えるまでの時間、超えてから電気が流れ始めるまでの時間に依存するはずですが、これらについては全く吟味していません。例えば、DTRが5Vになる時間がコンデンサの放電開始よりも早く、ダイオードの通電よりも早ければダイオードを入れた意味はなく、RESETピンの電圧は、10Vになるはずです。それから、ダイオードの選定ですが、手持ちの小信号用ダイオードを何も考えずに入れていますが大丈夫でしょうか?1N4148のデータシートを見ると「Non-repetitive Peak Forward Surge Current」という気のなるデータが。Pulse Width = 1.0 microsecond のとき、4.0A との記述が。DTRが立ち上がってきたときにダイオードを流れる電流がこれを超えるとまずそうです。コンデンサーに蓄積されている電荷Q = 0.1μF x 5V = 0.5μC (で、あってます?)。仮に1m秒で放電するなら0.5μC x (1/1m秒) = 0.5mA となります。大丈夫そうです。でも、1m秒かけて放電するという根拠は(くつしたねこの知識の中には)まるでないので、仮に1μ秒だったら0.5Aとなります。もう一桁くらい余裕がありそうですが、さてどうなんでしょう。こちらでは、同じダイオードを入れてからはトラブルがないとのことですので、とりあえず真似ておきますcoldsweats01

(追記ここまで)

手動リセットの場合のシミュレーションもしておきます。LTSpiceに機械接点のスイッチは無いようですので、電圧制御スイッチ(Voltage controlled switch)で代用してみました。電圧が設定した閾値を超えるとスイッチがオンになり、閾値以下となるとオフになる部品です。使い方の詳しい説明は、キットと初歩の電子工作 LTSPICE入門 アーカイブ ー LTSPICE入門(27) 電圧制御スイッチについて で詳しく解説されています。それで、シミュレーション結果はこれ↓です。

Resetcapdiodesw

スタートから1m秒後にスイッチがオンになり、さらに1m秒後にスイッチがオフになるシナリオです。問題ないようです。

つづく

(追記:2013/09/03)

これまで20番ピン(AVCC)は何も考えないで電源にだけつないでいました。このピンは、ADコンバータの電源を供給するピンです。電源なのでパスコン入れるかなと思って一応データシートに何か書いてあるか見てみました。そして、ATMEGA328Pのデータシートには、こんな記述がありました。

1.1.7 AVCC

AVCC is the supply voltage pin for the A/D Converter, PC3:0, and ADC7:6. It should be externally connected to VCC, even if the ADC is not used. If the ADC is used, it should be connected to VCC through a low-pass filter.

ローパスフィルタを経由して、VCCにつなげとのことです。ということで、AVCCを電源につなぎつつ、グランドとの間にバイパスコンデンサをつなぐことにして、修正した回路図がこれ↓です。

Resetavccupdated

(追記ここまで)

それでは、また!

« Arduino互換機を作りたい(2) | トップページ | 超簡単!無線マイコン TWE-Lite DIP がやって来た! »

Aruduino」カテゴリの記事

電子工作」カテゴリの記事

コメント

応用すれば簡易的に10Vを作り出せそうですね。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1939480/53108879

この記事へのトラックバック一覧です: Arduino互換機を作りたい(3):

« Arduino互換機を作りたい(2) | トップページ | 超簡単!無線マイコン TWE-Lite DIP がやって来た! »