説明
このアプリケーションノートでは、フレデリック電解チルトセンサから角度位置の測定値を得るための最小限のハードウェアとソフトウェアの要件について説明します。
基本設計とセンサ励磁
図1は、電解式傾斜センサを用いて機能する傾斜測定ユニットを作成するために必要な主要な構成要素を示す図である。
後述するように、センサーには直流電流を流さないようにすることが重要です。そのため、テキサス・インスツルメンツ社のLMC6482のような入力インピーダンスの高いオペアンプを使用することをお勧めします。これにより、グランドへのリーク電流が制限され、センサへの直流電流が制限されます。図2に1軸電解傾斜センサの等価回路を示します。
センサーの励磁信号について説明します。励磁信号はマイクロプロセッサから供給されますが、最も単純なケースは単軸センサです。単軸センサーは、センサーの外側のピンに接続されたマイクロプロセッサの2つの出力ポートを必要とします。これらのポートは、50%のデューティサイクルと200~1000ヘルツの間の周期でトグルされます。図3を参照してください。
センサー励起信号の非対称性を防ぐために、50%のデューティサイクルを維持するためには、ソフトウェアでの正確なタイミングが必要です。図4を参照してください。非対称性とは、センサへの直流電流がドリフトを引き起こし、最終的にはセンサに永久的かつ不可逆的なダメージを与えることと定義されています。これは化学的に説明することができ、直流電流は電気分解を引き起こし、最終的にはセンサを不活性化させます。
ここでは、CCS PCW Cコンパイラを使って、PIC18Fマイクロプロセッサ用のソフトウェアで励起信号を作成するプロセスを見てみましょう。これらの命令は、あなたのマイクロプロセッサやコンパイラによって大きく異なります。まず、どのピンを出力に使うかを定義します。出力にはPORTBを使うので、そのように定義する必要がある。これはTRISBと呼ばれる8ビットのデータ方向レジスタを設定することで実現します。TRISBのビットを0に設定すると、対応するPORTBピンが出力として定義されるので、次の行のコードを使用して、すべてのPORTBピンを出力に使用します。
set_tris_b(0b00000000); |
PORTBピンの値を素早く変更するためには、メモリ内でアクセスする必要があります。このマイクロプロセッサでは、PORTBはメモリ・アドレス0xf81にある特殊機能レジスタ(SFR)です。そのため、簡単にアクセスできるようにPORTBの位置を変数に格納します。これは次の行のコードで実現します。
#バイト port_b = 0xf81. |
port_bの各ビットはチップ上のピンに対応しています。最も重要なビットはB8ピンで、最も重要でないビットはB0ピンです。ここでは、ピンB0とB1に1軸センサーが接続されているとします。図3を参照してください。2 軸センサを使用している場合、ピン B0, B1, B2, B3 に接続されているとします。
単軸センサの場合、励磁信号には2つの状態があります。図4を参照してください。このタイミング図を模倣するには、2 つの状態を 8 ビットの数値の配列に格納します。これは以下の行のコードで実現します。
int8 output_arr[2] = { 0b00000010, 0b00000001 }; |
2 軸センサーの場合、励磁信号には 4 つの状態があります。図5を参照してください。このタイミング図を模倣するには、4 つの状態を 8 ビットの数値の配列に格納します。これは以下の行のコードで実現します。
int8 output_arr[4] = { 0b00000011, 0b00001100, 0b00001010, 0b00000101 }; |
タイマーは、ソフトウェアで正確な間隔で割り込みを発生させるための一般的なツールであり、簡単に励磁信号を発生させるために使用することができます。励磁信号が50%のデューティサイクルを維持するように、優先度の高い割り込みを使用することが重要です。以下のコードは、二軸センサの励磁信号を生成するためにポートを切り替える高優先度割り込みを作成します。
int isr_counter = 0; #int_timer1 HIGH void timer1_isr(void) { set_timer1(64535); port_b = output_arr[ (isr_counter++) % 4]; // this is for a dual axis sensor } |
この例では、timer1は16ビット(0~65535)のカウンタです。つまり、set_timer()で設定した値からカウントアップし、オーバーフロー(65535 に達する)すると割り込みが発生し、 timer1_isr()関数内のコードが実行されます。オーバーフローするまでの時間は、マイクロプロセッサのクロック速度や timer1 の設定パラメータなど様々な要因によって定義されます。センサを適切に励振するためには、割り込み時間を 1~5 ミリ秒の間で維持することが重要です。この情報については、各マイクロプロセッサのマニュアルを参照してください。
ポートのトグルはモジュラス関数を使用して動作します。割り込みが発生するたびに isr_counter がインクリメントされ、モジュラス 4 が実行されます。これは基本的に0から3までカウントするカウンタを作り、割り込みが発生するたびにインクリメントします。これは励磁信号を構成する output_arr に格納されている 4 つの状態のそれぞれにアクセスします。
センサ出力
励磁信号を作成したので、センサの出力を調べてみましょう。出力は励磁電圧を参照したアナログ電圧です。出力は励振信号と同位相で読み取る必要があります。4つの状態(1軸センサの場合は2つの状態)のそれぞれの間に複数のサンプルを取ることをお勧めします。
図 6 の波形は、二軸センサの出力に接続されたアナログ/デジタル変換器からの出力例を示しています。この特定の出力は、x 軸と y 軸の両方で正の傾斜角を示します。負の傾斜角を示す出力については、図 7 を参照してください。
出力を読むためには、マイクロプロセッサのアナログ・デジタル変換器(ADC)を使用する必要があります。図 3 を見て、ピン A0 を ADC 入力として設定し、現在の ADC ポートをピン A0 に設定する必要があります。次に、次のコードを実行して、励磁信号と同位相の二軸センサーからの出力を読み取ることができます。
int samples = 0; int index = 0; int xpos[8], xneg[8], ypos[8], yneg[8] = {0,0,0,0,0,0,0,0}; while(true) { while( (isr_counter % 4) != 0 ); while( (isr_counter % 4) == 0 ) { // loop to read x positive state delay_us(100); if(index <= 7) xpos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 1 ); while( (isr_counter % 4) == 1 ) { // loop to read x negative state delay_us(100); if(index <= 7) xneg[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 2 ); while( (isr_counter % 4) == 2 ) { // loop to read y positive state delay_us(100); if(index <= 7) ypos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 3 ); while( (isr_counter % 4) == 3 ) { // loop to read y negative state delay_us(100); if(index <= 7) yneg[index] = Read_ADC(); index++; } index = 0; // data processing and analysis would then be done here } |
ご覧のように、励起信号の各状態では、サンプル間に 0.1 ms の遅延を与えて 8 つのサンプルを収集しています。これらのサンプルをデータ解析コードで平均化することで、より安定した正確な結果を得ることができます。isr_counterを参照することで、励起信号と同位相の測定値が得られることを確認することができます。
傾斜角度の導出
各励磁状態の電圧の差を比較することで、センサの傾斜角を導出することができる。
X軸の傾き=(X+)-(X-)である。
Y軸の傾き=(Y+)-(Y-)である。
例えば、16 ビット(0~65535 カウント)のアナログ/デジタル変換器で、±20°の二軸センサからの出力を読み取るとします。これは、上記の X 軸と Y 軸の傾きの定義を使用して、出力範囲が ±65535 カウントになることを意味します。以下の出力を1サイクルで見てみましょう。
X+ = 45535
X- = 20000
Y+ = 30000
Y- = 35535
そうすると、次のような結論になります。
X軸の傾き= +25535
Y軸の傾き=-5535
これを角度測定に変換するには
±65535カウント=131070カウントの範囲
±20° = 40°の範囲
131070カウント/40° = ~3277カウント/°
25535 カウント/(3277 カウント/°) = ~+7.79°×軸の傾き
-5535 カウント/(3277 カウント/°) = ~-1.69° y軸傾き
傾斜角度を求める際の機械的な考慮事項
すべてのセンサには機械的な公差があり、その動作仕様では、その全範囲の一部しか示されていないことがよくあります。さらに、上記の計算では、センサからの出力が直線的、対称的、かつ中央にあると仮定していますが、一般的にはそうではありません。したがって、真の傾斜位置を導き出すためには、アプリケーションで使用している特定のタイプのセンサを特徴づけることが重要です。
例えば、単軸±25°の電解センサを考えてみましょう。この傾斜センサの機械的機能を図8に示す。
今回はセンサからの出力を 12 ビット(0~4095 カウント)のアナログ/デジタル変換器で読み取るとします。つまり、先ほどのX軸の傾きの定義では、出力範囲は±4095カウントとなります。センサーを個別に特徴づけるためには、まず-25°に傾けて読み取る必要があります。ここでは、-25°の傾きで 1 サイクルの次の出力を見てみましょう。
X+ = 400
X- = 3700
25°でのX軸の傾き=400 - 3700 = -3300
その後、センサーを+25°まで傾けて、再度読み取ることになります。25°に傾けたときの1サイクルの出力を見てみましょう。
X+ = 3700
X- = 400
25°でのX軸の傾き = 3700-400 = 3300
そうすると、次のような計算ができます。
3300 - (-3300) = 6600カウント範囲
±25° = 50°の範囲
6600カウント/50°=132カウント/°
度あたりのカウント数を知ることで、アナログからデジタルへの変換器からの読み取り値を簡単に角度位置に変換することができます。直線性、対称性、ゼロ位置をさらに補正することで、角度計算の精度が大幅に向上します。
ソフトウェアに関する考察
すべてのソフトウェアと同様に、同じ目標を達成するための多くの異なる方法があります。本書では、特定のマイクロプロセッサとコンパイラを使用して電解傾斜センサの信号調整を実現する方法の一例を紹介しています。