• 締切済み

ATmega128のアナログ変換(ADC)の使用について

ATmega128のアナログ変換(ADC)の使用について ATmega128(L)を外部クロック8MHzで使用しています。 AREFは0.1μFのコンデンサを通してGNDに接続 AVCCは3.3V(VCC)に接続しています。 電圧は、CPUのそれぞれのPINでオシロで測定 内部基準電圧(2.56V)で、AD変換させようとしていますが、 例えば、外部に何も接続されていないADC0(オシロで見て一応0V)のアナログ入力のチャネルを 単独変換動作、A/D変換割り込みなしで読もうとしていますが、3ff(10bitとして使用) の値が返ってきます。期待は0 ADC0の信号(CPUピン)をみると、ADMUXにデータを書いた際、約1Vまで電圧が上がり、 徐々に0Vに収束していくのが観測できます。(A) 開発言語はGCCです。 ADCの初期化は下記のとおり  ADCSRA  ADENを1に(A/D許可)  ADIE 0 (A/D割り込み禁止)  ADPS2-0 6 AD変換クロック(CK/64)  ADMUX   REFS0,1を1に(内部基準電圧使用) ADLARを0にしています。 AD変換のデータ読み込み処理  ADMUX = ((ADMUX & 0b11000000) + i) (今は固定でi = 0にしています) ---- (B)  ADCSRA |= (1<<ADSC); (変換スタート)  while(ADCSRA & 0b01000000); (ADSCが落ちるのをまつ)  data = ((ADCL) | ((ADCH)<<8)); これでdataが3ffとなります。 (A)の現象は、(B)を実行した際、観測できます。 ((B)をコメントにすると起こらないので推定) 半田不良含め、ハードなのか、ソフトなのか?? AREFのピン(CPUの62)を測定すると2.56Vくらいあります。 どなたか、教えてください。 よろしくお願いします。

みんなの回答

  • P0O9I
  • ベストアンサー率32% (693/2146)
回答No.1

一般的な話ですが、ADコンバータの入力をオープンにして、読み出しデータが0になるわけありません。オシロを接続して、0Vであっても、それはオシロ・プローブの10MΩの入力抵抗が入っての電圧です。オープンでは浮遊電圧の何Vがかかっているのか、分かりません。 GNDにつないで測定をしてみましょう。

hirorin1209
質問者

補足

説明がわかり難くすみません。 オシロスコープで、AD変換を行わなければ(正確にはADMUXに値を設定しなければ) 0Vで読めています。(ADCのコネクタオープンでも) (GND側は、AD対象のGND、ATmelのAGND、オシロのGNDを1点で共通にとっています。) ADMUXというレジスタに基準電圧を設定すると、電圧が1V付近まで一瞬で立ち上がり、 コンデンサが放電されるように、徐々に0Vへ近づいてきます。 この電圧が1V付近まで一旦上がるのが何故かと思っています。 0Vの電圧を与えると、0V付近の値0~2の値が読めます(10bit分解能) すみません、よろしくお願いします。

関連するQ&A

  • ATmega168でリアルタイムにADC

    WinAVRとATmega168でAD変換をしようとしているのですが、リアルタイムに後進されません。ソースは #include <avr/io.h> int main(){ DDRB = 0xff; DDRC = 0x00; ADCSRA = 0b10000000; ADMUX = 0b00000001; while(1){ ADCSRA |= 0x40; while(ADCSRA & 0x40); PORTB = ADCL; ADCSRA = 0x00; } return 0; } というプログラムです。最初の一回はPORTBの値が変わって変換らしきことをしていることは確認できたのですが、その後に電圧を与えてみても変化がありません。電源を切ってから電圧を変えて又電源をつけると値が変わっています。一回で終了ではなくてリアルタイムに変換するためにはどこら辺をどうすれば良いのかアドバイスください。 よろしくお願いします。

  • ADCのADCカウントは何Cなのか?

    現在、以下のADCについて調べております。 http://www.analog.com/jp/analog-to-digital-converters/ad-converters/ad9220/products/product.html 私の理解では、このADCは5V(±2.5V)もしくは2V(±1V)の幅を12bitで表せるので、LSBは1.2mVもしくは0.49mVになるものと思われます。 この時、入力信号の電圧値ではなく電荷の値を知りたいのですが、どの様に考えて計算すれば良いのかが分かりません。つまり、ADCの1カウントが何Cに相当するのかを知りたいのです(単位で言うと、[C/count])。しかし、データシートを見ても、私には分かりません。 自分なりに計算してみたのですが、明らかにおかしくて困っております。 どなたか分かる方いらっしゃいましたら、ご指導の程よろしくお願いします。

  • ADCと電圧の関係

    AD変換器(ADC)と電圧の関係について調べています。 直列回路で電圧が上がるとAD変換機の値が上がるようなんですが これはなぜでしょうか?? また、電圧の数値の変化とAD変換器の数値の変化は比例の関係であると 考えてよいのでしょうか?? よろしくお願いします。

  • ADコンバータ(ADC08351)のデジタルの出力波形について

    現在、ADコンバータ(ADC08351)を用いて、周波数500KHzの基準電圧が0VでVp-p=1.5Vの信号を、ADC08351を用いてAD変換したいと考えております。 仕様は以下のとおりです。 Vin=Vp-p=1.5V(基準電圧0V) Vref=2V /OE=0V(つまり常にHigh状態) CLK=2MHz(V=3.3V) VA=VD=3.3V AGND=DGND=0V この仕様でAD変換を行った結果、上手くAD変換することができませんでした。 クロック信号は2MHzとそこまで大きくはないので、ノイズはほとんどでておりません。(Vp-p=60mVくらい) 上手くいっていない具体的な説明ですが、D6(最上位ビットから3番目)の波形が、入力信号が下がっているところで、立ち上がっています。これは、ディレイによるものかとも考えたのですが、D7の信号波形はこのD6の波形をインバータを通したような波形になっています(つまりD6の信号が"1"のときはD7の信号は"0")。この結果正しい波形はでていないと判断しました。また、LSBのほうは明らかにデジタル出力波形はおかしく、正しく復調できていないとすぐに気づくようなものになっています。 また、入力信号をADコンバータの入力へ入れる前に、何か増幅器を通して、矩形波(パルス波)のような波形にした後に入力すれば間違いなく復調できるかと考えているのですがどうでしょうか? ただ、その場合入力信号が電源電圧まで増幅されてしまうのではないかという欠点はあると思うのですが。 どこが上手くいっていないのか詳しく説明できていないとは思いますが、どなたか分かる方いましたらアドバイスのほうよろしくお願いします。

  • AD変換器(ADC08351)について

    現在、周波数2MHzの基準電圧が0VでVp-p=1Vの信号を、ADC08351を用いてAD変換したいと考えております。ただ、AD変換器について理解が不足しており、データシートを見てもよく分かりません。そこで、みなさんに私の仕様を確かめてもらいたいと思っています。 Vin=Vp-p=1V(基準電圧0V) Vref=1V /OE=0V(つまり常にHigh状態) CLK=48MHz(V=3.3V) VA=VD=3.3V AGND=DGND=0V とPIN接続を行おうと思います。これでよろしいでしょうか? ちなみに、よく分からない点として、アナログ信号入力は0.5Vp-p~0.68VAとなっているのですが、これはVA=3.3Vの場合、0.68VA=2.24Vとなり、Vp-p=0.5V~2.24Vという理解でよろしいのでしょうか?

  • PIC16F88のAN4のアナログ/デジタル変換について教えてください

    PIC16F88のAN4のアナログ/デジタル変換について教えてください? PIC16F88にて以下のピンアサインでCCS社のCコンパイラで作成しました。AN2の温度AN3の湿度は正常にLCDに表示するのですがAN4の電圧がAN3の湿度の変化に追従してくるんです。ピンアサインが間違っているのか、PIC16F88に制限があるのか英語の説明書見てもチンプンかんぷんで。どなたかよろしくご教授お願いします。(現在AN4の電圧測定はオープン状態で0.245V 湿度計を触ると0.443vに変化します) RB7(13ピン) LCD DB7(14ピン) RB6(12ピン) LCD DB6(13ピン) RB5(11ピン) LCD DB5(12ピン) RB4(10ピン) LCD DB4(11ピン) RB2(8ピン) LCD RS (4ピン) RB3(9ピン) LCD STB (6ピン) LCD R/W(5ピン)→GND LCD VSS(1ピン)→GND ****LCDタイプによりVSSとVDDが逆**** LCD VDD(2ピン)→+5V ****LCDタイプによりVSSとVDDが逆**** RA2(1ピン)AN2 LMC662CN 温度電圧入力 RA3(2ピン)AN3 LMC662CN 湿度電圧入力 RA4(3ピン)AN4 電圧測定 RA0(17ピン) 右SW(B_sw) MAX and MIN クリア RA1(18ピン) 左SW (A_sw) MAX and MIN and 電圧 表示 関係ありそうなプログラム抜粋 #include <16f88.h> #fuses HS,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT, #device ADC=10          //アナログ/デジタル変換10ビットモード #use delay(clock=4000000) //4Mzクロック #use fast_io(b) //ポートB出力設定 途中省略 set_adc_channel(2); //A/D変換チャンネル設定 delay_us(116); //変換にかかる時間96μs+19.72μs ondo = read_adc(); //A/D変換レジスタリードしondoへ ondo = (ondo * 50.0) / 1024; //ondo値を実数に変換 途中省略 set_adc_channel(3); //A/D変換チャンネル設定 delay_us(116); //変換にかかる時間96μs+19.72μs shitsudo = read_adc(); //A/D変換レジスタリードしshitsudoへ shitsudo = (shitsudo * 100.0) / 1024; //shitsudo値を実数に変換 途中省略 set_adc_channel(4); //A/D変換チャンネル設定 delay_us(116); //変換にかかる時間96μs+19.72μs+α v = read_adc(); //A/D変換レジスタリードしvへ v = (v * 0.5) / 1024; //v値を実数に変換 途中省略 main() { ////////////////////////温度計湿度計電圧計の設定/////////////////// setup_adc_ports(sAN2 | sAN3 | sAN4 | VSS_VDD); //アナログポート設定 setup_adc(ADC_CLOCK_DIV_32); //アナログ変換クロック設定

  • 現在H8/3694Fのマイコンを使っていてKXM52-1050という加

    現在H8/3694Fのマイコンを使っていてKXM52-1050という加速度センサから 加速度の電圧値を読み取ろうとしているんですがどうしてもX、Y、Z軸の値が 正常に出ません誰か助けてください。製作環境Gccで製作しています。 ソースはメインプログラムだけですが載せておきます。 void main(void) // メインルーチン { int sw; // swの状態を格納するための変数定義 long k; // A/D変換の変数定義 long ad,sei,syou; // A/D変換の値(整数部,小数部)を格納する変数の定義 long ad1,sei1,syou1; long ad2,sei2,syou2; unsigned long ad_data[3]; // A/D変換結果を格納する配列変数を定義 sw = 0; // swの初期化 set_adc(); // H8 A/Dコンバータを設定する init_lcd(); // LCDをイニシャライズする AD.ADCSR.BIT.ADST = 1; // A/D変換開始 //タクトスイッチが押されるまで、待機 while(1){ while(!AD.ADCSR.BIT.ADF); // 変換終了待ち ad_data[0] = (unsigned long)AD.ADDRA >> 6; // AN0 A/D変換結果を変数(ad_data[0])に格納 ad_data[1] = (unsigned long)AD.ADDRB >> 6; // AN1 A/D変換結果を変数(ad_data[1])に格納 ad_data[2] = (unsigned long)AD.ADDRC >> 6; // AN2 A/D変換結果を変数(ad_data[2])に格納 AD.ADCSR.BIT.ADF = 0; // 変換終了フラグをクリア for( k=0; k<=1; k++){ sw = IO.PDRB.BIT.B7; // swにsw14の状態を格納する ad = (unsigned long) ad_data[0]; // 0~5[V]=0~1023でA/D変換値を取得 sei = ad * 5 / 1023; // 電圧値の整数部1桁 syou = (ad * 5 - sei * 1023) * 100L / 1023; // 電圧値の小数部2桁 for( k=1; k<=2; k++){ ad1 = (unsigned long) ad_data[1]; // 0~5[V]=0~1023でA/D変換値を取得 sei1 = ad1 * 5 / 1023; // 電圧値の整数部1桁 syou1 = (ad1 * 5 - sei1 * 1023) * 100L / 1023; // 電圧値の小数部2桁 for( k=2; k<=3; k++){ ad2 = (unsigned long) ad_data[2]; // 0~5[V]=0~1023でA/D変換値を取得 sei2 = ad2 * 5

  • PICのA/D変換の入力が何故か0Vになってしまいます・・・

    現在、PIC12f675を用いて下記のようなことをしたいと検討しているのですが、 中々思った通りに動いてくれません。 どなたか分かる方がいらっっしゃいましたらアドバイスお願い出来ないでしょうか? 「開発環境」 ・CCSのCコンパイラを使用 ・PICは12f675 「内容」 アナログ入力端子に任意の電圧を加えて、RS232CでPC上にその電圧を表示する。 現在、アナログ入力端子(AN0)に電源電圧から分圧して0.5Vや1Vなどの電圧を加えているのですが、 何故か入力端子の電圧をテスターで測定すると0Vとなり、PC上でもやはり0Vと表示されてしまいます。 何故、任意の電圧を加えても全て0Vとなってしまうのかが分かりません。 おそらくプログラム上でのミスがあると思うのですが・・・ 検討中のプログラムを下記に書きます。 ***************************************************** ///// 初期設定 ///// #include <12f675.h> #device ADC=10 #fuses INTRC_IO, NOWDT, PUT, NOPROTECT, BROWNOUT /////RS232C使用宣言///// #use delay(CLOCK = 4000000) #use rs232(BAUD = 9600, XMIT = PIN_A2, RCV = PIN_A1) //GP1=受信 GP2=送信 //// メイン関数 void main() { // A/D初期設定 float data; setup_adc_ports(AN0_ANALOG); //AN0をアナログ設定 setup_adc(ADC_CLOCK_INTERNAL); //ADCのクロック設定(内部発振) set_tris_a(0); output_A(0); while(1) { set_adc_channel(0); delay_us(50); data = read_adc(); data = (data * 3.0) / 1024; printf("電圧 = %1.3fV\r\n",data); } } ***************************************************** 申し訳ありませんが、アドバイスお願いします。

  • ADC0808でA/D変換器を製作

    ADC0808でA/D変換器を作り、それをH8マイコンボードに繋げ制御するのですが、ADC0808のSTRAT,ALE,EOCに何を入力(出力)すればいいか全く分かりません。また制御する際のプログラムも教えていただけると有り難いです。それではよろしくお願いします!

  • ADコンバータ(ADC08351)のクロック入力ピンについて

    周波数500KHzでVp-p=1Vの交流信号を、ADC08351を用いてAD変換したいと考えております。仕様は以下のとおりです。 Vin=Vp-p=1V(基準電圧0V) Vref=3.3V /OE=0V(つまり常にHigh状態) CLK=8MHz VA=VD=3.3V AGND=DGND=0V これで、回路構成をデータシート(ADC08351)の13ページのようにしました。入力信号の部分は多少違うのですが、まずボルテージフォロアを通し出力抵抗を下げ、その後、コンデンサ(0.1uF)を通して直流成分をカットしておりますので、まず大丈夫だと考えております。デジタル電源とアナログ電源の間のチョークコイルは470uHのものを使用しております。パスコンの値はデータシートのとおりです。個人的には、これで万全だと思ったのですが、結果、上手く復調できませんでした。 その理由として、クロック信号の入力部分となるのですが、これはクロック発振器(Vp-p=3Vほどの周波数8MHz生成)から直接わに口クリップで入力ピンにつないでおります。すると、発振器の部分をオシロスコープで測定するとVp-p=3Vほどの周波数8MHzのクロック信号が確かに出ているのですが、わに口クリップの先であるクロック信号入力ピンの部分をオシロスコープで測定すると、Vp-p=300mVほどの周波数8MHzに減衰しております。つまり、わに口クリップの両端で信号の波形が変わっております。これが原因で復調が出来ないのですが、どうすればよろしいのでしょうか? わに口クリップを使用しているのがいけないのでしょうか? もし、そうだとした場合どのように対処すればよろしいのでしょうか? どなたか分かる方がいれば教えていただけると幸いです。

専門家に質問してみよう