2015年3月12日木曜日

PSoC 4 Pioneer Kit DDSの波形生成とADCの同時利用

PSoC 4内蔵のIDACを使ってのDDS波形生成と入力デバイスのテストがうまくいったので
両方合わせてテストしてみた



自作した可変電源のテストみたいに高圧ではないので配線はわりと気楽(^q^/

Arduino Unoほどタフではないと思うが、PSoC 4 Pioneer Kitも多少誤接続しても簡単には壊れない

気を許しすぎると危ないと思うが(^q^;

PSoC 4 Prototyping Kitの方は電源回りに保護回路が入っていないので
ラフな扱いをしたらたぶんすぐ壊れると思う(安いけど)

LCD表示とコントローラーの入力値が一発でうまくいったので喜んでたら
肝心の出力波形がグダグダ(^q^;;;


フィルターを通す前のPSoCのIDACの出力波形からグダグダ波形なのと
周波数が336.1Hzと低下していることから目星をつけた。

ADCの割込みと波形生成の割込みが干渉している

波形生成のISRは48,000Hzで呼び出される
ADCのISRはSAR ADCのConvert処理が終了するたびに呼び出される

ADCの処理が長引いて波形生成の割込みが48,000Hzで行われていないんだろう

PSoC 4 Pioneer Kitのシステムクロックは初期状態では24MHzだ
(設定で48MHzまで上げられる)

ARMベースだと思って油断してたがシステムクロックはArduino Uno(16MHz)の2倍もない

ADCの設定をいじってできるだけ処理時間が短くなるようにして
何とか1kHz付近の波形が出るようにしたが


理屈で考えて波形生成のクロックとADCのコンバート処理のタイミングが重なると波形が揺らぐ

ジッターの強烈なやつだ

面白いと言えば面白いのかもしれないが(^q^;

対応策

入力系はPollingで処理する

波形生成以外の割込みは使わない。
ぴゅんぴゅん2号(Arduino版のピュンピュンマシン)でもこの方法でやった

ADCの処理が終わるまでWaitしていても割込みがかかればそっちに処理が流れるので
遅延は起こらない

CPUで処理しているのでクロック単位の誤差はどうしても出るので
デジタル回路で処理しているオーディオインターフェイスみたいに
めちゃくちゃ正確とは言えないが、まあまあ正確に波形をを出せるだろう

割込みではなくPollingでのADCとDebouncerのテストが必要

Exampleがないかもしれないで真面目にやらないとダメっぽい

DebouncerコンポーネントはDATASHEETを見てみるとUDB(PSoCのデジタルブロック:PLDみたいなやつ)で実装されているみたいだ

UDBをいじることになると、まだ全然使ってないので深みにはまっていく可能性がある(^q^;

多重割込みをかける

ADCの割込みの優先度を上げて、他の割込みは多重割込みさせる

入力系の割込みの処理時間を十分小さくできればいけるかなと思ったが

う~ん

やっぱ、ちょっとでも遅延すると危ないな

Pollingがうまくいかないときの次善策として保留

今日は時間がないので続きは次回

0 件のコメント:

コメントを投稿