需要来自没有数模转换器(DAC)的微控制器的模拟输出时,您可以连接外部DAC芯片。但是对于更便宜的解决方案,使用脉冲宽度调制(PWM)输出并添加低通滤波器(LPF)来提取其平均值,该平均值等于PWM信号的占空比。
图1 RC LPF提取PWM信号的平均值
RC滤波器去除非直流分量; 剩下的是平均信号
U OUT。如果PWM信号的周期
T等于63个时钟,则信号
U OUT可以具有64个离散DC值之一(0到63,六位分辨率)。
低通RC滤波器的时间常数t必须足够大以平滑输出信号
U OUT。涟漪,?
ü OUT,应小于一个至少显著位(LSB)。最坏的情况是占空比为50%(
图2)。如果t比周期
T大得多,则电容充电电流
I C 和变化?
U OUT可以近似为:
对于6位DAC,?
U OUT应小于V CC / 64,需要滤波器t
= RC = 16·T。
图2 滤波后的输出(蓝色)应具有少于一个LSb的纹波。
一些实用数字:低功耗微处理器通常使用32768 Hz的晶体振荡器,此时钟信号用于PWM模块。对于6位PWM,周期
T为64/32768~2ms,需要32ms的时间常数。必须等待5t(160ms)才能使6位转换器稳定下来。慢。本设计理念解释了如何加快速度。
微控制器中的PWM模块通常可以产生多个PWM信号。考虑对两个基于PWM的3位DAC(DACH和DACL)的输出求和,其中DACL的输出在加法之前降低到八分之一幅度。产生的信号用作6位DAC,与简单版本相比具有重要优势:对于相同的分辨率,周期
T仅为8个时钟周期,并且所需的时间常数t为前者的1/8,从而加快了建立速度时间乘以八。对于两个PWM信号(PWMH,PWML),RC滤波器中的电阻很容易实现这种布置:
图3 组合两个基于PWM的DAC输出
输出信号
U OUT由下式给出:
该技术已在TI MSP430F5132微控制器中实现:
// 在两个PWM中
配置 PWM - 32 kHz / 8 = 4 kHz :: 6位,
上电时仅执行一次
TA0CCR0 = 7; //最多7个(包括)
TA0CTL = TASSEL__ACLK | MC_1 | TACLR;
TA0CCR1 = 0; TA0CCTL1 = OUTMOD_6; //切换/设置
TA0CCR2 = 0; TA0CCTL2 = OUTMOD_6; //切换/设置
//
使用 ::写入PWM模块以实现所需的DAC输出
DAClevel ++; //下一个DAC级别,DAClevel是一个char
TA0CCR1 =(DAC等级>> 3)&7; //设置PWMH:MSB 3位
TA0CCR2 =(DAClevel)&7; //设置PWML:LSB 3位
图4 初始化和写入6位(3 + 3)基于PWM的DAC的代码
图5 基于6位PWM的DAC的测量输出; 蓝色:如图1所示(160ms建立); Violet:如图3所示(20ms解决)
可以使用1%电阻实现7位DAC。这次,两个PWM信号用于产生两个三位DAC,总共六位,并且在P3.7处MSb简单地设置为0或1。
图6 基于七位PWM的DAC的实现
图7 图6电路的测量输出; 注意良好的线性。
//
配置 PWM - 32 kHz / 8 = 4 kHz :: 7位,两个PWM和一个数字引脚,
上电时仅执行一次
//
与图5 中的
configure部分中给出的
相同
//
使用 ::写入定时器比较器以实现所需的DAC输出
DAClevel ++; //下一个DAC级别,DAClevel是一个char
TA0CCR1 =(DAC等级>> 3)&7; //设置PWMH,MSB,3位
TA0CCR2 =(DAClevel)&7; //设置PWML,LSB,3位
if(DAClevel&BIT6)P3OUT | = BIT7; 否则P3OUT&= ~BIT7; //设置MSB,无PWM
图8 初始化和写入7位(3 + 3 + 1)基于PWM的DAC的代码
这里的速度 提升甚至更大。一个简单的PWM DAC周期为128个时钟周期(128/32768 s -1 = 3.9ms),导致t为32·
T = 125ms,建立时间为5·125ms = 625ms。
图7稳定在40ms - 快16倍。更高阶的LPF也有助于缩短建立时间。