PROFILEdsPIC33Fの10bit-ADコンバータで1Msps今回はdsPIC33Fの10bit-ADコンバータを試します。dsPIC33FJ12GP202のデータシートによれば10bitの場合、1.1Mspsとなっていますが、以前、PIC24Fで試したところ、スペック通りのサンプリング周波数は実現できなかったので、自作オシロの目標スペックである1チャンネル1Msps、2チャンネル500Kspsが可能かを検証しました。v3.02を使用しました。実験ボードの回路図きとんとサンプリングできているかを確認するために、SoftOscillo2で発生させた正弦波を見ることにしました。デモボードをトラ技付録のOPアンプ実験ボードと接続し、交流を1.65V(3.3Vの半分)シフトさせています。図中のVinにSoftOscillo2で生成した正弦波を入力するようにしました。回路図に間違いがあったため、修正しました。OPアンプが負帰還ではなく正帰還になっていました。上図には描かれていませんが、7.3728MHzの水晶発振子が接続されており、dsPIC33FのPLL回路により命令サイクル周波数を設定しています。dsPIC33Fの10bit-ADコンバータは4チャンネル同時にサンプリング可能で、スペック上は1チャンネルあたり1.1Msps(※spsはサンプリング/秒)と高速なサンプリングが可能です。10bit-ADコンバータのプログラム12bit-ADコンバータのページでも書いたように、dsPIC33FはPLL倍率がいろいろと設定可能です。水晶発振子の周波数をFinとすると、PLLありでの周波数Foscは次のようになります。N2)ここで、MはPLL倍率、N1はPLLプリスケーラー、N2はPLLポストスケーラです。デモボードの水晶発振子Finは7.3728MHzです。スペックではFoscは80MHz以下でなければなりません。結論から言うと、Foscが80Mhzでは、1Mspsは達成できませんでした。そのため、次のプログラムのように、幾つか周波数を変更して動かしてみました。N2=2#defineマクロOVERCLOCKが0の場合Fcy=39.6288MHz、1の場合Fcy=42.3936MHz、2の場合Fcy=45.1584MHzとなります。-1の場合、Fcy=30.4128MHzです。一つだけ低い周波数を選んだのは、後述する「ADコンバータのクロック周期」Tadを最小値65nsecに設定できるちょうどいい周波数だからです。ADコンバータの設定は次のようなプログラムになります。1チャンネルだけをサンプリングする場合、AN5をCH0に接続し、2チャンネルの場合はAN0もCH1に接続するようにしました。ADコンバータの割り込み(ADC割り込み)は4回のサンプリングで発生するようにしました。ADC_CH0_POS_SAMPLEA_AN5;ACコンバータのクロック周期Tadと命令サイクルTcyには次の関係があります。1)ここで、ADCSはADxCON3レジスタにある変換クロック設定ビットです。dsPIC33FJ12GP202のデータシートによると、10bitモードの場合、Tadは65nsec以上必要です。=25.2nsecであり、ADCSは2以上を設定する必要があります。66.3nsecとなります。Fcy=30.4128MHzの場合、ADCSは1以上でとなるため、Tadは65.8nsecとなります。ADコンバータはタイマー3をトリガーにAD変換するようにしており、10bitモードの場合、12Tadで変換が完了します。その後、自動でサンプリングが行われ、またタイマー3割り込みによりAD変換が行われます。14*Tadとなります。10bitのモードの場合、このサンプル時間が2Tad以上必要です。結局、タイマー3の周期は14Tad以上必要となります。今回はタイマー3の周期を1チャンネルでは1μsec(1Msps)、2チャンネルでは2μsec(500Ksps)に設定しています。そのため、Fcy=39.6288MHzの場合、14Tadが1μsecを超えるため、不可となりますが、それ以外はなんとか実現可能なはずです。プログラムでは、タイマー1の周期を250msec、タイマー3の周期を1μsec(2チャンネルの場合は2μsec)として、割り込みがかかるようにしています。1μsec)倍になっていれば、1Mspsが達成できています。2μsec)倍になっていれば、500Kspsが達成できています。Fcyを変えた場合のタイマー1やタイマー3の各設定は、下記プログラムを見ていただければ、分かると思います。処理が間に合わないため。4;#endif}上記プログラムを動かし、タイマー1用、タイマー3用、ADコンバータ用のカウント変数を見ると、次のような結果になりました。500Kspsを実現するには、Tadが65nsecに近いFcy=45.1584MHzか30.4128MHzで動かす必要がありそうです。Fcy=30.4128MHzの場合、タイマー3の割り込みをONにしたり、ADコンバータの割り込み(ADC割り込み)を毎サンプリングで起きるようにすると、タイマー1の割り込みが動かなくなります。そのため、Fcyを落とした分、かなりぎりぎりで動いているようです。Fcy=45.1584MHzで動かした場合でも、毎サンプルごとのADC割り込みではぎりぎり間に合っていないようです。Fcy=45.1584MHz、30.4128MHzで動かした場合の、シリアル端末での表示は次のようになります。どちらの周波数でも、1チャンネルの場合は約1000nsec周期で、2チャンネルの場合は約2000nsec周期でサンプリングできています。1Mspsでサンプリングした波形Fcy=45.1584MHzの設定で、周波数5KHzの正弦波を1Mspsでサンプリングした時の波形は次のようになりました。グラフの横軸目盛りは50μsecであり、4目盛り(200μsec)で一周期になっていることが分かります。このグラフ表示アプリは、自作オシロ用に作成中のPCプログラムです。1チャンネルしか対応しておらず、UIも未完成ですが、完成したら自作オシロページで紹介したいと思います。