• ベストアンサー

AD変換精度に関して。

組み込み系の質問なんですが、 マイコンの特性として、 ・10ビットAD変換の精度が±3LSB ・8ビットAD変換の精度が±1LSB のマイコンがあったとします。 このとき、10ビットAD変換を行い、その結果をシフトして、 上位8ビットで取り出すと、このときのAD変換精度は ・8ビットAD変換の精度が±0LSB と同じ考えとなるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.2

「・10ビットAD変換の精度が±3LSB ・8ビットAD変換の精度が "±2LSB"」 の10bitADを使って、上位8bitだけ使うと 「・8ビットAD変換の精度が"±1LSB" 」 になるでしょう。 (ただし、こういうCPUにしようとすると、10bitADとは別に8bitAD用の回路を用意する必要が出るので、メリットが少ないように思います。 ・10ビットAD変換の精度が±3LSB ・8ビットAD変換の精度が±1LSB だと、10bit(誤差3LSB)の回路を用意して、8bitADはその一部を使う(結果として、10bitADの上位8bitだけを使うのと等価)ということができますが。)

その他の回答 (1)

  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.1

8bit±1LSBになります。 数値の境にあたる部分で揺らぎの影響が必ずでますので、 ±1LSBはかならずついて回ります。 たとえば、10bitの真値が 0000000010 の値を8bitで見ると 00000000 ですが、これに10bitADで+3LSBの誤差が入ると 0000000101 になって、上位8bitをとると 00000001 になります。

sima06029
質問者

補足

ご回答ありがとうございます。 理解できました。では、 マイコンの特性として、 ・10ビットAD変換の精度が±3LSB ・8ビットAD変換の精度が "±2LSB" のマイコンがあったとします。 このとき、10ビットAD変換を行い、その結果をシフトして、 上位8ビットで取り出すと、このときのAD変換精度は ・8ビットAD変換の精度が"±1LSB" と同じ考えとなるのでしょうか?

関連するQ&A

  • AD変換のLSB(量子化単位)の求め方。

    AD変換のLSB(量子化単位)を求める式について質問があります。 8ビット分解能の場合、LSBの計算式は以下の式になるようですが、  LSB = Vref/256 (※Vref:リファレンス電圧) なぜ"256"で割るのか分かりません・・ 次のように"255"ではないんでしょうか。  LSB = Vref/255 例えば 8ビット分解能、Vref=255Vの場合、次のようなAD変換結果に なると思います。  0V = 00000000b  1V = 00000001b  2V = 00000010b    :  254V = 11111110b  255V = 11111111b この場合、LSBは1Vではないでしょうか。 となると、  LSB = Vref/x の計算式より  x = Vref/LSB = 255V/1 = 255 となり "255"で割ることが正しいのではないんでしょうか??

  • AD変換した結果を出力する方法は?

    H8マイコンを利用してAD変換し、その結果をパソコンの画面に出力したいのですが何をすればいいのかわかりません。出力の形は整理しやすい形で出力したいと考えています。テキスト形式などは可能でしょうか? プログラムは二つの入力(AN0とAN1)をスキャンしながらAD変換します。 最後に AD.CSR.BIT.ADST = 0; /* A/Dコンバータを止める*/ adhenkan[0] = ADDRA; /*AN0の結果をadhenkan[0]に格納する*/ adhenkan[1] = ADDRB; /*AN1の結果をadhenkan[2]に格納する*/ AD.CSR.BIT.ADF = 0; } AD変換したデータをadhenkan[1],adhenkan[2]に格納した後にどうすればいいのかわかりません。

  • PICでのAD変換について

    PIC16F873を使って、入力信号のAD変換をして、基準値との差により、PWM信号を生成しようとしています。 変換結果の上位8bitがADRESHレジスタに格納されるということなのですが、PWMの周波数を確保するため、できればこの8bitの値をを7bitに落としたいと考えています。 何か方法があれば教えてください。

  • AD変換

    H8/3664でのAD変換についての質問なのですが、このマイコンだと通常8つあるAD変換をスキャンモードで1度で4つまでしか処理できないのですが グループ0のAN0とグループ1のAN4が同一レジスタで結果が格納されていると思われますが この二つを1度に処理したいのですが、どのようなプログラムにすればいいのですか? AD変換あたりのプログラムを抜粋したので、後半のAD.ADDRB をAN4のAD.ADDRAに変えた場合のプログラムを教えて下さい char aflag=0; //割り込みフラグ void main(void) { char carray0[20],carray1[20],carray2[20]; long ad_data_0,ad_data_1,arrey0,arrey1,ad0,ad1,t,G_data,A_data,hensa_now,hensa_mae,A_out_put; int i; timervset(); timeraset(); IO.PDR5.BYTE = 0xff; // ポート7の出力設定をあらかじめ1に設定 IO.PCR7 = 0x00; // ポート7を全て入力ポートに設定(タクトSW1,SW2,SW3) IO.PCR5 = 0xff; // ポート5を全て出力ポートに設定 IO.PCR1 = 0xa0; // ポート1のP15,P17を出力ポートに Init_rs(); //通信の初期化 AD.ADDRA=0; AD.ADDRB=0; AD.ADDRC=0; AD.ADDRD=0; //AD変換設定 //A/Dコンバータ設定 AD.ADCSR.BYTE = 0x33; // (0011 0011)*/ // スキャンモード,高速変換(70ステート),入力端子:AN0~AN3 set_imask_ccr(0); //割り込み可 while(1) { if(aflag==1){ aflag=0; ad_data_0=AD.ADDRA >> 6; // 「>>」:シフト演算子(ビットを右に6ずらす) ad0=ad_data_0*5000/1024; LToStr(G_data,carray0);//グローブ角度表示 rs_puts("ch.0="); rs_puts(carray0); rs_crlf(); wait(1); G_data=(ad0-2333)*(-0.0426);//グローブ角度 ad_data_1=AD.ADDRB >> 6; // 「>>」:シフト演算子(ビットを右に6ずらす) ad1=ad_data_1*5000/1024; LToStr(A_data,carray1);//アーム角度表示 rs_puts("ch.1="); rs_puts(carray1); rs_crlf(); wait(1);

  • AD変換の用語

    AD変換について調べていまして、あるサイトに、1デジタル単位に相当するアナログ量を量子化単位と称し、 LSBは慣習的にAD変換の量子化単位(digit)と同義に使用される、と書いてありました。 ここでいうデジタル単位や量子化単位とはどういうものなのでしょうか?色々と調べてみましたがよく分かりませんでした。 ご存知の方いましたらご教示下さい。

  • AD変換器の参考図書

    マイコン初心者です。 AD変換器+マイコンで使用したいです。 データブックから,概略の動きは分かるのですが,いざ使うとなると何から手をつけたものか・・・。 参考になる書籍とかありましたら教えてください。 (Analog Devices AD7708)

  • dsPIC で 12ビットAD変換・・・

    dsPICで12ビットAD変換を行い,int型の変数に代入してそれをUARTでPCに送信したところ,入力電圧をあげていくごとに0~255が繰り返し出てきました.PCへ送る際は12ビットのデータを上位と下位に分けて送信するか,文字列にして送るかしないとだめなのでしょうか? どなたかよろしくお願いします.

  • AD・DA変換について

    いつもお世話になっております。 今回も皆さんのお力を借りたいと思います。。。 今回はAD・DA変換器について実験しました。 4bitDA変換と8bitDA変換と8bitAD変換をしました。 そこでなんですが・・・ (1)この三つの精度、変換速度、分解能はどんなものなのでしょうか?? (2)このほかには、AD,DA変換の方式はどのようなものがあるのでしょうか。 よろしくお願いします(>_<)

  • h8マイコンで AD変換ができなくて困っています

    マイコンでAD変換をしようと思っています>< #include<3048.h> void ioinit(); void adinit(); int i; int ADDRA; main() { ioinit(); adinit(); while(1){ AD.ADCSR.BIT.ADST = 1; // A/D変換スタート while(AD.ADCSR.BIT.ADF==1); // A/D変換終了まで待つ int i = ADDRA; // レジスタに格納された値をiとする if (i>=0xA5){ // 電圧が6.5vより高くなった場合 P5.DR.BYTE = 0x01; } else if (i<=0x19){ // 電圧が1vより小さくなった場合 P5.DR.BYTE = 0x02; } else if (0x19<=i<=0xA5){ // それ以外の電圧だった場合 P5.DR.BYTE = 0x03; } AD.ADCSR.BIT.ADF=0; //フラグクリア } } // I/OポートDDR設定 void ioinit() { P5.DDR=0xff; } // A/D変換設定 void adinit() { AD.ADCSR.BYTE = 0x33; } このプログラムでAD変換がまったくできません><電圧を変えていくことでP5につながっているLEDで変換結果を見たいと思っています。ADDRAのプログラムあたりがおかしいと思っています;;ちなみにポート7に電圧計とつなげています。その電圧値を変えていくことで結果を見ようとしています。0xA5は6.5Vのときの反応だから回路も分圧させたものにして10Vまでの対応にしました><どこがおかしいのか教えていただけるとてもうれしいです><助けてください;;

  • H8/3664FのAD変換について

    初めまして。 現在大学でH8/3664FでのAD変換を行っているのですが、 AD変換とその値に対する出力への動作が上手くいきません。 分かる方、ご教授お願いいたします。 現状は、1.7V程度の信号をADコンバータ端子(AN1)に入力しています。 AD変換を行い、条件として1V以上のときは出力に設定した 端子(P11)から5V出力しダイオードを光らせようと思っています。 プログラムは以下のように組んでいます。 おかしいところがあればご指摘お願いします。 void main(void){ IO.PMR1.BYTE=0x00; /* ポート1入出力ポート*/ IO.PCR1=0xff; /* ポート1出力*/ /*AD変換の初期設定*/ AD.CSR.BIT.ADST=0; /*AD変換機能停止*/ AD.CSR.BIT.SCAN=1; /*スキャンモード*/ AD.CSR.BIT.CKS=1; /*高速変換*/ TW.TCRW.BIT.CCLR=1; /* TCNTがGRAでクリア */ TW.TCRW.BIT.CKS=3; /* クロックφ/8 */ TW.GRA=40000; /* パルスの周期20ミリ秒 */ TW.TMRW.BIT.CTS=1; /* カウントスタート */ while(1){ /* 20ミリ秒間のカウントは約8880となる. */ if(TW.TSRW.BIT.IMFA==1){ TW.TSRW.BIT.IMFA=0; AD.CSR.BIT.ADST=1; /*AD変換機能開始*/ while(AD.CSR.BIT.ADF==0){}; /*AD変換終了待ち*/ AD.CSR.BIT.ADF=0; /*変換終了フラグクリア*/ AD.CSR.BIT.ADST=0; /*AD変換機能停止*/ x0=(int)(AD.DRA>>6); /*x0に値を格納*/ if(x0>100){/*1V以上の場合*/ IO.PDR1.BIT.B2=1; }else{ IO.PDR1.BIT.B2=0; }