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以上も同様である。 校正 †応用例 †多入力 †交流信号の変換 † |