2016-12-07 190 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;