PSoC5LP Prototyping Kit (34) --- アナログ LPF

高知工科大学 Advent Calendar 2015 の 12/25 の記事

「PSoC のコンポーネントを作ろう」

に PSoC5LP のアナログ RC LPF をコンポーネント化して利用する例が説明されていました。
RC LPF はアナログ・プリミティブとして定義されており、パラメタ設定の方法が用意されていません。 デフォルトの状態では、コンポーネント・カタログに現れず、その存在すら見えません。
上の記事にしたがって「Show Hidden Components」にチェックを入れるとコンポーネント・カタログから利用できるようになりました。
ここではコンポーネント化せず、プリミティブのまま配置し、外部から信号を入れて特性を見ることにしました。
トップの回路図を下に示します。

LPF は C が 5 pF または 10 pF、R が 約 200 kΩ または約 1 MΩ で構成されており、4 通りの組み合わせがあります。
時定数は 1 μs、2 μs、5 μs、10 μs、カットオフ周波数は 160 kHz、80 kHz、32 kHz、16 kHz の程度になります。
コンデンサ容量が 5 pF / 10 pF と小さく、外部に引き出すとストレー容量の影響が大きくなるので、内部の OP アンプでバッファしてからピンに出力しています。
入力側は反転型の PGA (Programmable Gain Amp) を使っています。 反転型にしたのは、内部の基準電源で動作バイアスを与えることができ、外部でバイアスを与える必要がないからです。
PGA 入力ピンに PC のオーディオ出力を接続し、WaveGene でユーザ波形として TSP (Time Stretched Pulse) 波を再生して入力します。
バッファ出力は PC のオーディオ入力に接続し、WaveSpectra で周波数特性を観測します。
「main.c」の内容を示します。

#include <project.h>

void LPF0_SetValue(uint8_t crsel)
{  
  static const uint8_t CRSEL_MASK = 0x30;
    
  crsel <<= 4;
  crsel &=  CRSEL_MASK;
  crsel |=  (~CRSEL_MASK & CY_GET_REG8(LPF0__CR0));
  CY_SET_REG8(LPF0__CR0, crsel);
} // void LPF0_SetValue()

int main()
{
  LPF0_SetValue(3);
  PGA_Inv0_Start();
  OPA0_Start();
  CyGlobalIntEnable; /* Uncomment this line to enable global interrupts. */
  for(;;)
  {
  }
} // int main()

コンポーネント化して _Start() 関数で初期化する代わりに、LPF0_SetValue() 関数を定義して、任意のタイミングで R/C 値の選択ができるようにしました。
録音/再生のサンプリング周波数を 192 kHz として観測した結果を下に示します。
C = 5 pF、R = 200 kΩ、fc = 160 kHz の場合です。

サンプリング周波数 192 kHz なので、観測できる範囲は 96 kHz までです。
カットオフ周波数 160 kHz なら、あまり減衰はないはずですが、かなり減衰しているのは、LPF 以外の要素であるチップ内部のアナログ・バスの容量や、外部のケーブルの容量などの影響によるものと思われます。
次は、C = 10 pF、R = 200 kΩ、fc = 80 kHz の場合です。

カットオフ 160 kHz の場合と比べて高域の減衰が少し大きくなっていることが分かります。
次は、C = 5 pF、R = 1 MΩ、fc = 32 kHz の場合です。

カットオフ周波数 20 kHz 台の特性に見えます。
次は、C = 10 pF、R = 1 MΩ、fc = 16 kHz の場合です。

カットオフ周波数 10 kHz 程度の特性に見えます。