忍者ブログ
ようこそ!JQ2RVNのブログです。 PICを使っていろいろな物を作ろうと画策中です。
[34] [33] [32] [31] [30] [29] [28] [27] [26] [25] [24]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

dsPICでADCのコーディングをしてて、ドつぼにはまった。


dsPICは結果を保存するバッファが16ある。
自動的に複数のチャンネルをスキャンしたり、
一定時間ごとに何点かの値が取得できて便利なんだけど・・・
データの入り方でハマった。

今回は4つサンプルを採って、それをFIR & Decimationしようとしていた。
ここで何も考えず、InputSignal[i]=ReadADC12(i);としてしまった。
FIRDecimate()関数に渡す配列は、添え字が大きい方が古いデータとなる。
つまり、InputSign[0]が最新で、InputSign[3]が最古である。
しかし、ADCのバッファは、ADCBUF0が最古でADCBUF3が最新。

したがって、上のように配列に転送すると、新旧が逆転する。
これじゃ、正常にデータが出てくるわけがない!

結局Cで作っても良かったが、アセンブラを組んで新旧がそろうようにした。



次のハマり。
MPLAB SIMで、ADCの入力をシミュレートしていた時の話・・・
Excelでデータを作ったが、ここが曲者である。

DSPとの親和性を考え、ADCの数値は固定小数点で入るように設定した。
そして、単純にExcelでも固定小数点に変換して出力した。
しかし、Excelから出した値と、ADCのバッファに入っている値が違っている。

ということで、気がついた。
入力する値は、ADCモジュールそのものが得た値でなければならないことを。

ADCが12ビットの場合、次のような流れで処理される。

ADCモジュール →4ビット左シフト → +0x8000 → ADCBUFx

たとえば、モジュールから1が出力されたら、
0x0001 → 0x0010 → 0x8010 と変換される。

なので用意するデータは・・・
=INT(2048*x+2048)
とExcelで行っておくだけでよい。
PR

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


忍者ブログ [PR]
カレンダー
11 2024/12 01
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
プロフィール
コールサイン:
JQ2RVN
性別:
男性
自己紹介:
PICの開発を勉強中です。
目標はPICTNCの高性能版を作ること。
まずは、本家を解析しています。
最新コメント
[04/23 Eolande]
[04/16 太田和巳(JF2UJG)]
[09/10 je7ifp]
[08/06 JQ2RVN]
[08/03 OVC]
最新トラックバック
バーコード
ブログ内検索
アクセス解析