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是数据保持寄存器12bits right
我已将其转换为标准 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
,偶尔会出现短尖峰。还要注意,如果在错误的时刻连续出现两个增量,一个 beforex<5
被检查,另一个在此之后, beforex=0
被执行,那么一个脉冲将丢失。
因此,您应该考虑将限制检查移动到发生增量的中断中,例如
x = (x + 1) % 5;