|
Sigma-Delta A/D変換 状態:この文書は現在翻訳中です 原文: 翻訳者:caskaz 対象読者:A/D変換したい人 抜粋 †P8X32Aの任意のCogで2本のI/Oピンと安価な受動素子を使ってSigma-Delta A/D変換を実現します。 前文 †Propellerの8個のCogはそれぞれが2つの多機能カウンターモジュールを内蔵しており、このモジュールは外部に幾つかの受動素子をつけることによってSigma-Delta技術を使ったA/D変換を設定できます。 原理 †アナログ回路を設計する人なら図1のような反転オペアンプをよく知ってると思います。 さてオペアンプの代わりにCMOSのDフリップフロップに高い周波数のクロックを入力します。(図2) PropellerのSigma-deltaアプリケーション †カウンターレジスタ †PropellerはSigma-Delta A/D変換を簡単に実現するためのハードウェア(Cogのカウンタとsystem conter register,CNT)を持っています。 PHSxレジスタは入力ピンのレベルがHiの間FRQxレジスタの値が加えられその値をクロック毎に積算します。 ハードウェア †配置 †ソフトウェア手順 †カウンターをSigna-delta動作させるために以下の手順でセットアップします。 intervalのクロック数の間にPHSxの値が増加する。この増加分は入力電圧(オフセットも含む)に比例する。 CON
INP_PIN = 8
FB_PIN = 9
ADC_INTERVAL = 512 'サンプリング時間=512 X 12.5nsec
DAT
org 0
adc_cog mov frqa,#1 'frqaに1をセット
movi ctra,#%0_01001_000 'ctraモードをpositive w/feedbackにセット
movd ctra,#FB_PIN 'ディストネーションフィールドに出力ピンをセット
movs ctra,#INP_PIN 'ソースフィールドに入力ピンをセット
mov dira,fb_mask 'feedback pinを出力でマスク
mov result_addr,par '@valueをresult_addrに保存
'spinコードで@value(valueアドレス)をparにセット
main_loop call #adc 'A/D変換スタート
wrlong acc,result_addr '変換結果をHubRAMに保存
jmp #main_loop '次のA/D変換
adc move time,cnt '現在のcntをtimeにコピー
add time,#16 '少し先の時間(16クロック)をtimeにセット
waitcnt time,interval 'timeまで待機してtimeがsystemcounterと等しくなったらtimeにintervalを加算してtimeに格納する。そのあと次の命令を実行
neg acc,phsa '現在のphsaの負数を取得
waitcnt time,#0 'timeまで待機
add acc,phsa '現在のphsaにacc(A/D変換スタート時のphsaの負数)を加算
adc_ret ret
fb_mask long 1 << FB_PIN 'feedback pinをマスク
result_addr long 0-0
interval long ADC_INTERVAL
acc res 1 'General-purpose accumulator.
time res 1 'Time variable use for waitcnt.
セットアップが完了したらmain_loopはadcをくり返しコールしてA/D変換結果を予め設定したHubRam?に書きこむ。cognewによってCogが起動された時、parレジスタはこの位置を示している。 cognew(@adc_cog, @value) offsetの大きさと結果に対するスケールはintervalで使われる数に比例する。intervalの数量はA/D変換の確度を決定する。8bitsは256,9bitsは512,10bits以上も同様である。 校正 †応用例 †多入力 †交流信号の変換 † |