-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是数据保持寄存器12bits right

4

1 回答 1

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,偶尔会出现短尖峰。还要注意,如果在错误的时刻连续出现两个增量,一个 beforex<5被检查,另一个在此之后, beforex=0被执行,那么一个脉冲将丢失。

因此,您应该考虑将限制检查移动到发生增量的中断中,例如

x = (x + 1) % 5;
于 2016-12-08T09:57:08.537 回答