2016-12-07 11 views
-1
while(1) 
{ 
    for(x=0;x<5;) //note: x is incremented elsewhere 
    { 
     DAC->DHR12R1 = (uint16_t)(x/5.0*4095*3.0/3.3); 
    } 
} 

をこのループは何を意味するのでしょうか?私は値が書き込まれているものを参照するために、標準のCプログラムにそれを変換しましたDHR12R1が右このコードは何を意味するのでしょうか?

+0

のように、 増分が発生しinteruptに制限チェックを移動することを検討すべきです。 – DrPepperJo

+0

まあ、私はちょうど5.0、4095と3.0何を理解していない。これらの数字は何を意味しますか? –

+0

4096 = 2^12 - 1、符号なし12ビットで表現できる最大の数。残りの部分について知りません、より多くの情報を提供する必要があります。 – DrPepperJo

答えて

0

データ保持レジスタ12bitsである知っていますDACレジスタ。

#include <stdio.h> 
#include <stdint.h> 
int x; 
int main() { 
    for(x=0;x<=5;x++) // Why x <= 5? See note at bottom 
    printf("x=%d DAC->DHR12R1=%u\n", x, (uint16_t)(x/5.0*4095*3.0/3.3)); 
    return 0; 
} 

出力:

$ gcc -Wall -Wextra dac.c -o dac && ./dac 
x=0 DAC->DHR12R1=0 
x=1 DAC->DHR12R1=744 
x=2 DAC->DHR12R1=1489 
x=3 DAC->DHR12R1=2233 
x=4 DAC->DHR12R1=2978 
x=5 DAC->DHR12R1=3722 

この値は、最終的にはDACチャネル1のデータ出力レジスタDAC->DOR1になってしまいますし、だから、式

U=Vref*DAC->DOR1/4095 

に応じた電圧に変換されますあなたのVrefが3ボルトの場合、x = 0で0ボルト、x = 1で0.545ボルトなどを得ます。

注:いくつかの割り込みハンドラでxが1ずつインクリメントされると仮定しましたが、xは5にリセットされる前に一時的に5に設定できます。任意の値でインクリメントできるか、ループごとに繰り返すと、結果は4096でラップアラウンドします。つまり、出力電圧は通常、GND0.727*Vrefの間にあり、時折短いスパイクを上回ります。 また、間違った瞬間に2つのインクリメントが連続して発生した場合は、x<5より前のものがチェックされ、その直後ではx=0が実行される前に1つのパルスが失われます。

したがって、あなたは私には無限ループのように見える

x = (x + 1) % 5; 
関連する問題