-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位右是什麼代碼是什麼意思?
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位右是什麼代碼是什麼意思?
我它轉換成一個標準的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處迴繞。這意味着輸出電壓通常會在GND
和0.727*Vref
之間,偶爾會出現短暫的尖峯。 還要注意,如果在錯誤的時刻短時間連續發出兩個增量,一個在x<5
之前被選中,另一個在該之後,在x=0
之前被執行,那麼一個脈衝將會丟失。
因此,你應該考慮移動限制檢查到哪裏 增量出現interupt,像
x = (x + 1) % 5;
看起來像一個無限循環給我。 – DrPepperJo
好吧,我只是不明白什麼是5.0,4095和3.0。這些數字意味着什麼? –
4096 = 2^12 - 1,可由12位無符號數表示的最大數。不知道其餘的,你必須提供更多的信息。 – DrPepperJo