如何获得更快的基于PWM的DAC

描述

当您需要来自没有数模转换器(DAC)的微控制器的模拟输出时,您可以连接外部DAC芯片。但是对于更便宜的解决方案,使用脉冲宽度调制(PWM)输出并添加低通滤波器(LPF)来提取其平均值,该平均值等于PWM信号的占空比。

PCB打样

图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 可以近似为:

PCB打样

对于6位DAC,? U OUT 应小于V CC /64,需要一个t <=> RC = 16·T的滤波器。

PCB打样

图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):

PCB打样

图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

PCB打样

图5基于6位PWM的DAC的测量输出;蓝色:实现如图1所示(160ms建立); Violet:如图3所示的实现(20ms建立)

7位DAC可以使用1%电阻实现。这次,两个PWM信号用于产生两个三位DAC,总共六位,并且在P3.7处MSb简单地设置为0或1.

图6七位基于PWM的DAC的实现

PCB打样

图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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分