- ベストアンサー
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; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、ソースコードがコメントどうり動作するものと仮定します。 1.A/D コントロール/ステータスレジスタ (ADCSR)の設定について CH2,CH1,CH0の設定を行っていないので、この値が初期値と推測されます。この場合には、スキャンモード(SCAB=1)でA/D変換させると、(16.3.2 A/D コントロール/ステータスレジスタ ADCSR に記載されているとおり)AN0だけが変換されるようですね。 AN1を変換するには、SCAN,CH2,CH1,CH0へ適切な値の組み合わせを設定しなければならないようです。 AN1だけを変換するには SCAN=0,CH2=0,CH1=0,CH0=1 AN0,AN1を連続して変換するには SCAN=1,CH2=0,CH1=0,CH0=1 AN0,AN1,AN2を連続して変換するには SCAN=1,CH2=0,CH1=1,CH0=0 AN0,AN1,AN2,AN3を連続して変換するには SCAN=1,CH2=0,CH1=1,CH0=1 2.A/D データレジスタの読み出しについて AN1の変換結果は、(16.3.1 A/D データレジスタA~D ADDRA~D に記載のあるとおり)ADDRBへ格納される様なので、ADDRBを読み出す必要があるようですね。 (AD.DRAがADDRBを示すように宣言されていれば問題なさそうです) 3.A/D変換の結果の判定について ハードウェアマニュアル にはA/D変換のフルスケールの電圧がどうなるか記載が見つからなかったのですが、図16.1 A/D 変換器のブロック図から、フルスケール電圧をAVccに近い電圧かそれ以下と推定すると、変換結果の値100が1.0Vとなる場合のフルスケールの電圧は、(1.0/100*1023)V=10.23V付近と推定されますが、(20.2.4 A/D 変換特性によると)AVccは3.3~5.5Vしか印加できないので、変換結果を100と比較したのでは、1.0V以上と判定できないことがわかります。 AN1に1.0Vを印加した場合のA/D変換結果がどうなるかを確認して、比較する値を決めた方がよさそうです。
その他の回答 (1)
- richardo
- ベストアンサー率20% (11/53)
アプローチ方法が良くないな。 ・出力をON/OFFするプログラムを作りテストする。 ・A/D変換が行われているか調べるため、データをヘキサでLCD 表示器などに出力する。 ここでA/Dが上手く行かなかったら、プログラムが間違えていないか質問すればいいのです。 その前にCPUの端子にアナログ信号が入っているか確認。 A/D値が予定値と違うのであれば、アナログ入力インピーダンス によって分圧され電圧が下がったと考えられる。 全段が片電源オペアンプであれば、0V付近まで振れないなどの トラブルが予想されます。 このように幾つかの可能性を考えて原因を分けないといけません。 いきなりA/D変換のプログラムがおかしいと断定しては行けません。
お礼
H8を使った電子装置の製作が初めてだったのと知識の無さで プログラムが間違っているだけだと思っていました。 今回は運よくプログラムの修正だけでダイオードは光りましたが、 もっと考えるべき面があると教えられました。 これからはもっといろんな角度から原因を探っていくようにします。 ありがとうございました!
お礼
回答ありがとうございます。 チャネルとレジスタの設定を行ったらダイオードが光りました!! ずっと悩んでいたのでホントに助かりました! 教えて頂いたH8のマニュアルも重宝させていただきます。