2009-02-26 20 views
3

私は圧力測定装置を開発中です。私はMSP430F133チップを使用し、IAR組み込みワークベンチを使用しました。それは3つの異なる単位で圧力を示します。MSP 430の間違った値が表示されています

私は32サンプルを取って平均化しています。選択された単位の出力値に応じてP5の単位選択が計算され、LCDに表示されます。

"IN WC"という単位は、解析のために入力のバイナリ平均値を表示しています。

問題:デフォルトの単位で(MM WC)の値が正しく表示されますが、テスト状況にされている圧力が解放されたときにそれがダウンし、1つの間違った値があることができますようにLCDは

+31.8 
+31.7 
+31.6 
+31.5 
+31.4 
+31.3 
+31.2 
+31.2 
+31.1 
+31.5 (wrong reading randomly between *.4 to *.7) 
+30.9 

次のように読んで表示されている、私は理由を把握することができません。

+0

問題を特定する必要があります。最初に、生のADC値をディスプレイに送り、Excelなどのようなものを使用して変換とチェック値を実行します。ディスプレイに空きがある場合は、adcとcaculatedの両方の値を出力します。出力する定数や変数も出力されます。 –

+0

ソースはもう利用できません。 – eaanon01

答えて

1

これは醜いですね、||おそらく& &次のようになります。

 for (i=0; i<= 3||res[i]!='\0'; i++) 

しかし、それはあなたの問題を引き起こし、どのように表示されません。

また、コードをクリーンアップしてシンプルにする必要があります。読んでいると非常に難しいです。

4

以下のコードでは、ptiveValue = valueとd1 = valueなので、d2は常に0であるため、ループでは for(i = 0; i < = 3 || res [i]!= '\ 0'; I = 3 < & & RES [I] = '\ 0';;!私は++) ので、それは常にあなたが

欲しいものをバッファに残っていたものではありませんプリントアウトし、私は、(i = 0のため する必要があります) ++を

悪いコード:

if (cntd <= 4) 
{ 
    d2 = (unsigned int) abs((ptiveValue - d1) * 10000); // get 4 digits of real part 
    itoa1(d2, res, &cntreal); 
    for (i=0; i<= 3||res[i]!='\0'; i++) 
    { 
     wr_lcd_dr(res[i]); 

    } 
} 

固定コード

if (cntd <= 4) 
{ 
    // get 4 digits of real part 
    d2 = (unsigned int) ((ptiveValue - (unsigned int)(d1)) * 10000); 
    itoa1(d2, res, &cntreal); 
    for (i=0; (i<= 3) && (res[i]!='\0'); i++) 
    { 
     wr_lcd_dr(res[i]);  
    } 
} 

また、バッファを上書きして奇妙な動作を作成することもあります。

unsigned short Adcinb[32]; 
for (i = 0; i <= 63; i++) 
Adcinb[i] = 3180; 

unsigned short Adcinb[32]; 
for (i = 0; i < 32; i++) 
Adcinb[i] = 3180; 
+0

彼は他のメモリを上書きしていますが、この結果を出すかもしれないし、与えていないかもしれませんが、プログラムの始めに一度しか起こりません。おそらく修正する必要があるが、問題の原因ではないかもしれない。 –

+0

MSP430には変数を知っているメモリのスタックまたはヒープがないため、彼は壊れている。しかし、おそらく問題の原因ではないと私は同意する。 –

+0

MSP430にはバッファ/スタックがあります。 – Sharique

0

それは感知されている実際の値を反映していない限り、私はあなたがその値を取得することであろう任意の特定の理由が表示されていない、あなたのコードの上に探している必要があります。

プログラムを実行して問題のある番号、その前の番号、およびその後の番号を平均化する前に32個の値を出力できますか?

また、サンプルを入手するたびに新しいサンプルを書き出し、そのデータを提供してください。

-Adam

2

残念ながら、もうソースコードの作品への2つのリンクのどれも。 しかし私が見ることができるのは、この場所の予想される「正しい」最後の数字がゼロであるという事実かもしれない。 私の推測は、計算や視覚化コードのどこかで、このゼロが誤って停止条件とみなされ、その場所にランダムな数字が表示されます。 (唯一の「31」は、出力に提供されるが、3桁がディスプレイに送信される)

「||」/「& &」問題は、上記のコードは、非常にまっすぐ進むと、この場合ではないことを示しています残りの部分についても真であり、ここで間違った停止条件があり、固定長のループが原因です。

「野生の推測」(TM)ですが、実際のコードを知らなくても私が与えることができる最高のものです。

1

私は先に進んで、ADC 101ソリューションを試してみることにします。使用しているセンサーのタイプによっては、サンプル読み取り値をクリーンアップするために独自のデバウンスを実行する必要があります。私は過去にこの記事を参照しており、このテクニックを学ぶのに非常に役立つと感じています:A Guide to De-bouncing by Jack G. Ganssle

ハードウェアがデバウンスを必要としていると仮定していますが、このガイドではこれを識別するのに役立つはずです。あなたがそれを必要としなくても、あなたはそれを面白く見つけることができます!

追加:圧力が解放されたときに奇妙な示度が発生していたことを私が示唆した理由を知っているだけです。メカニカルベースのスイッチおよびセンサの作動中のサンプリングでは、バウンドエラーが明らかです。

+1

私はちょうど2009年からの質問に答えるためにすべての時間を取った...一息... – Fz3

関連する問題