一般一个STM32只有2个DAC输出通道,如果需要多路DAC输出,可以选择外扩DAC,但成本回相当高。于是在一些精度要求不高的场合,我们采用定时器输出PWM和RC滤波器模拟DAC来代替外扩DAC。
PWM占空比可由以下式子计算出:p = n / N (n是on的时间,即带宽,N是周期)
PWM周期是由ARR决定的,PWM占空比是由CCRx决定。ARR是自动重装载寄存器的数值,即定时器的锯齿波的最大值,CCRx是捕获/比较寄存器x的数值,是进行比较器comparator的正极电压。
于是我们知道,DAC输出电压为 = DORx / 4096 * Vref。对于分辨率 = log2 (N),比如N = 256,分辨率为8位。因为定时器的时钟频率往往更高,所以更容易获得更高的分辨率。本实验也以8位为例。
本实验的要求如下:要求一次谐波对输出电压影响不要超过一个位的精度,也就是3.3 / 256 = 0.01289V。假设Vh为3.3V,Vl为0V,这里的一次谐波的最大值为2 * 3.3 / pi = 2.1V。RC滤波电路要求是提供至少 -20lg(2.0 / 0.01289) = -44dB的衰减。截止频率要求为当定时器计数频率为72MHz,PWM DAC频率为8位时,PWM频率为72M / 256 = 281.25kHz,如果是一阶RC滤波,则要求截止频率为1.77kHz,如果是二阶RC滤波,则要求截止频率为22.34kHz。
对二阶RC滤波器来说,频率计算公式为f = (1 / (2 * pi)) *RC
接下来我们编写实验代码:
首先我们编写函数代码dac_pwm.c:
<