C言語関係掲示板

過去ログ

No.1305 ADコンバーターから4回入力を受け、その平均値を出す

[戻る] [ホームページ]
No.17566

平均値の出し方
投稿者---やすすけ(2004/10/27 17:04:43)


ADコンバーターから4回入力(ad_result)を受け、その平均値を出すソースを作成していますが ad_aveの計算部分でうまく動作しません。
※iceで確認すると常時"0"となってしまいます。
また、数値の1.5は float型の場合、RAM上ではどのような数値となるのでしょうか?
ご回答、お願い致します。

<pre>&lt;pre&gt;&amp;lt;pre&amp;gt;#define VREF 5
// マクロ定義
char    count = 0;
int ad_dat = 0;
float   ad_ave = 0;
extern  char ad_result;
extern  char dat_flg;
//--------------------------------------
// ADからのdataの平均を出す      
//--------------------------------------
void data_henkan(void)
{
    if(dat_flg != 0){
        if(count == 3 ){
            ad_dat += ad_result;
            ad_ave = ( ad_dat / 4 ) * (VREF / 0xff);
            henkan();
            count = 0;
            ad_dat = 0;
        }
        else{
            ad_dat += ad_result;
            count++;
        }
        dat_flg = 0;        //data 無し
    }
}

&lt;/pre&gt;
</pre>



No.17567

Re:平均値の出し方
投稿者---tetrapod(2004/10/27 18:11:19)


整数同士の除算は整数商を得ます。 VREF/0xff は 5/0xff なので常に0です。

対象はマイコンか何かですか?
私なら浮動小数点数演算ハードが無いマイコンでは決して float/double を使いません。
たかが A/D 変換の結果、精度的にもそんなに必要ないはずです。
小数点以下の情報が欲しいとしてもせいぜい1桁から2桁あれば十分な用途なら、
int にして10倍値や100倍値を保持するようにすると
速度もメモリ消費量も劇的に改善すると思われます。



No.17571

Re:平均値の出し方
投稿者---やすすけ(2004/10/27 22:02:44)


>整数同士の除算は整数商を得ます。 VREF/0xff は 5/0xff なので常に0です。

納得しました。それでiceの結果は常時"0"になってた訳ですね。

>たかが A/D 変換の結果、精度的にもそんなに必要ないはずです。
>小数点以下の情報が欲しいとしてもせいぜい1桁から2桁あれば十分な用途なら、
>int にして10倍値や100倍値を保持するようにすると
>速度もメモリ消費量も劇的に改善すると思われます。

確かに、2桁あれば問題はないのでその方法を試してみますね。
あと参考までに”5/0xff”のような計算を行うにはどの様な方法が
あるのでしょうか?


No.17577

Re:平均値の出し方
投稿者---tetrapod(2004/10/28 08:14:27)


>あと参考までに”5/0xff”のような計算を行うにはどの様な方法が
>あるのでしょうか?
要件次第でコードは変わるでしょう。
一番いいのは、そもそも除算を必要としないように組むことです。
henkan() の中で「A/D 読み値→何らかの実値」の変換をしているのでしょうが、
そこに 5/0xff 分を考察するコードを入れちゃうとか。

ちなみに提示コードがどうにも無駄っぽいのでこんなのを
ad_sum+=ad_result;
count=(count+1)&3;
if (count==0) {
  ad_henkan(ad_sum);
  ad_sum=0;
}





No.17578

Re:平均値の出し方
投稿者---やすすけ(2004/10/28 08:50:05)


>一番いいのは、そもそも除算を必要としないように組むことです。
>henkan() の中で「A/D 読み値→何らかの実値」の変換をしているのでしょうが、
>そこに 5/0xff 分を考察するコードを入れちゃうとか。
>
>ちなみに提示コードがどうにも無駄っぽいのでこんなのを
>
ad_sum+=ad_result;
count=(count+1)&3;
if (count==0) {
  ad_henkan(ad_sum);
  ad_sum=0;
}



ありがとうございました。早速確認してみますね。
また色々と質問させてもらいますのでお願い致します。