机器周期与共地:时钟基准和电压参考基准 – Zw-awa – 博客园

机器周期与共地:时钟基准和电压参考基准 – Zw-awa – 博客园


チップや回路が正確に動作するには、2 つの目に見えない定規が必要です。

時間を測定します。プログラムには、「100 ミリ秒後にリフレッシュ」および「20 ミリ秒ごとに制御」と表示されます。なぜこれらの 100 ミリ秒と 20 ミリ秒が真実であると信じますか?電圧を測定する別の方法: ある点が 3.3V で、ある点が 0V であると言うとき、誰がそれを言っているのでしょうか?マシンサイクルは時間定規のスケールであり、共通接地は電圧定規のゼロスケールです。以前の失敗 – OLED の時間の数字が停止し、OLED 画面が時々真っ暗になり、AO の測定値が高いときもあれば小さいときもあった – 振り返ってみると、おそらく特定の定規が平らではなかったことが原因でした。

時計の支配者

51 歳から来た人は誰でも数字を覚えています

51 を学習したことのある人は「マシン サイクル」に精通しています。1 マシン サイクルは 12 水晶発振器サイクルに相当します。 12MHz の水晶発振器の場合、マシンサイクルは 1µs です。タイマーの初期値と遅延ループはすべてこの数値に基づいて計算されます。これは固定されたメトロノームのようなもので、チップが行うことはすべてメトロノームを踏むことだけです。

私が初めて STM32 に触れたとき、無意識に「STM32 のマシンサイクルとは何だろう」と調べました。ただし、Cortex-M3 には統一されたマシン サイクルがありません。

それは怠惰なチップではありません。流れ作業の登場以降、「指示には何拍必要か?」もはやマニュアルの表紙に書ける数字ではありません。

指示は組立ライン上の 3 つのステーションを通過します

Cortex-M3 は、命令をフェッチ、デコード、実行の 3 つのステーションに分割します。工場の組立ラインの利点は、最初のステーションがまだ 3 番目の命令をフェッチ中で、2 番目のステーションが 2 番目の命令を変換し、3 番目のステーションが最初の命令を実行していることです。 3 つの命令が一度に 1 ステーションを占有するため、あたかも 1 つの命令が各ビートで完了するかのように見えます。ほとんどの単純な命令は確かにシングルサイクルです。

シングルサイクルは「理想的なパイプライン」の結果です。停止して待機する必要がある場合、このショットは空になります。

  • 命令をフェッチするにはフラッシュを読み取る必要があります。フラッシュはカーネルよりも遅いです。クロックが高くなった後は、時々命令を挿入して待つ必要があり、パイプラインの最前列は空になります。
  • メモリ内のデータの読み書きや除算などの重いタスクは、それ自体が 1 回では済みません。

それで同じこと a = b + cレジスタは一発でクリアされる可能性があります。a = array[i] メモリから値を取得する場合は、もう少し待つ必要があります。 Cortex-M3ではマシンサイクルという用語が固定値ではありません。そもそも固定値ではなく、「この命令が実際に何拍かかるのか」という現場での結果です。

そのショットはどこから来たのですか?

組み立てラインがどのように配置されているかに関係なく、下部のビートは同じソース、つまりシステム クロックから来ています。このチップのクロックは 72MHz で、これは 1 秒あたり 7,200 万クロック サイクルがあることを意味し、1 サイクルは約 13.9ns です。 1ms は 72,000 サイクル、20ms は 1,440,000 サイクルです。タイマーは必ずしも何回もカウントするわけではありません。タイマーの記事の PSC と ARR の連携のように、最初にクロックを分周してからカウントすることがよくあります。しかし、どのように分周しても、72MHz クロックのビートはカウントされます。

ボタンを押し続けると、OLED 上の時間の数字の動きが止まります。数字の後ろにあるカウントは、時限割り込みにより 1ms ごとに 1 ずつ増加します。なぜ信じられるのでしょうか? OLEDリフレッシュとボタンサンプリングと同じクロックを共有しているためです。メトロノームは停止しませんでしたが、メイン ループがブロックされ、タスクを更新できないことを示しました。手を離すと数値が急上昇し、飛び出したのは「この間メトロノームがカウントしていた」という証拠だった。

PID の 20ms についても同様です。コントローラーには「20ms ごとに 1 回カウントする」と表示されます。コード内のサイクル数は何気なく書かれているわけではありません。最下層を見ると、72MHz クロックの 1440000 サイクルに相当します。タイマーが最初に周波数を分割し、次に PSC/ARR に従って間隔をカウントするだけです。 「どれくらいの期間」に関するすべての判断は、最終的には時計にかかっています。

定規が曲がっていたらどうなるのでしょうか?

時計は不正確で、すべての時間が歪んでいます。ブレッドボードで最も一般的な問題は、水晶発振器が壊れていることではなく、「同じクロックを使用していると思われる」ことです。プログラム内の 1 つの遅延はミリ秒単位でカウントされ、もう 1 つのモジュールはビートをカウントするループ内でアイドリングしています。双方が一致せず、時々速くなったり遅くなったり、時々フリーズしたりする現象です。すべてのモジュールに同じタイミング ソースを「どれだけ長く」要求するかを尋ねます。そうしないと、各モジュールがルーラーを取得し、遅かれ早かれ一致しなくなります。

電圧定規

3.3V が相対的なものだと誰が言ったでしょうか?

3.3V がポイントであると言うのは、実際には文の後半「GND よりも 3.3V 高い」を省略しています。電圧は常に差のみであり、絶対値ではありません。 GND は全員が合意した 0V 基準点、つまり電圧スケールのゼロスケールです。

チップ内部では「ハイレベルかローレベル」を「ハイ」の高さではなく、自身のGNDよりどれだけ高いかで判断します。 STM32 では、ハイレベルを出力するには、出力ピンを自身の GND より 3.3V 高い場所にプッシュすることを意味すると述べています。

すべてのモジュールが同じグランドを共有する必要があるのはなぜですか?

OLED、ボタン、センサーにはそれぞれ独自の GND があります。 2 つのボードの GND が同じ点にない場合、次のようなことが起こります。STM32 は「高レベルを送信します」と言い、OLED は自身の GND を測定し、それが本来あるべきほど高くないことを検出します。 STM32 はそれが明確になったと考えますが、相手には別の文が聞こえます。グランドを共有するには、2 つの電圧定規のゼロ スケールを揃えることです。調整後、「ハイ」は同じ「ハイ」、「3.3V」は同じ 3.3V になります。

OLED 画面が時々真っ暗になったり、ボタンがランダムにジャンプしたり、トレースの読み取り値が変動したりすることがあります。トラブルシューティング中に最初に疑われるのはコードであることが多く、最後に見つかるのは接続されていないアース線であることがよくあります。それは「ワイヤーの接続を忘れる」というような小さなことではなく、2 つのシステムが互いの位置を測定するために位置がずれている 2 つの定規を使用することです。

電圧の読み取りも比率です

AOで読み取られる数値は電圧そのものではなく、「基準電圧に対する入力電圧の比率」です。 ADC の基準電圧はチップのアナログ電源から供給されます。通常、このボードでは 3.3V です。1.65V を入力してフルスケールの半分を読み取ります。 3.3Vを入力し、フルスケールを読み取ります。黒い線と白い背景で反射される光は異なり、感光モジュールが出力する電圧も異なります。 ADC はこの電圧を 3.3V と比較し、数値に変換します。基準電圧が変動すると、測定値も変動します。基準電圧が不正確な場合、電圧スケール全体のスケールが歪んでしまいます。

このため、モジュールの電源は安定している必要があります。降圧モジュールの出力にリップルがある場合、同じ黒い線の位置で読み取られる数値は毎回わずかに変動します。これはセンサーが故障しているのではなく、センサーの頭上の基準電圧が勝手に変動しているためです。

地面は理想的ではありません

「共通グランド」について話すとき、すべての GND が一緒に接続されていればすべてがうまくいくことは容易に想像できます。アース線自体には抵抗があり、電流が流れると若干の電圧降下が生じますが、電源から遠いGNDと電源に近いGNDは厳密には同じ0Vではありません。電流が大きくなり、ワイヤが細く長くなるほど、この「グランドバウンス」はより明白になります。ほとんどの場合、ブレッドボード上では感じられませんが、モーターが始動して瞬時に大電流が引き抜かれるとき、ロジックモジュールのアース線が非常に遠くて細い場合、不可解なリセットや読み取りジャンプが発生する可能性があります。

高度なシステムでは、アナログ部分とデジタル部分のグランドを分離し、最終的に電源でそれらを結合して、デジタル・フリッピング・ノイズがアナログ測定に混入するのを防ぎます。ブレッドボードの段階では、最初に 3 つのことを実行します。すべてのモジュールに共通のグランドがあること、電源ワイヤとグランド ワイヤに細すぎたり長すぎるフライング ワイヤを使用しないこと、測定点をモジュール自体にできるだけ近づけることです。これら 3 つのことを行うことで、ほとんどの「形而上学的な」誤作動はもはや不可解なものではなくなります。

最後にオレンジ色の猫が言いました

マシンが正確であるためには 2 セットのベンチマークが必要です。時間はスケールとしてクロック サイクルに基づき、電圧はゼロ スケールとして共通グランドに基づきます。 STM32 には 51 のような固定マシン サイクルがありません。これは、パイプラインによって「命令あたりのビート数」がオンサイトの結果になるためです。しかし、ビートがいくつあっても、それらは同じクロックから来ており、最終的にはすべて「どれくらいの長さ」が問われることになります。電圧には絶対値はなく、3.3V は「共通グランドより 3.3V 高い」ことを示し、ADC の読み取り値は入力電圧と基準電圧の比率にすぎません。心拍数が停止し、OLED 画面が黒くなり、AO の読み取り値が浮かび上がります。関係のないことのように見えますが、結局のところ、すべての定規が関係しています。1 つは時間の定規、もう 1 つは電圧の定規です。

最後に蜘蛛は言いました

六分儀をベースにして天文時計が基準となります。太鼓の音が聞こえたら前進し、金の音が聞こえたら後退します。ベンチマークは古くから存在しています。



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *