MAXQ7667によるトランスデューサの診断
要約
このアプリケーションノートは、MAXQ7667スマートSoC (システムオンチップ)を使用して、超音波トランスデューサの共振周波数と減衰特性を診断する方法について説明します。テスト用のセットアップを説明して、データを提示します。ソフトウェアコードを提供します。
はじめに
このアプリケーションノートでは、MAXQ7667スマートSoC (システムオンチップ)を使用して超音波トランスデューサの共振周波数と減衰特性を定量化する方法を示します。これらの機能は、トランスデューサモジュールの診断、システム性能の最適化、および製造時における較正の補助に役立ちます。このアプリケーションノートは、すべてのシステムに効果のあることを意図した一般的な「ハウツー」文書ではありません。むしろ、特定のトランスデューサモデルおよび対象となる条件下におけるそのトランスデューサの性能に関する詳細な知識を前提としています。その情報があれば、以下で示すテストを大幅に合理化することが可能です。最後に、これらのテストでは、トランスデューサビーム内の反射物がすべてトランスデューサから1フィート以上離れていることを想定しています。
テスト用セットアップ
このアプリケーションノート中のデータは、すべてEV (評価)キットに含まれるMAXQ7667によって収集しました。データはEVキットのRS-232ポートを通してPCに転送し、Excelスプレッドシートを使用してグラフ化しました。使用したトランスデューサは、EVキットに付属する40kHzの400EP250です。このトランスデューサはボードに水平に実装されており、トランスデューサの性能に影響を与えるために異質材料を表面に付加する作業が容易でした。それぞれのテストには、通常の動作に相当するクリーンでドライなトランスデューサ、前面に水分が付着したトランスデューサ、および前面に少量の可塑性パテが付着したトランスデューサという、3種類のトランスデューサの条件を使用しました。
図1~3は、これらの条件の違いによってトランスデューサの特性が大幅に異なる結果になることを示しています。トランスデューサの前面に水分が付着していると、共振周波数が低下して減衰が減少します。パテにはその逆の効果があり、共振周波数が上昇して減衰が劇的に増大します。
減衰テスト
減衰テストでは、トランスデューサの共振が続く時間を測定します。これは、単一の短いパルスでトランスデューサを励起させ、トランスデューサの出力を監視してどのくらいの時間で信号が減衰するかを調べるという簡単なテストです。図1~3に、エコー受信経路を3種類の異なる周波数に設定した場合の減衰を示します。3つすべての図から、パテによって激しい減衰が生じることが容易に分かります。最後に、これらの図の間に見られる相違から、減衰の微妙な変化を調べる場合にはレシーバの周波数も重要であることが分かります。
これは簡単なテストであるため、2つ以上の周波数について容易に実施することができます。複数の周波数でテストを行う場合、励起パルスが比較的一定した幅に保たれるのが理想的です。一定時間続く単一の短い励起パルスを使用することによって、量の変化するエネルギーをトランスデューサに印加した場合、あるいはトランスデューサの共振周波数でポンピングを行った場合に生じる差が排除されます。
図1、2、および3では、LPF (ローパスフィルタ)の読取りを25µs間隔で行いました。トランスデューサの励起は、約6µs幅の単一パルスで行いました。単一の周波数のみを使用し、すでにPLLが希望の周波数になっている場合、このテストは3ms以内で実施可能であることに注意してください。各測定の間には、ピーク値を探して、信号がピーク信号に対して所定のパーセンテージまで減衰したことを検出するための十分な時間が存在します。2つ以上の周波数を使用する場合、追加測定を行うための時間を追加する必要があります。また、PLLが新しい周波数に安定するための時間も追加する必要があります。

図1. 中心周波数40kHzのフィルタを使用して測定した減衰

図2. 中心周波数35kHzのフィルタを使用して測定した減衰

図3. 中心周波数45kHzのフィルタを使用して測定した減衰
周波数スイープ
周波数スイープによってトランスデューサの共振周波数が特定されます。図4は、異質材料(3種類の異なるテスト条件)がトランスデューサの共振周波数に与える影響を明確に示しています。図4のデータを収集するに当たっては、レシーバの中心周波数を30kHzから50kHzまで400Hzステップでスイープさせたため、トランスデューサに51回パルスを加えることになりました。51の周波数のそれぞれについて、励起からLPFの出力の読取りまでの間には同じ時間的間隔を使用しました。この診断には、重要な注意事項があることに注意してください。励起とLPFの間に、適正な間隔を使用する必要があります。この間隔は、エコー受信経路が飽和から抜け出すことが可能なだけの十分な長さで、しかしトランスデューサがまだ強力な信号を生成しているように十分な短さであることが必要です。単一の固定の間隔では、すべての条件に対応することはできないと思われます。たとえば図2において、トランスデューサにパテが付着している場合は、通常のトランスデューサならまだ飽和から抜け出してもいない内に、明らかに信号が完全に減衰してしまいます。この変動幅があるため、励起からLPF測定までの時間は動的に変更可能である必要があります。幸い、減衰テスト(後述)によって適正な時間を容易に決定することができます。
図4のデータ(すなわち、LPFのデータカウント)を収集するために、最初に3種類の周波数で減衰テストを実施して、励起から信号がピーク値の半分に減衰するまでの時間的間隔を保存します。その後、3回のテストの中で最も長かった時間的間隔を、周波数スイープテストの時間的間隔として使用します。このプロセスによって、任意のトランスデューサの条件に対応しつつ良好な信号を生成可能な時間的間隔が決定されます。

図4. 3つのトランスデューサ条件の周波数スイープ
ここで簡潔に概要をまとめておきます。励起から測定までの時間的間隔を決定するためには、周波数のスイープを行う前に少なくとも1回の減衰テストが必要になります。その後の周波数スイープテストには、減衰テストよりも大幅に長い時間がかかります。周波数を多数の値に変化させ、周波数が安定してからトランスデューサを励起させて該当する測定値を取得する必要があります。この場合、テスト全体に約650msかかりました。より余裕の少ない周波数セトリング時間の使用、テストする周波数値の削減、および減衰テストの回数削減によって、テスト時間を短縮することが可能です。これらの変更によってトランスデューサに関する情報の精度が低下する可能性がありますが、その場合でもアプリケーションにとって十分な情報であることが考えられます。
図4のデータは、比較的広いトランスデューサの共振帯域を示しています。この帯域幅は、トランスデューサの性能よりも、MAXQ7667のバンドパスフィルタの帯域幅によって密接に関連しています。それでもなお、このテストはトランスデューサの中心周波数の特定に役立ちます。
テスト条件の簡略化
このアプリケーションノートに掲載されたグラフは、設計者が解釈するのは容易ですが、自動的に診断を行うのはかなり面倒です。プロセスを簡略化するため、このデータを少数の数値にまとめて、テーブルに格納したリファレンス値と比較することができます。リファレンス値は、温度をインデックスにすることも可能です。温度は、SAR ADCとサーミスタを使用することによって容易に取得可能です。
図4のデータは、あとで示すコード(付録A)を使用して取得したものです。このコードは、トランスデューサの条件の決定に使用することができる3つのデータも提供します。それらの値は、次の通りです。
- 共振周波数における減衰テスト中のLPFのピーク値
- 減衰時間、すなわち励起から信号がピーク値の半分に減衰するまでの時間
- 中心周波数または共振周波数。この値はPLLの設定として表され、下限のPLL設定(信号がピーク信号の70%)と上限のPLL設定(信号がピーク信号の70%)の平均になります。70%という値の使用は任意に決定したものです。
表1. トランスデューサの各条件の概要データ
| ピークLPF計測値(カウント) | 減衰時間(µs) | 中心周波数(PLL) | |
| ドライ | 24477 | 1394 | 290 |
| ウェット | 24740 | 1435 | 150 |
| パテ | 15854 | 0323 | 430 |
IAR™コンパイラ2.12A用の完全なソフトウェアプロジェクトをダウンロードすることができます。PCのCOM1をEVキットのRS-232ポートに接続すれば、Transducer_Calibrate_115k2.exeというPCプログラムを使用して、周波数に対する共振曲線および共振周波数の評価値を表示可能です(図5)。

画像の拡大(PDF、325kB)
図5. 出力グラフ例
付録A. ソフトウェア例
// This routine measures the transducer damping at the specified frequency (PLLfreq).
// The system timer is used to measure when the LPF output (LPFD) has dropped to 1/2 the peak value.
// This is the settling time that will be used later when doing the frequency sweep.
unsigned damping_half_time (unsigned PLLfreq, unsigned pulse_width)
{
unsigned short i;
unsigned short peak = 0;
unsigned short half_peak = 0;
unsigned short temp = 0;
SCNT_bit.STIME = 0; // Make sure system timer is off.
STIM = 0; // Clear the system timer.
SCNT_bit.STDIV = 4; // Set system timer prescale divider to 16 (1µs per cycle).
PLLF_bit.PLLF = PLLfreq; // Set the PLL frequency.
BPH = pulse_width; // Pulse width = BPH/(receive frequency * 400) when BDIV = 0xC.
usWaitTimer2(10000); // Let the PLL settle for 10ms.
SCNT_bit.STIME = 1; // Start the system timer.
BPH_bit .BSTT = 1; // Send a burst.
usWaitTimer2(50); // Wait for LPF to partially settle.
RunTimer0_us(20); // Start timer # 1 with a reload time of every 20µs.
for (i = 0; i < 200; i++)
{
temp = LPFD; // Read the output of the lowpass filter.
if (temp > 0x2000 && temp > peak) {peak = temp;} // Save the peak value if it is greater than 2000.
if (temp < peak/2 && half_peak == 0) // If LPFD is less than half the peak value and the half peak time
{ // has not been set, then
half_peak = STIM; // save the time it took to reach half the peak value.
i = 101; // Half peak found so exit the loop.
}
while (T2CNB0_bit.TF2 == 0) {} // Wait for timer # 0.
T2CNB0_bit.TF2 = 0; // Clear flag.
}
T2CNA0_bit.TR2 = 0; // Stop timer # 0.
return half_peak;
}
void main()
{
unsigned short i = 0;
unsigned short peak = 0;
unsigned short first70 = 0;
unsigned short second70 = 0;
unsigned short center_pllf;
unsigned short wait2measure;
unsigned short halfpeak;
init();
// ***********************************************************************************************************
// ***********************************************************************************************************
// Configuration settings
echo_receive_gain(0); // Set receiver to minimum gain (allowed values 0-31)
Burst_Clock_Divider = 400; // for calculating the burst-frequency in PC-Application.
burst_setup(BURST_CLK_PLL, BURST_PULSE_1, BURST_DIV_400, 0, PLL_CLOCK_16MHZ, 0);
step_size=10; // Sets the step-size (steps go from 0 to 511).
// END configuration settings.
// ***********************************************************************************************************
// ***********************************************************************************************************
while(1)
{
// Use the "damping_half_time" routine to measure the time in µs that it takes for the
// ringing to drop to half of the peak value. Do this at more than one frequency so that
// one of the frequencies will be within range of the transducer.
wait2measure = damping_half_time(128, 88); //Measure damping time at 35kHz.
halfpeak = damping_half_time(256, 101); //Measure damping time at 40kHz.
if (wait2measure < halfpeak) {wait2measure = halfpeak;} // Save the longest time.
halfpeak = damping_half_time(384, 113); //Measure damping time at 45kHz.
if (wait2measure < halfpeak) {wait2measure = halfpeak;} // Save the longest time.
// Repeatedly pulse the transducer with a constant width pulse while sweeping the receiver
// frequency. Use the half-time value from the damping test (wait2measure) for the interval
// between pulse transmission and reading LPFD (lowpass filter data).
PLLF_bit.PLLF = 0; // Start the sweep at 30kHz.
BPH = 77; // Pulse ~6.3µs. This value is easy to maintain over frequency.
peak = 0;
number_of_steps = 0;
do // Sweep from 30kHz to 50kHz with step_size * 39.062500kHz.
{
usWaitTimer2(5000); // Wait 5ms for the frequency to settle.
STIM = 0; // Reset the system timer. It controls the Pulse to LPF read time.
BPH_bit .BSTT = 1; // Send burst.
while(STIM < wait2measure) {} // Wait the specified amount of time for the ringing to dampen.
lpfdata[number_of_steps]= LPFD; // Store the LPF reading.
if(lpfdata[number_of_steps]> peak) {peak = lpfdata[number_of_steps];} //Save the peak value.
number_of_steps++;
PLLF_bit.PLLF = number_of_steps * step_size; // Increase the frequency.
BPH = 77 + number_of_steps; // Increase the duty cycle to maintain pulse width.
} while (PLLF < 512-step_size);
// Find the center frequency based on the average of the two frequencies that have a
// LPFD reading that is 70% of the peak reading.
for (i = 0; i < number_of_steps; i++)
{
if (lpfdata[i] > peak*0.7)
{
first70 = i;
i = number_of_steps;
}
}
for (i = number_of_steps; i >0; i--)
{
if (lpfdata[i] > peak*0.7)
{
second70 = i;
i= 1;
}
}
i = (first70 + second70)/2; // i = the loop value at the center frequency.
center_pllf = i*step_size; // Set PLLF_bit.PLLF to this value for the resonant frequency.
//Remeasure damping using the center frequency.
damp_time = damping_half_time(center_pllf, 75);
// At this point there are three valuable pieces of information about the transducer.
// Peak = the peak value from the frequency sweep.
// center_pllf = the PLLF setting at the resonant frequency.
// damp_time = time for the resonance to decay to 1/2 the peak value.
center_burst_frequency = 16000000/Burst_Clock_Divider*(center_pllf+768)/1024;
SendData();
} // While(1)
} // End Main