1週間前、一人がやや非標準的な仕事で私に向きを変えました-各シリンダーに個別のコイルを備えた点火システムを備えた
カットされた写真、ビデオ、図、ソース、および対数とデータを適切にスケーリングしてコンマを取り除く方法について説明する多くのテキストの下。
ハード
TX-193デバイスから始めましょう。 デバイスの機械部分は、矢印を駆動する永久磁石と可動コイルを備えた、古典的なデザインのミリ電流計です。
実際、回路を開発するには、10 mA程度の電流で矢印が限界まで逸脱し、巻線抵抗が約180オームであることだけを知っていれば、ミリ電流計で十分でした。 有名なAtmel社のATtiny2313Aコントローラーは、16 MHzの外部水晶振動子からクロックされ、脳として選ばれました。 このデバイスは車両のオンボードネットワークから給電されます。つまり、GOSTによると、最大100Vの「ひげ」に耐え、9〜15Vの範囲で安定して動作する必要があります。 低消費(数十ミリアンペア)のため、インパルスノイズから保護するために、誘導フィルターとサプレッサーを備えた7805リニアスタビライザーを使用することが決定されました。 デバイスは手元のものから組み立てられたため、最終製品では7805の強力なバージョンが使用されますが、100mAでの78L05で十分です。
コントローラーは、当然PWMを使用して、ミリアンメーターを制御します。 位相および周波数補正PWMモードの16ビットタイマーに関係したもの。
クランクシャフトの回転速度に関する情報は、0-12Vのパルスの形でコンピューターから送信されます。 アクティブレベルが低い。 1クランクシャフト回転あたり2パルス。 これらのパルスをキャプチャするには、外部INT0割り込みと、対応するRCフィルターのチェーン、サスペンダー、保護ダイオードが使用されます。 一般に、デバイスの回路は非常に典型的であり、私はそれについて多くを書いたことがわかったのに驚いた。 しかし、厳密に判断しないでください。最初の記事はすべて同じです。
ダイヤルなしで組み立てられたデバイスは次のようになります。
ソフトウェア
実際、回路をプロットする前でさえ、ブレッドボードにすべてをすばやく組み立て、コントローラーをDIPパッケージに入れて、すぐに矢印を振り始めました))
一般に、ソフトウェアはハードよりも少し面白いことが判明しました。
一般的なアーキテクチャから始めましょう:
タイマー0は250 kHzの周波数でカチカチ音をたてています。つまり、カチカチ周期= 4μsが250 kHz / 256 = 0.976 kHzの周波数のオーバーフローによって中断されます。
つまり、割り込みは1024マイクロ秒ごとに1回発生します。 割り込みのタイマーカウンターを更新することで、混乱して1ミリ秒に近い値になる可能性がありましたが、このタスクには何もありません。 つまり 4 µsの精度で時間を測定できます。これは、デバイスの特定の精度に十分な時間です。
タイマー0は時間をカウントするだけでなく、特定のタスクを特定の頻度で実行するようにフラグを設定します。
2つのタスクがあります。 INT0割り込みに信号を与えて、入力のパルス周期を測定し、矢印の位置を変更します。
タイマー1は16 MHzの周波数でカチカチしていますが、 16ビットで、位相および周波数補正PWMモードを使用します-結果のPWM周波数は非常に小さく、約122 Hzになります。 これは、タイマーが最初に上昇してから下降するためです。 しかし、真の16ビットPWMがあり、非常に正確に矢印を操縦できます! データシートにはすべての詳細が含まれています。
ちなみに、メカニズムは嫌な品質であることが判明しました。最初はギアオイルで潤滑する必要があったメカニズムの摩擦が増加したため、矢印をスムーズに動かすことは現実的ではありませんでした。 しかし、これらは詳細です。
デバイスの読み取り値とPWMオウムのタイマーレジスタの対応する値との対応表が作成されました。
ソースでは、このケースはGAUGE_TABLEと呼ばれ、別のファイルで習慣から外されます。
さらに、一瞬で電流計回路の電流が変更されて、たとえば矢印1000が前方に移動すると、ターゲットマークの領域で2〜3/4の振動が発生し、これは完全に受け入れられず、顧客が特別に支払ったことがさらに発見されました注意。 実際、これらの回転速度計には最初このような問題があり、振動に合わせて何度か雷が鳴ったため、大きな振幅(スケールの半分以上!)で針を振ることができます。
これには何か関係がありました。 私のアイデアは、一連の小さなステップで矢印をマークに持っていき、徐々に目標に近づいていくことでした。 実際、この部分は初心者にとって最も興味深く有用です。 ある程度のスキルが必要です。 結局、ループ内でlog2()を呼び出すことは、マイクロコントローラーを扱うことであり、控えめに言っても、最も成功したアイデアではありません。 さらに、8ビットアーキテクチャにはさらに多くの制限があります。 さて、「浮動」(浮動小数点)については、まったく忘れる必要があります。 しかし、これらすべての困難は、いつものように、プロセッサによって行われたプロセスと計算のより深い理解にのみつながります。
何らかの理由で、テキストはどんどん増えていきますが、この時点でもう少し詳しく説明することはできません。
したがって、対数進行が必要であることは明らかです。 電流計回路の電流を変更するステップは、ターゲットマークに近づくにつれて減少します。 リソースは金の重さの価値があり、これは表形式の方法のみを意味します。 少なくともポイントも可能です。
対数表を作成することから始めましょう。
すべてが非常に簡単です。Excelを実行し、マウスを数回スイープするだけで、1〜50のシーケンスに対して2を底とする対数の50の値が得られます。わかりやすくするために、美しいグラフを作成します。
いいね! 必要なもの! しかし、第一に、50ポイントがあり、第二に、すべての浮動小数点数があります。 これは決して私たちには適していない!
したがって、10のステップで既存の配列から5つのポイントを選択します。次のようになります。
すでに良い。 目標への一貫したアプローチは維持されますが、ポイントは10分の1になります。
次に、結果セットを正規化する必要があります。 つまり すべての値が0〜1の範囲にあることを確認してください。これを行うには、各要素を5.64385618977472(配列の最大値)に分割します。
したがって、同じ対数依存性が得られますが、さらに計算するのにはるかに便利な形式です。 このようなテーブルは、ゼロより後のポイントではない場合、すでに非常に簡単に適用できます。 しかし、これにより、対処も非常に簡単になります。
ここで、1ユニットあたり1024という美しい値を取得し、テーブルを再計算します。 取得します
ご覧のとおり、グラフの形状は変更されていませんが、数値は16ビットの範囲に収まり、端数はありません。
ソースコードでは、結果の配列はlogtable []と呼ばれます
スケーリングファクター(それを呼び出すことができる場合)1024は偶然ではなくここに表示され、なぜ1024であるかを非常によく理解する必要があります。
まず、2の累乗であり、2の累乗による除算と乗算の費用のかかる操作を安価な左/右シフトに置き換えることができるため、この機会を選択しました。この機会を使用しないのは愚かなことです。
次に、適用されるデータのスケールに基づいて係数を選択する必要があります。 この場合、これらはPWMの充填を制御する16ビットタイマーのレジスタの値です。 200 rpmの急激なシフトでも、矢印の不満足な変動が検出されることが実験的に判明しました。 つまり 矢印を200 rpm以上移動する必要がある場合は、スムージングが必要です。 GAUGE_TABLEテーブルは、隣接するセルが平均して4000 PWMのオウムの違いがあることを示しています。これは、デバイスの規模で約500 rpmに相当します。 図では、200obの矢印シフトが4000 / 2.5 = 1600 PWMのオウムになると推定することは難しくありません。
したがって、スケーリング係数は、最初はできるだけ大きくなるように選択する必要があります。そうしないと、ビットと精度が失われ、次に、16ビットから32ビット変数に強制的に切り替えて無駄にならないようにできるだけ小さくなります無駄なリソース。 その結果、最小の2の累乗を選択します。これは1600未満であり、十分な精度を提供します。 これは1024になります。
この瞬間は非常に重要です。 私自身は、変数の正しい係数とサイズを選択するのにまだ困難を感じることがあります。
まあ、それは行った、行った。 コード内でdisplay_rpm()の実装を見つけ、GAUGE_TABLE []テーブルを使用してPWMオウムの特定の値と、隣接するマーク間でスケールが線形であるという仮定を決定することを確認します。 対数法則に従って電流の変化を整理するために、pwm_ocr1a_cur_valから(矢印の移動方向に応じて)順次減算または加算する必要がある一連の値を含む5ポイントの配列pwm_cuve []が導入され、矢印がスムーズかつ明確に移動します。
各ステップは、pwm_delta値にlogtable []テーブルの係数を掛けることで形成されます。
乗算の前に、値は1024で除算することによって事前にスケーリングされます。
矢印target_pwmの最終的に計算された宛先は、そのままpwm_cuve []に書き込まれます。これは、丸めの問題および変数の次元が16ビットに制限されているため、計算の結果としての正確な値があまり頻繁に形成されないため、矢印が指定されたポイントでパスを終了します。
一般に、上記のすべては本質的に1行に含まれています
pwm_cuve[ table_i ] = pwm_ocr1a_cur_val + (pwm_delta / LOG_TABLE_MAX * logtable[ table_i ]);
次に、メインループは、タイマーからの信号によって、PWM_UPD_PERIODで0回pwm_cuveから値をスクープし、それらを変数pwm_ocr1a_cur_valに割り当てます。この値は、割り込みの値がOCR1Aレジスタに割り当てられ、すぐにPWM充填の変化と電流計の電流の変化につながります。
ここでは、実際には、タイマーの目盛りで示されている期間をrpmで測定されるクランクシャフト回転周波数に変換することを除いて、ほとんどすべてのトリックがあります。
これはすべて
engine_rpm = (uint16_t)(15000000UL / (uint32_t)rot_time);
削減され
engine_rpm = (uint16_t)(15000000UL / (uint32_t)rot_time);
この数字がどのようになったのか、次回は話さないのかについて話すことができます。
正直なところ、コードには、初心者には自明ではないかもしれないいくつかの「トリック」が使用されました。 誰かがより詳細に理解したい場合-kamentyとhpのウェルカム。
約束された小さなビデオ
測定値の精度に注意を払ってはいけません、矢印が正しくドレスアップされていない+ダイヤルがねじれていません。
1回のジャンプで1000 rpm単位の矢印の動き。
電流のスムーズな変化
実際には、1000 rpmでジャンプは発生せず、ビデオで見られる矢印の小さな飛行は問題になりません。 それらを削除した場合でも、デバイスの速度を冷たく失う可能性があり、その読み取り値は現実よりも遅れます。
PSアーカイブが完全にgovnokodであると言うわけではありませんが、はい、いくつかの場所でより美しくすることができます。 はい、マジックナンバーが悪いことを知っています。 一方、200行のソースで迷子になることは非常に難しいため、一部の場所では少しハッキングを許可しました。
ハブに長時間ログインし、プロジェクトの実装が困難になった後、時間の経過後に詳細な記事を書きたいと思ったので、今日は「フィールドからリードする」ことにしました。
そのため、実際のデバイスからの実際のコードは7晩の実際の期間に組み立てられ、明日はエンジン21126を搭載した輝かしいVAZ 2108車に取り付けられます。
しかし、私たちは皆、お金のためだけでなく、それほど多くのことをしなかったことを知っています。 あなたが何かを作成したとき、それはとても素晴らしいですし、それでも動作します!
UPD:アーカイブは無料のファイルホスティングサービスに投稿されたため、突然死にました。 habrastorageにアーカイブを保存するために、ダイヤルなしでタコメーターの写真に組み込みました(記事の上部にあります)。 一般に、jpgを保存して、winrarを開く必要があります。 拡張子をzipに変更することもできます。
UPD2:回路とボードが再設計され、写真が更新され、アーカイブはまだ写真に残っています。
UPD3アーカイブは写真に挿入されなくなりました。 ここにPMを書くか、私を見つけてくださいvk.com/trotskyi
じゃあね!
車でデバイスを確認する
顧客は非常に満足しています!
そして、この記事と、ボード製造プロセス自体の写真を含むすべての情報源を見たとき、彼は彼の脳が吹き飛ばされたと言った!