最初に思いついたのは、外部ADCを購入してコントローラーにねじ込むことでした。 しかし、別のデバイスに対処する時間も欲求もありませんでした。 私は別の方法を試してみることにしましたが、その性能については確信がありませんでしたが、それでも回路は非常に機能し、8ビットのオーダーの精度を与えました(おそらく、チェックしませんでした)。
実際には、コントローラのデジタル入力がコンデンサの放電率を測定するという考え方です。 コンデンサは低抵抗を介して電源電圧まで充電され、その後時間レポートが開始され、ポテンショメータを介してコンデンサが放電されます。 コンデンサの電圧が1.4V(コントローラの入力をローに切り替える電圧)に下がると、入力の論理レベルの値が切り替わり、時間レポートが停止します。 結果の放電時間は、ポテンショメータの電流抵抗に比例します。
デバイス図:
A0、A1-MKレッグ、デジタルポートA
コンデンサが充電される電圧がポテンショメータの現在の位置に依存しないように、回路内のトランジスタが使用されます。
計算スキーム。
良好な測定精度を確保するには、ポテンショメータの極端な位置での放電時間が約1桁異なるように回路要素を選択する必要があります。 一般に、大きければ大きいほど良いですが、すべてに礼拝堂があります。
抵抗器を介したコンデンサの放電時間の公式(wikiから):
最大抵抗で0.02秒、最小抵抗で0.002秒の時間で5V(VU)から1.4V(ポートを論理0に切り替えるレベル)まで放電時間を確保するようにRとCを選択する必要があります。 さらに、Cの値はどちらの場合も一定であり、Rは50 kOhm(ポテンショメーター値)異なります。 時間は、精度、マイクロコントローラーの速度の理由から選択され、抵抗とコンデンサの利用可能な値に最も厳密に一致するように選択されました。 (コントローラーは8 MHzの周波数で動作します)
連立方程式を解いて、抵抗R13とコンデンサC1の値を決定します。
ここでは、コントローラー入力の内部抵抗は考慮されていませんが、コントローラーの速度により、プログラムで回路を構成し、放電時間を範囲0..255に移行するための係数を選択することができました。
R12はコンデンサの充電に使用され、小さくする必要があります。R14は可能な電流でトランジスタの飽和モードを提供する必要があります。
回路の要素の値の最終的な選択:
R12 = 220オーム;
R13 = 6.8kΩ;
R14 = 1kΩ;
R 15 = 0..50kΩ;
C1 = 1 uF。
コンデンサを充電するには、トランジスタをオフにし、レッグA0を高レベル出力(DDRA = 3、PORTA = 1)に設定します。 また、コンデンサを充電するのに十分長い時間遅延が発生します。 次に、A0が入力状態に切り替わり、トランジスタが開きます(DDRA = 2、PORTA = 2)。 コンデンサは放電を開始し、放電時間は空のサイクルで監視されます。
以下は、放電率の測定に関係する関数の実際のコードです。
uint8_t readADC() { // DDRA = 2; PORTA = 2; int i = 0, t = 0; while (PINA & 1){ t++; if (t == 43) i++, t = 0; // 43 } PORTA = 1; // DDRA = 3; // , // , // i -= 40; // if (i < 0) i = 0; // if (i > 255) i = 255; return i; }
回路はうまく機能し、8ビットのリムーバブルは安定しています。 おそらく、より短い時間でパラメーターを再カウントすることで回路を高速化できますが、この制限は入力寄生入力容量とコントローラーの動作時間です。
私はそれをテストしていませんが、放電時間を10〜20倍短縮することは可能だと思いますが、これは結果の精度に影響を与えません。