单片机输出可调电压信号一般可以通过DA转换器,或者是定时器输出PWM信号实现。

现在带DA转换器功能的单片机比较少,DA转换输出可调电压也比较简单,只需要配置DA转换器的寄存器,使能DA功能,在IO口输出电压,通过向DA数值寄存器写入数据调节电压。

我想以STM32F051为例,介绍通过PWM功能输出1-4V的电压输出。

PWM信号是频率固定,占空比可调的信号。

通过一个简单的R、C滤波电路,可以把PWM信号,滤成与占空比成正比的直流电压。如下图:

单片机输出端得到1V-4V的直流电压

假设占空比为α,PWM的高电平为V,PWM的周期为T,

R*C得到的时间常数至少为10倍的PWM周期。

此时,电容滤出的直流为α*V.

比如上图的电路图,输入的PWM信号为高电平5V,占空比为30%,频率为1kHz(即周期为1ms)

我选择R1=10kΩ,C1=1uF,此时RC时间常数=10kΩ*1uF=10ms=10倍的周期。

从示波器波形可以看到,C1两端的电压已经被滤成直流,测得电压为1.58V,与理论计计算α*V=30%*5V=1.5V相等。

STM32F051的IO口输出电压为3.3V,当占空比为100%时,可以得到最高电压为3.3V。不满足题主的要求,需要一级运放放大电压。

运放的另外一个好处是,可以做输出阻抗的变换,如果我们用上图的电路进行滤波,这个电压输出阻抗=R1=10kΩ,

比如,如果把C1两端的电压接入某工控设备,比如变频器的电压输入口,则C1的输出电压会受到工控设备输入口的阻抗的影响,如果输入口的阻抗也为10kΩ,那么上图C1的电压就只有0.75V.

当经过运放进行阻抗变换之后,运放的输出电阻也就几十Ω,此时工控设备的10k的输入电阻,基本上不会影响经过运放之后电压值。

可以采用如下的运放电路,可以R3并联104电容,可以滤除高频干扰。

单片机输出端得到1V-4V的直流电压

当单片机输出占空比为α的电压时,运放输出的电压为:

α×3.3×(1+R3/R2)=α×3.3×4/3.

当α=90.9%时,运放输出4V。

当α=22.7%时,运放输出1V。

配置MCU的定时器寄存器,使得定时器输出1kHz,占空比可调的PWM信号。

可以设置定时器的时钟为1us,定时器的周期寄存器设置为1000。

这样,占空比寄存器可以设置0-1000的数值。

单片机的程序往占空比寄存器里面写入227-909之间的数值,就可以在运放的输出端得到1V-4V的直流电压。