私たちは、ATmega48 / 88/168/328マイクロコントローラを長年にわたって多くの製品で使用してきました。AとPAのバリアントから新しいPBのバリアントに切り替えることを検討しました(新しい製品には追加のピン、タイマー、およびUARTが必要になります。これは、価格が安くなり、古いバリアントが廃止されるためです)。そこでATmega328PBでATmega328Aを切り替えました。停電後は非常に頻繁に問題が発生するようです。このような問題は、古い亜種では発生しませんでした。
当社の製品のユースケースでは、定期的な停電は正常です。私たちは5Vに設定されたスイッチング電源(この電源など)を使用し、ATmegaのVCCに220µFの範囲のコンデンサを使用して、SRAMを数分の範囲の停電に対して存続させ、ミッションではない内部状態を保存します重要ですが、再起動時にすぐに利用できるため、ユーザーエクスペリエンスが大幅に向上します(これらの状態は、EEPROMが不適切になるほど頻繁に変化します)。これは常に機能しています。
ただし、新しいATmega328PBを使用すると、停電後、MCUSRでリセット状態が検出されずにチップがリセットされ、クロックが不安定になっているように見えます。
- 電圧低下検出器はヒューズごとに設定されます。私たちは利用可能なすべてのbodlevelを試しましたが、それらすべてでバグが発生します。
- 外部20 MHzを使用し、ヒューズごとに正しく設定します。
- 3つの異なるチップを試したので、それは単一のはんだ付けやその他のハードウェア障害ではありませんでした。
バグが発生した後、クロックはしばしば2.5倍遅い速度に設定されます。これは、mcuが8 MHzの内部発振器によってクロックされていることを示しています。ただし、速度の低下は約6倍になる場合があります。これは、ソフトウェアからヒューズを設定できず、クロック分周器がクロックを2.5または6で分周できないため、クロック分周器を変更するソフトウェアのバグではないことを意味します。
それで、私の最初の疑いは、新しいClock Failure Detectionヒューズでした。ただし、オンまたはオフに関係なく、動作は同じです。
ソフトウェアの特殊性を排除するために、私は単純なテストプログラムを最初から作成しました。これは、タイマー割り込みからの100 Hzで出力をトグルするだけで、再起動後にリセット条件がアクティブになった(MCUSRから読み取った)LEDで示します。ハードウェアの残りの部分も削除され、mcuとレギュレーターのみが存在します(およびインジケーターは直列抵抗で導かれます)。
結果
およそ2/3の時間、興味深いことは何も起こりません。電源遮断後、mcuはそのジョブを再開し、電圧低下リセットと電源投入リセットインジケーターの両方が点灯します。
(画像では、赤はトグルされたピン、青はVCCです。この画像では、2.7 Vのブラウンアウトがはっきりと見えます。他のブラウンアウト設定で同じテストを行ったところ、結果はまったく同じです。だから私はそれらの写真を省略します)
おおよそ1/3の時間、前述のバグが発生し、電源が再び戻ってきたときに、どれもブラウンアウトリセットのとパワーオンリセットインジケーターが点灯されていません!mcuが奇妙な時計でカチカチ音を立てているかのように、出力は異なります。無秩序ではありませんが、同じ頻度でカチカチ音を立て続けます。
興味深いことに、この状況では、電圧低下検出器は完全に非アクティブになっているように見えます。これは、次の電源遮断後(正しいクロックが復元されることもあれば、復元されないこともあります)、出力がブラウンアウトレベルは合格です。このような状況では、時計が速くなる場合と遅くなる場合があります。
これらのテストでは、起動遅延に16K CK / 14CK + 4.1 msを使用しました(ただし、65 msの遅延では問題を回避できません)。
これはズームインした画像で、VCCが2 V以内に5 Vで安定状態に達していることがはっきりとわかります。
上の画像では、MCUは正常に起動しています。
興味深いことに、そうでない場合、電源電圧はより早く安定した5 Vに達します(MCUの多くの部分がオンになっていないようなので、起動時に流れる電流が少なくなります)
以下は、失敗したスタートからの画像です:
電源電圧が安定してから85 ms以上経過すると、ソフトウェアが実行を開始することに注意してください。起動遅延のヒューズは同じで、16K CK / 14CK + 4.1 msです。
また興味深いことに、電源がオフになった後、VCCは約1.1〜1.2ボルトで安定します(古いATmega328Aバリアントは約0.6-0.7 Vに低下しました)。それは数分間それを保ちます。十分長い時間(30分程度かそれ以上)待つと、mcuは常に正しく起動します!したがって、問題は、1.1ボルト前後であり、データシートによると、パワーオンリセットに十分であるとは保証されていないようです。しかし、電圧低下リセットにはそれで十分です!
これらの状況を除いて、電圧低下検出器は正常に動作します。最初の画像で確認できます(bodlevelに到達すると出力信号が停止し、mcuの一部がシャットダウンされるため、電圧降下が遅くなります)。VCCをボディレベルよりわずかに下げて再び上昇させると、テストを実行しました。そのような条件下では、mcuは常に正しく再起動し、ブラウンアウトリセットインジケーターのみが点灯しました。
私は明らかな何かを見逃しましたか、それともATmega328PBのブラウンアウト検出器に深刻なバグがありますか?
編集:
興味深いことに、上記の問題はレギュレータの前で電源を遮断したときにのみ発生します。レギュレーターの後で中断した場合(または実験用の電源を使用した場合)、問題は発生しません。あたかも上昇電圧の形状が問題を引き起こしたかのよう。ただし、前の画像からわかるように、電圧の上昇は非常に良く、すばやく安定します。
編集2
20 MHzではなく16 MHzで試してみましたが、まったく同じ問題が発生します。