2016-12-07 240 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); 
    } 
} 

是什麼意思循環?我知道DHR12R1是數據保持寄存器12位右是什麼代碼是什麼意思?

+0

看起來像一個無限循環給我。 – DrPepperJo

+0

好吧,我只是不明白什麼是5.0,4095和3.0。這些數字意味着什麼? –

+0

4096 = 2^12 - 1,可由12位無符號數表示的最大數。不知道其餘的,你必須提供更多的信息。 – DrPepperJo

回答

0

我它轉換成一個標準的C程序,看看有什麼值被寫入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在被重置爲0之前可以簡單地設置爲5.如果它可以增加任意值,或者此中斷可能發生多次每循環迭代,那麼結果將在4096處迴繞。這意味着輸出電壓通常會在GND0.727*Vref之間,偶爾會出現短暫的尖峯。 還要注意,如果在錯誤的時刻短時間連續發出兩個增量,一個在x<5之前被選中,另一個在該之後,在x=0之前被執行,那麼一個脈衝將會丟失。

因此,你應該考慮移動限制檢查到哪裏 增量出現interupt,像

x = (x + 1) % 5;