No.17566![]() |
平均値の出し方 投稿者---やすすけ(2004/10/27 17:04:43) |
||
ADコンバーターから4回入力(ad_result)を受け、その平均値を出すソースを作成していますが ad_aveの計算部分でうまく動作しません。 ※iceで確認すると常時"0"となってしまいます。 また、数値の1.5は float型の場合、RAM上ではどのような数値となるのでしょうか? ご回答、お願い致します。 <pre><pre>&lt;pre&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 無し } } </pre> </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; } ありがとうございました。早速確認してみますね。 また色々と質問させてもらいますのでお願い致します。 |