• ベストアンサー

H8/3048FでのAD変換について

どうしても分からないので教えていただきたいのですが、H8/3048FでのAD変換は単一モードとスキャンモードがあります。このスキャンモードは最大で4ch分を AD変換することは理解しています。 私はセンサを6個使用して、これらの6個のセンサが 返す値をAD変換して常時取りこみたいと考えています。H8/3048Fでこの考えを実現できる方法はあるのでしょうか? それとも、4個はスキャンモードでAD変換して、残り の2個は別のADコンバータが必要なのでしょうか? 宜しくお願いします。

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

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

AN0~AN7までありますので6本なら大丈夫です 具体的には、 ADCSRのbit0~2を011としてAN0~AN3まで入力できたら(ADF=1になったら) 取り込んだデータを処理後、ADCSRのbit0~2を101にしてAN4~AN5を取り込みます 詳しくはH8/3048Fの15.A/D変換の所を参照してみてください http://www.mech.ibaraki.ac.jp/~masuzawa/j602093_h83048.pdf

Iseebi007
質問者

お礼

ご説明有難うございます。 大変参考になりました。 PDFファイルも参考にさせて頂きました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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; }

  • 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);

  • H8/3048、AD/DA変換プログラムについて。

    H8/3048、AD/DA変換について質問です。 ポート7のAN0・AN1を入力に使い、DA0・DA1で出力される変換プログラムを作成して実験したところ AN0→DA0への変換は出力されたのですが、AN1→DA1への変換が出力できません。なぜ出力されないのかわかりません。 どうしたらいいか教えてください、お願いします。 AN0がDA1でも出力されているかと思いましたが違いました。 #include <no_float.h> #include <stdio.h> #include <machine.h> #include "h8_3048.h" void init (void); double get_ad0 (void); double get_ad1 (void); void out_da0 (double); void out_da1 (double); void wait (void); int main (void) { double ad0,ad1; int d; init(); //初期化 // set_ccr(0x00); //全体の割り込み許可 //AD DA変換----------- while(1){ ad0=get_ad0(); ad1=get_ad1(); for(d=0;d<1000;d++); out_da0(ad0); out_da1(ad1); } return 0; } void init(void) { /* ポートの入出力設定 */ P1DDR = 0xff; P2DDR = 0xff; P3DDR = 0xff; P4DDR = 0xff; P5DDR = 0xff; P6DDR = 0xf0; // CPU基板上のDIP SW P8DDR = 0xff; P9DDR = 0xf7; PADDR = 0xff; // LED基板 PBDDR = 0xff; // A/Dの初期設定(単一モード) AD_CSR = 0x00; // A/Dの初期設定(スキャンモード使用AN0-AN1) // AD_CSR = 0x11; //ITU0 1ms毎の割り込み ITU0_TCR = 0x20; ITU0_GRA = 24575; ITU0_IER = 0x01; ITU_STR = 0x01; // D/Aの初期設定 DA_CR=0xc0; //DA0E1,DA0E0:1 D/Aアウトプットネーブル DAE:0 ch0,1 独立制御 } double get_ad0(void) { int i; double ad; AD_CSR |=0x20; //ADST:1 AD開始 while(!(AD_CSR & 0x80)); //ADF:1 エンドフラグをチェック AD_CSR &=0x7f; i=AD_DRA>>6;// i=0-1023 ad=i*5.0/1024.0; // 0-1024 を 0-5vに変換 return ad; } double get_ad1(void) { int i; double ad; AD_CSR |=0x20; //ADST:1 AD開始 while(!(AD_CSR & 0x80)); //ADF:1 エンドフラグをチェック AD_CSR &=0x7f; i=AD_DRB>>6; //i=0-1024 ad=i*5.0/1024.0; // 0-1024 を 0-5vに変換 return ad; } void out_da0(double d) { DA_DR0=(int)(d*255/5.0); } void out_da1(double d) { DA_DR1=(int)(d*255/5.0); } void wait(void) { long Loop=200000; while(Loop--); }

  • SH7144マイコンにAD変換器AD9244を接続して加速度センサから

    SH7144マイコンにAD変換器AD9244を接続して加速度センサからの値を読み込むことは可能でしょうか?

  • 3048fマイコンでのA/D変換について

    マイコン初心者ですが今3048fマイコンを使ってA/D変換をしようとしているんですが、うまくいかないので教えて頂きたいです。 プログラムは下の通りです。 #include <3048.h> /* メイン関数 *****************************************/ void main(void){ int ad_data; P1.DDR = 0xff; /*port1出力に設定 表示LED */ P4.DDR = 0x00; /*port4入力に設定 操作用sw1~4 */ P4.PCR.BYTE = 0xff; /*port4プルアップon */ AD.ADCSR.BYTE = 0x33; /* SCAN MODE / CH0~3  */ while(AD.ADCSR.BIT.ADF == 0){} /* 4CH分の変換終了を待つ */ while(1){ if(P4.DR.BIT.B4 == 0){ /* sw1の時 */ ad_data = AD.ADDRA>>8; } else if(P4.DR.BIT.B5 == 0){ /* sw2の時 */ ad_data = AD.ADDRB>>8; } else if(P4.DR.BIT.B6 == 0){ /* sw3の時 */ ad_data = AD.ADDRC>>8; } else if(P4.DR.BIT.B7 == 0){ /* sw4の時 */ ad_data = AD.ADDRD>>8; } P1.DR.BYTE = ad_data & 0xFF; /*上位8bit分だけ表示させる */ } } このように4チャンネル分の0~5vのアナログ信号をスキャンモードでA/D変換し、それぞれ対応したスイッチを押すことによって現在どのくらいの電圧が来ているかLEDに2進数で表示させようとしています。しかしsw1とsw2、sw3とsw4がそれぞれ同じ値を表示しています。例えば、sw1を押したらADDRAの値が表示されますが、sw2を押しても同じADDRAの値が表示されます。またsw3とsw4も同じでどちらを押してもADDRCの値が表示されます。 4チャンネル分を同時にA/D変換することは元々出来ないのでしょうか?いろいろ調べてはいますが理由が分かりせん・・・ADDRA=ADDRB、でADDRC=ADDRDなのでしょうか?分かりにくいとは思いますが教えて頂けると幸いです。よろしくお願いいたします。

  • PIC12F683 AD変換について

    PIC12F683のアセンブラの設定についてご教授ください。 以下のように設定したところGP4ピンにてAD変換できませんでした。 init MOVLW   07h MOVWF   CMCON0 BSF     STATUS,RP0 MOVLW   b'00111000' MOVWF   TRISIO MOVLW   070h MOVWF   OSCCON MOVLW   018h MOVWF   ANSEL BCF     STATUS,RP0 MOVLW   b'10001101' MOVWF   ADCON0 「MOVLW 018h」の行を削除すると問題なくAD変換動作します。 しかしその場合「ANSEL」に070hが入るのでGP4がデジタル 入出力になり動作しない用に感じますが、なぜか動作します。 動作するので問題はないのですが、なぜかすっきりしません。 原因が分る方がおられましたら教えていただけますでしょうか? .

  • [H8/3048F]AD変換

    H8/3048Fの評価ボード”FLDM-H8CPU-MB”を使用しAD変換をしようとしています。そこで起きた問題を質問させていただきます。 マイコンへのアナログ値の入力は分圧回路を製作し、ボリューム抵抗R2にて0.45V~4.54Vの範囲で変化できるようにしました。 5V | □ R1=1kΩ |――マイコンへ(P7-0へ) □ R2=10kΩ | □ R3=100Ω | GND 5Vは評価ボードの5Vより R2のみ可変抵抗です。マイコン入力インピーダンスは10kΩ 実際にマイコンにつないで動作させてみたところ マイコンへの電圧が0.45V~4.54Vのはずが 1.6V~4.9Vの範囲で入力されている事がわかりました。 評価ボードに接続した状態で可変抵抗を変化させた場合 R2=0~1.3kΩ(0~10kΩのはず) R1=400~1kΩ(1kΩ固定のはず) と、R1は固定抵抗のはずなのに、R2と比例した感じで変化していました。R2の値もおかしいのですが… R3は特に問題ありませんでした。 そこで、マイコンから取り外して動作させたところそのような問題も無く予定通りの動作をしてくれました。 評価ボード越しとはいえP7-0までは分圧回路以外何も接続されていません。 何が原因か掴めず困っております。 起こりうる原因や解決方法、それ以外のどんな事でもかまいませんので ご回答頂ければ幸いです。 どうぞ宜しくお願いします。

  • dsPIC33FのAD2ポート入力

    dsPIC33FのAD2ポート入力で 取得したデータが-20000~6000の辺りを取得します。 なぜマイナス値が取得されるか教えてくれませんか? 1.型変換のミス 考えにくいです。。 2.ADコンバーターの仕様 (オフセット値などで回避する??) お願いします。

  • 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]に格納した後にどうすればいいのかわかりません。

  • H8/3048マイコンAD/DA変換について

    初めて投稿させていただきます。  AKI-H8/3048キットでAD/DA変換をC言語で行いたいの ですがうまくいきません。  C言語ではどうやって記述すればいいのでしょうか? ご助言お待ちしています。  参考までに作成したAD/DA変換ソースコードを記します。 ちなみに入力端子AN0は可変抵抗器、出力端子DA1はLCDに 接続しています。 (可変抵抗器からの電圧増減に従ってLCDの表示を変化 させたい) #include <3048f.h> #include <stdio.h> main(){ int a; while(1){ AD.CSR.BYTE = 0x28; while(AD.CSR.BIT.ADF == 0){} a = AD.DRA; AD.CSR.BIT.ADF = 0; DA.DR1 = (unsigned char)((a >> 8)&0x00ff); } }

このQ&Aのポイント
  • 高校卒業後の人生が虚しいまま十年が経過してしまった。めんどくさがりで勉強もせず、無趣味でハマる娯楽もない。人間関係も苦手でぼっちのままだ。大学でもぼっちで、卒業式の虚しさが半端なく、引きずっている。日雇いのバイトをしてのんびり過ごし、貯金もない。過去が戻らず、将来に不安を感じている。
  • 自分は全く変わらず、興味関心も低い。空虚な毎日に耐え切れず、マンガを読んだり、筋トレを試みたが何も変わらなかった。就職もしておらず、人と関わらないことで世間の常識や物事の重要性を知らない。もうすぐ30歳になり、危機感を抱いている。同じような経験をした人がいれば、どのように抜け出したのか知りたい。
  • 将来の希望としては、恋人や友達がいて、趣味に打ち込める人生を手に入れたい。自分で稼げる仕事を見つけて、恥ずかしくない生活を送りたいと思っている。現状に満足できず、何か変えるための助言が欲しい。
回答を見る

専門家に質問してみよう