NXP MCXA185を使って作業しており、LPADCを使ってP2_0/ADC0_A0に接続されたポテンショメーターを読み取っています。
私の現在の実装では以下を使用しています。
ADC0 / ADC0_A0
高解像度変換モード
LPADCハードウェアによる128サンプルの平均化
長時間のADCサンプリング時間(kLPADC_SampleTimeADCK19)
1ミリ秒ごと(1000Hz)にADCの読み取り値を取得
ソフトウェアトリガー変換
100サンプルのブロック平均
結果として得られる平均値は100ミリ秒ごとに更新されます。
つまり、ブロック平均に使われる各値は、ADCハードウェアによって128回の変換で平均化されているのです。
cmdConfig.conversionResolutionMode = kLPADC_ConversionResolutionHigh; cmdConfig.hardwareAverageMode = kLPADC_HardwareAverageCount128; cmdConfig.sampleChannelMode = kLPADC_SampleChannelSingleEndSideA; cmdConfig.sampleTimeMode = kLPADC_SampleTimeADCK19;
そして1ミリ秒ごとに:
LPADC_DoSoftwareTrigger(POT_LPADC_BASE,
(1U << POT_LPADC_TRIGGER_ID));
while (!LPADC_GetConvResult(POT_LPADC_BASE, &result))
{
/* Wait for conversion */
}
s_blockSum += result.convValue;
s_sampleCount++;
if (s_sampleCount >= 100U)
{
s_lastAverage =
(uint16_t)(s_blockSum / 100U);
s_blockSum = 0U;
s_sampleCount = 0U;
}これは安定したポテンショメータ値を得るための良い方法でしょうか、それとももっと優れたADCフィルタリング/平均化戦略があるでしょうか?
特に、以下の点について疑問に思っています。
ポテンショメーターとして 128カウントのハードウェア平均+100サンプルのソフトウェア 平均を使うのは過剰でしょうか?
これは実際に有用な追加のノイズ低減になれるのでしょうか?それとも単にレスポンスレイテンシを増やしているだけでしょうか?
16サンプルや32サンプルのような小さなハードウェア平均を使い、その後ソフトウェアフィルターを使う方が良いのでしょうか?
ポテンショメータの場合、 IIR/指数移動平均は100サンプルブロック平均よりも優れているでしょうか?なぜなら、IIR/指数移動平均の方が、つまみの動きに素早く反応しつつ、より滑らかな値が得られるからです。
kLPADC_SampleTimeADCK19は一般的なポテンショメータに適していますか、それとも別のサンプリング時間を使用すべきでしょうか?
安定性を向上させるために有効にすべき、MCXA185固有のLPADC設定はありますか?
1ms関数内でADCの結果をポーリングする方法は妥当な実装でしょうか、それともハードウェアタイマートリガーとADC FIFO/割り込み方式を組み合わせた方が望ましいでしょうか?
現在使用しているもの:
cfg.pullSelect = kPORT_PullDisable; cfg.driveStrength = kPORT_LowDriveStrength; cfg.passiveFilterEnable = true; cfg.inputBuffer = kPORT_InputBufferDisable;
ポテンショメータは電圧分圧器として接続され、ワイパーは P2_0/ADC0_A0に接続されています。
私が主に知りたいのは、以下の値です。
ポテンショメータが動いていないときは安定している
ポテンショメータを回すと反応する
過度の平均化による不必要な遅延がない
小さなADC/ワイパーノイズに耐性がある
現在の ハードウェア平均128+100サンプルブロック平均 のアプローチが適切かどうか、またこの用途にどのようなフィルタリング戦略を推奨するかについてフィードバックをいただけるとありがたいです。