-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