● 実験テーマ27
「PIC24Hによる、2現象オシロの実験」
(電子工作の部屋の表紙にある、初期作のPIC24Hオシロを、2現象に改造)
■ 2013.2.9
・元々これも、後閑氏HPに載っていたテーマである。
後閑氏のハードは、2CH分アナログアンプが用意されていたが、ソフトは、1CH対応のみで
公開されていたので、当所、2CHの内、1CH分のアナログアンプは省いて実装しなかった。
しかし将来実験しようと思って、その分のスペースは、それなりに空けておいた。
・今回、その分を実装し、4CH同時サンプルADCの手法を把握する目的で実験しようと思う。
・MPUは、「PIC24HJ12GP202」(28pinDIP)
・とりあえず、追加部品を手配してハードを追加実装し
実験環境を整えるところからやろう!!
・まずは、水魚堂で2現象オシロとしての図面をおこそうと思う。
・簡単にオリジナルとの相違点を言うと、以下の通りである。
@ 入力に電圧レンジ切替用の、ATT基板(アッテネータ)と電圧バッファ+それ用の負電圧
DC/DCを追加した。
A AC/DCカップリングの切替を付けた。
(実験なので、簡易的に、直流カット用コンデンサの有無のみでの切替にした。)
B オリジナルの時間軸レンジ
0.2msec/div, 0.5msec/div, 1.0msec/div, 2.0msec/div
に以下を追加した。
5.0msec/div, 10msec/div, 50msec/div, 500msec/div
C バックライトONを追加した。
■ 2013.2.13
・水魚堂で2現象オシロの回路図を作成した。
回路図はこちらからどうぞ→ 「PIC_2現象オシロ実験回路図」
・追加部品を手配する。
■ 2013.2.14
・ソフト検討に入る。
@ 現在のソフトは単チャンネルオシロ
トリガ入力含めた、2CH自動スキャン方式/バッファを8個の2分割で使用
A 2現象オシロの場合は、4CH同時サンプルになる予定
・部品が届いた。
■ 2013.2.19
・追加部品実装が完了した。
■ 2013.2.20
・CH追加改造後の、アナログアンプ部のチェックを行う。
(1) 電源ショートチェック
AVCC⇔AGND/ -AVCC⇔AGND間がショートしていないことを確認した。
(2) 電源電圧チェック(GLCD、追加OP AMP実装時)
@ IC3-8pin(AVCC) 対 IC3-4pin(AGND)間
+2.87V
A IC2-4pin(-AVCC) 対 IC3-4pin(AGND)間
-3.16V
(3) 1kHzサイン波入力でのアナログアンプ動作確認
ATT x1(0.3Vp-p入力で、3Vp-pFS)/ ATT x0.1(3.0Vp-p入力で、3.0Vp-pFS)にて
正常動作を確認した。
■ 2013.2.21
・ソフト検討続行の前に
WIN7マシンに、MPLAB C30をインストールし、WIN7上でもC30コンパイラが使えるようにする。
現時点での最新バージョンは、V3.31
無償評価版の、「MPLAB C30 Evaluation Version」をインストール
・再びソフト検討
<実験用仕様整理>
@ 表示: 2CH表示固定(CH1:AN0、CH2:AN1)
A トリガCH(AN2): CH1基準固定
B サンプル・モード: 4CH同時サンプルモード使用
PIC24H内蔵の、10bitADモジュールを使用するので
4CH同時サンプルモードを使用するしかない。
(同時設定できるのは、2CHと、4CHのみで、3CHは無い。)
■ 2013.2.22
・4CH同時サンプルにする、ADCの設定を考える。(ADの設定はレジスタがいっぱいあるので大変だなあ〜)
次のような設定が必要になる。
@ AD1CON1<3>の、同時サンプルビット(SIMSAM)を、'1'にする。
('0'にすると、逐次サンプルになる。)
A AD1CON<9:8>の、チャンネル選択ビット(CHPS<1:0>)を、'10'(10進で、2)に設定
B 4CH同時サンプルの場合、4つのS/H(サンプル・ホールドCH0〜CH3)を同時に使用することに
なるので、入力スキャン設定は必要ない。
つまり、次のような設定になる。
AD1CSSL(5:0)の、入力スキャン選択ビット(CSS<5:0>を、'000000'に設定
C 入力CHと、S/Hチャンネルの接続対応を、次のように設定
AD1CHS123= 0x0000;に設定し、AN0→S/H_CH1/ AN1→ S/H_CH2/
AN2→ S/H_CH3にする。
AD1CHS0= 0x0003;に設定し、AN3→S/H_CH0にする。
D 4CH同時サンプルの場合は、1回のサンプルで4CH分の同時サンプル終了後、4CH分の変換が完了
する毎にAD割込みを発生させるので、次のような設定になる。
AD1CON2<2:5>の、割込み当たりのサンプル/変換回数選択ビット(SMPI<3:0>)を、'0000'に設定
■ 2013.2.23
・ここで、ADC結果を格納するバッファ(BUF)について考察してみた。
@ BUF書込みモードは、AD1CON2の、BUFMビットを、'1'にした場合
ADC結果は、
下位グループ:ADC1BUF0〜 ADC1BUF7 と、
上位グループ:ADC1BUF8〜 ADC1BUFF に分割される。
そして、ADC割込みが発生する度に、8ワードBUFのどちらか一方に交互に書込まれる。
A そのBUF書込み状態は、AD1CON2の、BUFSステータスビットをチェックすればよい。
→ BUFS=0の場合は、下位グループに書込んでいるので上位グループから変換結果を
読出すようにする。
BUFS=1の場合は、上位グループに書込んでいるので下位グループから変換結果を
読出すようにする。
・上記を元に、4CH同時サンプルの場合の、入力チャンネルと、格納BUFの関係をさらに考察してみた。
以下の通りと考える。
ADC1BUF0または、ADC1BUF8← AN3(S/H_CH0)
(このCHはDSW(ディップスイッチ)のデジタル入力なので何もしない。)
ADC1BUF1または、ADC1BUF9← AN0(S/H_CH1): オシロのCH1入力
ADC1BUF2または、ADC1BUFA← AN1(S/H_CH2): オシロのCH2入力
ADC1BUF3または、ADC1BUFB← AN2(S/H_CH3): オシロのトリガ電圧入力
■ 2013.2.25
・ソース作成一応終了(これから先の説明は、末尾に公開しているソースも参照してくださると解り易いと思います。)
・コンパイルは一発OK
・動作確認を行う。
→ 動作全くダメ・・・
両チャンネル3Vレンジで、入力0Vにすると、OFFSETポテンショで輝線が上下に移動するはずであるが
輝線がノイズのような、でたらめな表示になる??
→ ソース中で、おかしな書き方(単チャンネルの時のままの書き方)をしている箇所を発見
それは、ADC割込み関数での、BUFポインタの扱いであるが
Index++のまま、Buffer1[]、Buffer2[]に適応してしまっていた。
これだと、ADC結果の格納先が
1回目の割込み:Buffer1[0]、Buffer2[1]
2回目の割込み:Buffer1[2]、Buffer2[3]
になってしまう。
※ 4CH同時サンプルの場合、
1回目の割込み: Buffer1[0]← ADC1BUF1又は、ADC1BUF9
Buffer1[0]← ADC1BUF2又は、ADC1BUFA
POT← ADC1BUF3又は、 ADC1BUFB
でよいはずなので、
イニシャルで、index= 0;として
if分のところでは、単に、格納先を、
Buffer1[index]
Buffer2[index]
POT
として、その後、index++;
とすればよいはず。
・上記の通り、ソースを修正したら、ノイズのような波形は出なくなった。
→ 両チャンネル0V入力で、各CHのオフセットポテンショを動かすと、対応CHの輝線が上下動することを
確認した。
また、1kHzサイン波を両チャンネルに同時に入力すると、正しく表示している。
トリガポテンショも効いている。
・ただ次の点が、おかしい。
@ DSW-3設定の時、2.0msec/divのはずが、5.0msec/div表示になる。
但し、波形の周期は、2.0msec/divで読める周期になっている。(時間軸レンジ表示の問題)
■ 2013.2.26
・昨日のレンジ表示問題の原因は単純ミスであった。
→ AxisDraw関数内の、case 3:の、break;が何故か抜けていた。
→ 修正でOKを確認した。
■ 2013.2.27
・大方動き出したので、今日はいくつか波形取りをしてみた。
・ここで気が付いた事がある。
→ それは、最少時間軸レンジ:0.2mS/div(サンプル周期:4uS)では、正しい周期で波形表示してくれない。
この理由については明日に先送りして、今日はとにかく波形サンプルを取ることにした。(0.2mS/div以外)
■ 2013.2.28
・0.2mS/divレンジ(サンプル周期:4uS)がダメな理由考察
→ この理由を解く鍵は、総AD変換時間の設定が、どうなっているかを知ることである。
→ 10bitADCの変換時間は、次式で示される。
Tconv= 12 x Tad (Tad:ADCクロック周期)
ここで、Tad=
Tcy x (ADCS + 1) // Tcy:システムサイクル/ ADCS:レジスタ設定値
= 25nS x (3 + 1)
= 100nS
∴ Tconv=
12 x 100nS = 1200mS= 1.2uS
よって、1CH当たり、1.2uSのAD変換時間になる。
今回は、4CH分変換するので、
トータル変換時間= 1.2uS x 4= 4.8uS
かかる。
一方、サンプル時間は、次のようになる。
Tsmp= SAMC<4:0> x Tad
= 2 x 100nS
= 200nS
よって、総AD変換時間= Tsmp + トータル変換時間
= 0.2uS + 4.8uS
= 5uS
の計算になる。
※ これは、0.2msec/divレンジのサンプル周期:4uSに対し、
総変換時間:5uS>4uSの関係になり、
変換が終わらない内に次のサンプルをしようとするため正しい周期で波形を表示できないことになる。
■ 2013.3.6
・0.2mS/divレンジ(サンプル周期:4uS)を何とかしたい。
ここで、PIC24Hの、ADモジュールの規格を、マイクロチップ社のマニュアルで注意深く確認して
みることにした。
以下に、主要規格を示した。
Tad(min)= 70nS (これは現在、100nS設定)
Tconv(typ)= 12 x Tad
tsmp(typ)= 1 x Tad (現在は、2xTadで設定しているが、サンプル時間は十分取らないと変換精度に直影響するので動かさない)
・Tad(min)=
70nSという規格値からすれば、Tad= 75nS設定にしても規格を満足するはずである。
→ AD1CON3= 0x0203;→ 0x0202;に変更して
Tad= 75nSの設定にしてみる。
→ このように修正すると、総AD変換時間=
0.15uS + ((12 x 75nS) x 4)= 3.75uS
になり、サンプル周期:4uSに対し、マージンは250nSとなり、何とかなりそうである。
※ この修正で、0.2mS/divレンジ(サンプル周期:4uS)でも、10kHzサイン波入力で、0.1mS周期を正しく
表示することが出来た。
※ 以下に、波形サンプル(2回目)を示す。
・これで、何とか単チャンネルオシロ並みの性能は出せたので、本件はこれでクローズすることにした。
※ 最終ソースファイルは、こちらからどうぞ→ Scope_2CH.c
← 実験テーマ1に戻る TOP PAGEに戻る 実験テーマ28へ →