PICのA/D変換で入力が0Vになる理由とは?

このQ&Aのポイント
  • PIC12f675を使用し、アナログ入力端子に任意の電圧を加えてPC上に表示するプログラムを作成していますが、入力端子の電圧がテスターで測定すると0Vになってしまいます。
  • プログラムの初期設定やA/D変換の処理を確認しましたが、入力端子の電圧が正常に読み取られず、PC上でも0Vと表示されてしまいます。
  • 何故入力端子の電圧が0Vになってしまうのか理由が分からず困っています。プログラム上のミスかもしれませんが、アドバイスをお願いします。
回答を見る
  • ベストアンサー

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); } } ***************************************************** 申し訳ありませんが、アドバイスお願いします。

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

  • ベストアンサー
  • pipipi523
  • ベストアンサー率40% (148/365)
回答No.1

アナログ入力しようとしているポートが出力になっていると思います たぶん、 set_tris_a(0); を set_tris_a(1); にするとOKになるような気がします ※使ったことが無いのでset_tris_aが正しいかどうかは解りません

関連するQ&A

  • PIC16F88のA/D変換の時間設定について質問です。最近PICを始

    PIC16F88のA/D変換の時間設定について質問です。最近PICを始めたばかりの素人です、色々な書籍を読みあさりC言語でプログラミングしていますが、PIC16F88のA/D変換を利用しステッピングモータの回転数を制御するプログラムを作りました。そこでアナログからデジタルに変換する待ち時間が必要とわかりとりあえず仕様書に19.72μSの待ち時間らしき時間がありましたので使用しましたがこれが正しいのかわかりません。どうぞアドバイスお願いします。 以下プログラムの抜粋です。コンパイラはCCS社のPCMを使用しています。 #include<16f88.h> #fuses HS,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT, #device ADC=10 #usedelay(clock=10000000) 途中省略 void DEGVR() { ///////////////////////VR→デジタル計算/////////////////////// set_adc_channel(2);//A/D変換チャンネル設定 delay_us(20);//変換にかかる時間19.72μs vr = read_adc();//A/D変換レジスタリードしvrへ 途中省略 main() { ////////////////////////vr設定/////////////////// setup_adc_ports(sAN2); //アナログポート設定 setup_adc(ADC_CLOCK_DIV_32);//アナログ変換クロック設定 途中省略

  • 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); //アナログ変換クロック設定

  • PIC18でのA/D変換

    PIC18F67J60-l/PT(40MHz)で、C18を使ってA/D変換を行うプログラムを作成しました。 しかし、実際に接続をしてみると上手く動作しませんでした。 具体的には、Web上でA/D変換の結果を表示して確認しているのですが、 結果の値がばらついたり、0か1023が表示され、安定しません。 (1023以上の値が表示されないので、表示するプログラムには問題ないと思います) ピンの接続を何度も確認したり、接続状況を変えたのですが、 問題を解決するまでに至りませんでした。 プログラムに問題があるか、初心者なのでよく分かりません。 参考書や資料を見る限りではプログラムに問題はないと思うのですが、 皆様のご指摘を頂きたいと思います。 宜しくお願いします。 ------------------------------------------------------------------- (前提条件) Vref-はAN2(0V)、Vref+はAN3(3.3V)から取り、 入力をAN4、AN7、AN8、AN9から取り込む。 (作成したA/D変換プログラム)  //各レジスタの設定  ADCON1 = 0x35;  //VREF-はAN2、VREF+はAN3  TRISA = 0x2F;  //AN2,AN3は入力モード  TRISF = 0x1C;  //AN7~AN9を入力にする  ADCON2 = 0xB6;  //AN4用 加速度センサA1  ADCON0 = 0x11;  Delay10TCYx(0);  ADCON0bits.GO = 1;  while(ADCON0bits.GO);  Delay10TCYx(0);  uitoa(*((WORD*)(&ADRESL)), AN4String);  //AN7用 加速度センサA2  ADCON0 = 0x1D;  Delay10TCYx(0);  ADCON0bits.GO = 1;  while(ADCON0bits.GO);  Delay10TCYx(0);  uitoa(*((WORD*)(&ADRESL)), AN7String);  //AN8用 加速度センサB1  ADCON0 = 0x21;  Delay10TCYx(0);  ADCON0bits.GO = 1;  while(ADCON0bits.GO);  Delay10TCYx(0);  uitoa(*((WORD*)(&ADRESL)), AN8String);  //AN9用 加速度センサB2  ADCON0 = 0x25;  Delay10TCYx(0);  ADCON0bits.GO = 1;  while(ADCON0bits.GO);  Delay10TCYx(0);  uitoa(*((WORD*)(&ADRESL)), AN9String);  // AD converter errata work around (ex: PIC18F87J10 A2)  #if !defined(__18F452)  PRODL = ADCON2;  ADCON2bits.ADCS0 = 1;  ADCON2bits.ADCS1 = 1;  ADCON2 = PRODL;  #endif

  • PICを3.3Vで動作させるには?

    PIC初心者です。PIC16F873AというPICを3.3Vで動作させたいのですがうまくいきません。同じ回路で電源電圧を5Vにし、動作することを確認しているので回路やプログラムには問題ないと思われます。 データシートでは2.0V~で動作するようになっていると思うのですが、電源電圧5Vで動作させるときとどこか変更しなければならない個所があるのでしょうか?それとも3.3Vでは動作しないのでしょうか? ちなみにクロックは外部クロック10MHzを使用しています。 PICに詳しい方、よろしくお願いいたします。

  • PIC AN端子

    PIC初心者です。16F627AなどにあるAN0-AN3などはアナログ端子=AD変換機能を持ってると考えていいのでしょうか?

  • PIC18F4550でAD変換

    PIC18のAD変換を使用しているのですが わからない部分があるので質問させていただきます。 ・現象  リファレンス電圧は電源電圧+5V(Vdd)を使用し10bit分解能で行っているのですが90mV位(低い電圧のAD変換)の時の変換値がずれます。 ・測定方法  測定はテスターでPICのVss端子にGND、アナログ信号入力端子に+側を当て直接PICの足をさわっています。 ・結果  1023=5Vですので1=約0.0049V  0.097V=19を示して欲しいのですが17となります。  5V時は1023を示し2.5V時は511が出ており電圧を上げると計算通りに示します。  リファレンス(電源電圧)を意図的に変えてみたのですが低い電圧の時は変化がありませんでした。 上記点より低い電圧での変換では精度が出ないという事なのでしょうか。 またこのあたりの仕様が記載されている資料などありましたら宜しくお願い致します。

  • PICでのプログラミングについて教えて下さい。

    現在電圧計を製作していて4桁の7セグダイナミック点灯で行き詰っております(超初心者です)。 PICは16F873Aを使用、コンパイラはCCS、書き込みはピックライタ、あとシリアルデバッカを使用しています。 外部から電圧をかけそれをAD変換し、AD変換結果(0~5V)を7セグに表示させようとしています。 一応今の状態でも電圧表示はできていることはできているのですが一桁目から4桁目まで目で追えるくらい遅いスピードでこれを改善したいです。ソースは下記のソースを製作しました。この状態で3日間悩んでおります...知恵をお貸しいただけないでしょうか。 よろしくお願いします。 #include <16F873a.h> #device ADC=10 //A/D変換10bitモード #use fast_io(A) /* TRISレジスタの設定が必要 */ #use fast_io(B) #use fast_io(C) #use delay (clock=10000000) //10MHz #use RS232( BAUD = 9600, XMIT = PIN_C6, RCV = PIN_C7, PARITY = N, BITS = 8 ) #fuses HS,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP #define VOLTAGE PIN_A0 // (in) #define CORRENT PIN_A1 // (in) #define VREF1 PIN_A2 // (in) #define VREF2 PIN_A3 // (in) #define RESERVE1 PIN_A4 // (out) #define RESERVE2 PIN_A5 // (out) #define LED_DP PIN_B0 // (out) #define LED_A PIN_B1 // (out) #define LED_B PIN_B2 // (out) #define LED_C PIN_B3 // (out) #define LED_D PIN_B4 // (out) #define LED_E PIN_B5 // (out) #define LED_F PIN_B6 // (out) #define LED_G PIN_B7 // (out) #define DIG_0 PIN_C0 // (out) #define DIG_1 PIN_C1 // (out) #define DIG_2 PIN_C2 // (out) #define DIG_3 PIN_C3 // (out) #define INI_TRIS_A_VAL 0x0F // 7:x 6:x 5:out 4:out 3in 2:in 1:in 0:in #define INI_TRIS_B_VAL 0x00 // 7:out 6:out 5:out 4:out 3out 2:out 1:out 0:out #define INI_TRIS_C_VAL 0x80 // 7:in 6:out 5:out 4:out 3:out 2:out 1:out 0:out int ct;//数字の更新間隔 long val;//表示する数字 int digit;//表示する桁 //表示パターン int segment_data[]={0x81,0xF3,0x49,0x61,0x33,0x25,0x05,0xF1,0x01,0x31}; char st[4]; void main() { float ata1,data2,data3,data4; long data5; long val; SET_TRIS_A( INI_TRIS_A_VAL ); SET_TRIS_B( INI_TRIS_B_VAL ); SET_TRIS_C( INI_TRIS_C_VAL ); setup_adc_ports(AN0_AN1_VSS_VREF); setup_adc(ADC_CLOCK_DIV_32); //Fosc/32 最高速度 digit=0; ct=1;//数字を更新する周期 val=0;//表示する値 while(1) { output_low(RESERVE2); //動作ランプ //////////////////////電圧測定///////////////////////////////// set_adc_channel(0); delay_us(50); //アクイジションタイム待ち(マイクロ秒) data1 = read_adc(); //AD変換結果読み込み printf("ADC V %9.3f \r\n", data1 ); //AD変換データ表示 data2 = (data1 * 4.959695) / 1024; //BCDに変換 printf("Volt %6.3f \r\n", data2 ); //変換データ表示 data5 = data2 * 1000 ; //data2を整数に変換 val = data5 ; printf("val %ld \r\n", val); //整数にし表示 /////////////////////7SEG表示////////////////////////////////// ct --; if(ct == 0){//数字の更新 st[3]=val/1000; //4桁目数値取り出し st[2]=val/100-st[3]*10;//3桁目数値取り出し st[1]=val/10-((st[3]*100)+(st[2]*10));//2桁目数値取り出し st[0]=val%10;//あまり val++; if(val==1000) val=0; ct=20; } if(digit== 3){//第4桁の表示 output_b( segment_data[st[3]]); output_bit(DIG_0,1);  //4桁表示開始 output_low(LED_DP);  //小数点表示  delay_us (5); //表示期間(ミリ秒) output_bit(DIG_0,0); //表示を消す output_high(LED_DP); //小数点を消す delay_us(50); //待ち(マイクロ秒) } if(digit== 2){ output_b( segment_data[st[2]]); output_bit(DIG_1,1); delay_ms (5); output_bit(DIG_1,0); delay_us(50); } if(digit== 1){ output_b( segment_data[st[1]]); output_bit(DIG_2,1); delay_ms (5); output_bit(DIG_2,0); delay_us(50); } if(digit == 0){ output_b( segment_data[st[0]]); output_bit(DIG_3,1); delay_ms (5); output_bit(DIG_3,0); delay_us(50); } digit ++;//表示桁を変更 if(digit ==4 ) digit=0; } }

  • PIC16F84Aの動作電圧について

    PIC初心者です。PIC16F84Aを使用して外部からのコマンドに応じてパルス出力する回路を組みました。 現状問題なく動作しているのですが疑問がわきました。電源をOFFにしたとき電源回路側の都合で約20秒くらい掛けて0.5Vくらいまでゆっくりと低下して行きます。このときOFFにして0.6Vくらいの段階で再び電源をONにするとPICが初期化されず前に送ったコマンド(設定)を覚えていて改めて設定しなくても動いてしまうことに気づきました。電源電圧が0.6Vのような低い電圧になっても設定は覚えてられる物なのでしょうか? どなたか教えていただけると助かります。

  • PIC16F874Aについて

    16F874Aを使用して回路をつくっているのですが、I/Oピンの出力(LEDを接続)はちゃんと動作してくれるのに、入力(スイッチを接続)が全く動作してくれません。動作確認のために、 void main(){ PORTB=0x01; TRISB=0x01; while(1){ if(PORTB.F0==0){ PORTB.F1=1;     } }        } という簡単なプログラムでも動作しません。 また、AN0~AN7をデジタルで使用したいため、A/D変換のプログラムとして、 setup_adc_ports(0b00000000); をプログラム中に入れてビルドすると、エラーが出てしまいます。 PIC素人のため初歩的な質問かとは思いますが、回答よろしくお願いします。

  • PICの入力最大電圧について

    PICは4.5Vから5.5Vの間で動作しますが、RA,RB入出力端子に入力できる電圧は動作電圧と同じですか? 12Vのパルス信号を入力したいのですが、無理でしょうか?

専門家に質問してみよう