当您需要来自没有数模转换器(DAC)的微控制器的模拟输出时,您可以连接外部DAC芯片。但是对于更便宜的解决方案,使用脉冲宽度调制(PWM)输出并添加低通滤波器(LPF)来提取其平均值,该平均值等于PWM信号的占空比。
图1RC LPF提取PWM信号的平均值
RC滤波器去掉了非直流分量;剩下的是平均信号 U OUT 。如果PWM信号的周期 T 等于63个时钟,则信号 U OUT 可以具有64个离散DC之一值(0到63,六位分辨率)。
低通RC滤波器的时间常数t必须足够大,以平滑输出信号 U OUT 的。纹波,? U 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以前,将建立时间加快8倍。 RC滤波器中的电阻可以很容易地实现这种布置,用于两个PWM信号(PWMH,PWML):
图3组合两个基于PWM的DAC输出
输出信号 U OUT 由下式给出:
该技术已在TI MSP430F5132微控制器中实现:
//配置PWM - 32 kHz/8 = 4 kHz :: 6位两个PWM,上电时只执行一次
TA0CCR0 = 7;//最多7个(包括)
TA0CTL = TASSEL__ACLK | MC_1 | TACLR;
TA0CCR1 = 0; TA0CCTL1 = OUTMOD_6;//toggle/set
TA0CCR2 = 0; TA0CCTL2 = OUTMOD_6;//切换/设置
//使用::写入PWM模块以实现所需的DAC输出
DAClevel ++;//下一个DAC级别,DAClevel是char
TA0CCR1 =(DAClevel >> 3)&amp; 7;//设置PWMH:MSB 3位
TA0CCR2 =(DAClevel)&amp; 7;//设置PWML:LSB 3位
图4要初始化的代码&amp;写入6位(3 + 3)基于PWM的DAC
图5基于6位PWM的DAC的测量输出;蓝色:实现如图1所示(160ms建立); Violet:如图3所示的实现(20ms建立)
7位DAC可以使用1%电阻实现。这次,两个PWM信号用于产生两个三位DAC,总共六位,并且在P3.7处MSb简单地设置为0或1.
图6七位基于PWM的DAC的实现
图7图6电路的测量输出;注意良好的线性度。
//配置PWM - 32 kHz/8 = 4 kHz :: 7 bit in两个PWM和一个数字引脚,上电仅执行一次
//相同图5中configure部分
//使用::写入定时器比较器实现所需的DAC输出
DAClevel ++;//下一个DAC级别,DAClevel是char
TA0CCR1 =(DAClevel >> 3)&amp; 7;//设置PWMH,MSB,3位
TA0CCR2 =(DAClevel)&amp; 7;//设置PWML,LSB,3位
if(DAClevel&amp; BIT6)P3OUT | = BIT7;否则P3OUT&amp; = ~BIT7;//设置MSB,无PWM
图8初始化代码&amp;写入7位(3 + 3 + 1)基于PWM的DAC
全部0条评论
快来发表一下你的评论吧 !