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 :(得分: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处回转。这意味着输出电压通常会落在GND
和0.727*Vref
之间,偶尔会出现短暂的尖峰。
另请注意,如果在错误的时刻连续两次递增,则在x<5
之前检查一次,而在此之后,在执行x=0
之前,则会丢失一个脉冲。
因此,您应该考虑将限制检查移动到中断位置 增量发生,如
x = (x + 1) % 5;