单片机输出可调电压信号一般可以通过DA转换器,或者是定时器输出PWM信号实现。
现在带DA转换器功能的单片机比较少,DA转换输出可调电压也比较简单,只需要配置DA转换器的寄存器,使能DA功能,在IO口输出电压,通过向DA数值寄存器写入数据调节电压。
我想以STM32F051为例,介绍通过PWM功能输出1-4V的电压输出。
PWM信号是频率固定,占空比可调的信号。
通过一个简单的R、C滤波电路,可以把PWM信号,滤成与占空比成正比的直流电压。如下图:
假设占空比为α,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电容,可以滤除高频干扰。
当单片机输出占空比为α的电压时,运放输出的电压为:
α×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的直流电压。