• ベストアンサー

マイコンでの小数点の計算

現在,マイコンを使用してセンサの値をAD変換して取り込むプログラムを作成しています. AD変換は8bitの分解能で0~255の値が取得できます. その値を0~100に置き換えたい, 例えば   センサの値が0なら0           128なら50   255なら100 上記のようなことを実現するためにはどのようなプログラムを書けばよいでしょうか? 宜しくお願い致します.

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1619/5652)
回答No.1

・100かけて255で割る。 ・0~255それぞれに対応する値を先に計算しておいて参照する。

con014057
質問者

お礼

早速のご回答ありがとうございます. >>・100かけて255で割る。 この時,小数点以下の数値はどうなるのでしょうか? 例えば233 * 100 / 255 = 91.3725...

その他の回答 (3)

  • wormhole
  • ベストアンサー率28% (1619/5652)
回答No.4

>この時,小数点以下の数値はどうなるのでしょうか? #2の方のいわれてる通り、必要であれば残せばいいです。 どうやって残せばいいのかは固定小数点や浮動小数点などを調べてみてください。

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.3

BIT 7=1 50.0000 100/2 BIT 6=1 25.0000 100/4 BIT 5=1 12.5000 100/8 BIT 4=1 06.2500 100/16 BIT 3=1 03.1250 100/32 BIT 2=1 01.5625 100/64 BIT 1=1 00.7813 100/128 BIT 0=1 00.3906 100/256 をBCD加算すれば近似値が求められると思います、但し0xFF -> 100 にはならないので修正が必要です (0-255) 256 -> (0-100) 101 なので、101/X データを加算し小数点以下を丸めた方がいいかも知れません。

con014057
質問者

お礼

ご回答ありがとうございます. BCD加算で近似値を求める方法もあるのですね. 勉強になりました.

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

> この時,小数点以下の数値はどうなるのでしょうか? あなたが小数点以下の数値を必要としているなら残せば良いし、 必要ないなら切り捨てれば良いです。

con014057
質問者

お礼

ご回答ありがとうございます. intに代入すれば勝手に切り捨てられるんですね.

関連するQ&A

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

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

  • PICで小数点の演算

    PIC16F877Aを使ってプログラムを作っています。その内容がセンサー(例えば温度センサー等)から取り入れた電圧をPICのA/D変換(10bit)を行って、その値を使ってpicで計算し、その結果を液晶に表示するといった内容なのですが、その計算過程で小数を扱わなければならないのですが、その計算がうまくいきません。A/D変換後の値をxとし具体的に式で書くと、 v = x * 5 / 1023  ・・・(1) ここでvはセンサーから取り込んだ電圧値(値の範囲は0.935~1.748)です。 y = 218.5 - v / 0.008  ・・・(2) 又は y = 218.5 - 125 * v  ・・・(3) 上記の式はA/D変換後の値xを一度アナログ電圧値vに変換し(1)、そこから(2)又は(3)へ代入して得たい情報yを算出するといった少々面倒なものなのですが、これをアセンブラで書きたいのですが、このPICには乗除命令がないことや小数点の演算方法、16bitの乗除等の部分が引っかかってどうもうまくかけません。小数部分は固定小数点形式で考えて最終的にyは少数第二位を四捨五入したいと思っています。 どのようにプログラムを作ればよいのでしょうか。実際にソースを書いていただけると大変理解しやすいです。

  • マイコンのインターフェイスについて

    今現在、下記のような回路の為の部品選定をしているのですが、、、 アナログ電圧入力(DC) → ADC(分解能24bit) → マイコン(H8)にて演算処理 → DAC(電流出力) ADC →(1)→ マイコン 上記(1)のインターフェイスのことについて質問させていただきます。 24ビットの高分解能ADCが実装されているマイコンが見つからなかったため 現在外付けのADCを選定しております。 それで、いくつかのADCのデーターシートを参照すると、 I2C準拠のシリアルインターフェイスが付いているものや、SPIのものやら あるのですが、それらシリアルインターフェイスがついていないADC 例えば↓ http://www.analog.com/jp/analog-to-digital-converters/ad-converters/AD9283/products/product.html などはデーターシートの出力にはTTL、CMOSコンパチと謳われておりますが こういったADCとマイコンを接続する時はマイコン側のインターフェイスは I/Oポートを使用するのでしょうか? とんちんかんなことを言っていたら申し訳無いのですが、 宜しくお願いいたします。

  • 8bitマイコンへの移植

    16bitマイコンで開発されたプログラムを8bitマイコンに移植するように考えています。 この場合、実現性を検証する際、どういう点について、事前に調査をすべきでしょうか。 マイコン開発の日が浅いもので宜しくお願いします。

  • 電力を計算させる回路

    ACコンセントに接続している電子機器の消費電力を測定したいのですが、電圧と電流をそれぞれセンサーで検知させ、その値を計算させて消費電力を算出しようと考えています。センサーで検知は出来るのですが、その後の値を計算させる回路をご存知の方、いらっしゃいませんか?マイコンのAD入力から値を取り込んで計算できるかと思いましたが、各センサーからの値が交流で出ておりマイコンでは取り込めませんでした。値を直流に変換してしまうと位相差が分からなくなるので、電圧と電流の値を交流のままで計算できる専用のICやアナログ回路があればよいのですがどなたかご存知の方、教えて下さい。

  • 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なのでしょうか?分かりにくいとは思いますが教えて頂けると幸いです。よろしくお願いいたします。

  • 圧力センサの0点補正について

    圧力センサの0点補正について ゲージ圧センサを利用して、空気圧を測定するプログラムを作成しようとしています。 センサの出力をA/D変換器でマイコンに取り込み、圧力を取得します。 このとき、圧力を正確に測定するためには0点補正が必要になると思いますが、 補正方法にはどのようなものがあるのでしょうか。 単純にセンサに圧力をかけない状態のA/D変換値を基準とすればよいのでしょうか。 参考になる文献などありましたら教えていただけると助かります。 よろしくお願いします。

  • マイコンとADコンバータとのインターフェース回路

    マイコン初心者です。 マイコンと外付けADCとのインターフェース回路について質問です。 CH数や分解能といった事情より、外付け(8ch、16bit)程度のADCを利用したいと考えております。 こういったADCの場合、出力がシリアルデータなのですが、マイコンとのインターフェースはどうしたら良いのでしょうか。(マイコン内蔵のSCIは他の用途に割当済みで使えません) UART ICでシリアル/パラレル変換する?などと考えるのですが、一手として全うな手法なのでしょうか? 他にどういったやり方があるのか教えてください。 参考になるマイコン周辺回路の参考書等も併せて教えていただけますと助かります。 基本的な質問で恐縮ですが、よろしくお願いいたします。

  • A/D変換器AD7699について

    ANALOG DEVICES社のAD7699をSH7144Fに接続しセンサからの値を読み込もうとしています. しかし,どのようなプログラムを作ればいいかわかりません. マイコンとの通信はSPIを使用していますが,これはデータシートのタイムチャート見て各端子から出力をしたり,しなかったりといったプログラムを作成すればいいのでしょうか? もし,そのような方法だったとして,タイムチャートがよくわかりません.タイムチャートの読み方が記載されている文献があったらお教えしていただけないでしょうか? 宜しくお願い致します.

  • H8/3048 マイコンボードについて

    初心者の質問ですみません。 今、H8/3048のマイコンを使っていろいろやってみようと思っています。 マザーボードにP1の出力をLEDで表示できるような回路を組み、スイッチを押すとLEDを光らせるようなプログラムを作成し、実際に光らせることはできたのですが、A/D変換機能が使えません。 プログラムはネット上のサンプルプログラムを参考にしたので間違ってはいないと思うのですが、うまく変換されません。 入力電圧はきちんとAN0に入ってますし、ICやソケット部も拡大鏡で確認しましたがショートしている様子もありません。 これは故障してしまったのでしょうか? 何かの拍子に何処かがショートしてAD変換機能のみが壊れるというような事はあるのでしょうか? 非常に困っています。 どなたか回答よろしくお願いいたします。 ちなみにこのようなプログラムです。 #include <3048.h> void main(void){ int ad_data; P1.DDR = 0xff; P4.DDR = 0x00; P4.PCR.BYTE = 0xff; AD.ADDRA = 0; P1.DR.BYTE = 0xff; AD.ADCSR.BYTE = 0x33; while(AD.ADCSR.BIT.ADF == 0){} while(1){ if(P4.DR.BIT.B4 == 0){ ad_data = AD.ADDRA>>8; } P1.DR.BYTE = ad_data & 0xFF; } }