您的位置 首页 技术

根据MSP430 Timer_B的D/A转化及C言语源程序

本文分析了利用MSP430的Timer_B在比较模式下输出的脉宽调制(PWM)波,来实现D/A转换的工作原理。介绍了利用MSP430F449的Timer_B的PWM输出产生正弦波和直流电平的方法,并给

本文剖析了使用MSP430Timer_B在比较形式下输出的脉宽调制(PWM)波,来完结D/A转化的作业原理。介绍了使用MSP430F449的Timer_B的PWM输出发生正弦波和直流电平的方法,并给出了对应的硬件电路和C言语源程序

1.简介

1.1 MSP430单片机介绍

尽管现在在国内商场上使用较多的单片机仍然是8位单片机,可是由美国德州仪器(TI)公司推出的16位单片机MSP430具有处理能力强、运转速度快、低功耗、指令简略等长处。并选用了JTAG技能、FLASH在线编程技能、BOOTSTRAP等许多先进技能,因而具有很高的性价比,在欧洲商场已得到了十分广泛的使用。尽管MSP430进入国内商场的时刻不是很长,可是因其具有以上所述的杰出质量,一进入国内商场就被许多电子工程师所喜爱。其间MSP430F449具有7个作业形式可选8、10、12、16的16位计数器。用其比较形式发生的PWM能够完结D/A转化(D/A conversion)。

1.2 PWM D/A简介

许多嵌入式微操控器(microcontroller)使用都需求发生模拟信号。这种情况下往往是选用集成的或许是分立的数模转化器DAC(digital-to-analog converter)来完结。可是选用脉宽调制PWM(pulse-width modulated)信号来完结D/A转化(简写为PWM D/A)也是一种常用的方法。能够用PWM信号发生所需的直流或沟通信号。这篇文章以MSP430F449的Timer_B输出的PWM为例来发生一个200Hz的正弦波和一个0.5VCC的直流电平。实践上相似的方法能够用于Timer_A以及MSP430其它类型的单片机。

2. 用PWM完结DAC的原理

2.1 基本原理

PWM信号是一种具有固定周期(T)不定占空比()的数字信号,如图1所示。假如PWM信号的占空比随时刻改变,那么经过滤波之后的输出信号将是起伏改变的模拟信号。因而经过操控PWM信号的占空比,就能够发生不同的模拟信号。在MSP430F449中便是选用CCR0来操控周期T,而用与定时器对应的CCRx寄存器来操控可变占空比,从而完结D/A转化。

2.2 分辨率

图1 PWM信号示意图

根据Timer_B PWM的DAC分辨率就等于计数器的长度,一般是CCR0寄存器的值。PWM DAC的最低有用位是一个计数值,分辨率是总的计数值。

Rcounts = Lcounts

其间Rcounts是以计数值为单位的分辨率,Lcounts是计数器的总计数值。例如对8-bit DAC,计数器的长度为8 bits,或许256个计数值。那么分辨率也便是8 bits,或许256。

更一般的情况下,根据PWM定时器和滤波器的PWM DAC的分辨率等于发生模拟信号的PWM信号的分辨率。PWM信号的分辨率决议于计数器的长度和PWM计数器能够完结的最小占空比。用数学表达式如下:

在这儿,是所需的PWM定时器频率,是PWM信号的频率,也便是DAC的更新频率,n 是所需的比特分辨率。下文行将描绘怎样选用8-bit PWM DAC来同步发生一个200Hz的正弦波。由抽样定理可得,最低的抽样频率应该为400Hz。可是一般情况下,PWM信号的频率要远高于Nyquist抽样速率。这是由于PWM信号的频率越高,对滤波器的阶数就要求越低,适宜的滤波器越简略完结。一般抽样速率取Nyquist速率的16或许32倍。

2.4 所需的MSP430资源

文中的比如是用MSP430F449的Timer_B再加外部滤波器来发生一个200Hz的正弦波和一个0.5VCC的直流电平的。将Timer_B装备为16-bit、up形式。在这种形式下计数器计数至CCR0,然后复位从0开端从头计数。给CCR0赋值255也就意味着计数器的长度为8bits。CCR1和TB1用于发生正弦波,CCR2和TB2用于发生直流电平。输出形式都选为形式7,即PWM复位/置位形式。如图2所示,在这种形式下,复位后每一个定时器的输出都为高电平,直到计数器到达各自的CCRx值时变为低电平,当计数器到达CCR0时再置位。也便是说CCRx的值决议了各自正脉冲的宽带。若CCRx的值是改变的,就能够发生可变宽度的脉冲,下文中的正弦波便是用这种方法发生的;若不变则发生的是固定宽度的脉冲,下文中的直流电平便是这样发生的。最终SMCLK用作Timer_B的时钟源。体系选用32768Hz的挂钟晶振,经过选用内部硬件锁频环FLL(frequency-locked-loop),来校准DCO(Digital Control Oscillator)频率为体系供给MCLK/SMCLK时钟。

图2 输出形式7:PWM复位/置位示意图

3. 完结电路

用Timer_B PWM完结DAC外围电路比较简略,如图3所示。实践上外围电路便是晶振电路和RC低通滤波器。

图3 MSP430F449完结D/A电路图

3.1 正弦信号的发生

在这个比如中,一个正弦波用32个抽样值生成。正弦波的频率为200Hz,所以每秒要抽样200×32=6400次,也便是说=6.4KHz。每完结一次抽样要计数28,所以所需的时钟频率为。抽样值包含在程序开端的一个正弦表中,经过调用中止函数,在每个PWM周期结束时,将新的正弦波抽样值载入捕获/比较寄存器CCR1中。因而发生的PWM信号的脉冲宽度就决议了正弦波在每一个时刻的抽样值,将这个PWM信号经过低通滤波,即得所需的正弦波。

3.2 直流电平的发生

直流电平发生比较简略,由于它对应的PWM占空比是必定的。直流电平直接正比于PWM信号的占空比。要发生0.5VCC的直流电平,PWM的占空比显然是50%(考虑到损耗,实践应大一些)。只需求简略地将CCR2的值设置为128,并且无须改变就能够得到50%占空比的PWM信号。将得到的PWM信号经过RC网络进行低通滤波,即可得到0.5VCC的直流电平。

3.3 滤波器规划

图4 软件流程

对两路输出都选用了结构简略的RC滤波器,如图3所示。之所以选用这种结构,一是由于RC滤波器结构简略,二是为了完结低功耗,尽量防止选用有源器材。

用于沟通信号的滤波器是一个双极点级联RC滤波器。假如滤波器阶数过高,能够选用进步的抽样频率的方法来下降滤波器阶数。滤波器的到频率fc由下式来核算:

当R2 ? R1时滤波器的呼应较好。可是假如到频率很挨近信号带宽边缘,将会导致相当大的衰减。因而为了减小滤波器的衰减,到频率应该大于信号带宽边缘,可是要远小于PWM信号的频率。

用于发生直流电平的滤波器仅仅是用来贮存电荷的,而不像沟通信号滤波器那样用来滤波。因而选用了一个简略的单极RC滤波器。

4.程序流程

用MSP430F449的Timer_B的PWM来发生正弦波和直流电平的程序比较简略,流程如图4所示。MSP430F449本身有FLL,可用它来完结DCO的频率校准。可是DCO的频率只能锁定在ACLK的整数倍上,所以关于没有FLL的器材,或许所需频率不是ACLK整数倍的情况下,要用Timer_A或许其它的定时器进行DCO频率校准,这也便是所谓的“软锁频”。事实上实践的D/A转化常常是一些随时刻改变的非周期信号。它们对时钟的精度要求不是很高,因而大多数情况下硬件FLL是能够担任的。

5. 程序清单

MSP430的别的一个特点是用C言语编写程序简略,并且功率较高。本例就选用C言语编写了程序。清单如下:

#include 《msp430x44x.h》

#include 《math.h》

int SampleTimes=0;

//***界说正弦表,并用32个抽样值初始化正弦表,不要用“0”抽样***//

int SinTable[]={255,254,246,234,219,199,177,153,128,103,79,57,37,22,10,2,

1,2,10,22,37,57,79,103,128,153,177,199,219,234,246,255};

void main(void)

{

int i;

WDTCTL = WDTPW +WDTHOLD; // 制止看门狗定时器

//***初始化端口***//

P2DIR |= 0x0C; // P2.2和P2.3为输出

P2SEL |= 0x0C; // P2.2和P2.3分别为TB1和TB2

//***设置体系时钟***//

FLL_CTL0 = XCAP18PF; // 设置XTAL1的负载%&&&&&%

SCFQCTL = 50-1; // 1.6384MHz/32768Hz = 50,fDCO=MCLK=1.6384MHz

for (i = 50000; i; i–); // 晶振初始化延时

//***设置Timer_B***//

TBCTL = TBSSEL1 + TBCLR; // 挑选SMCLK为时钟,定时器铲除

TBCTL|=MC_1+CNTL_0+TBCLGRP_0; //挑选up,16位形式

TBCCTL0=CCIE; //将CCR0设为比较形式,中止答应

TBCCR0=256-1; //PWM的周期为256,也便是DAC为8bit

TBCCTL1=OUTMOD_7+CLLD_1; //将CCRx设为比较形式,中止制止

TBCCTL2=OUTMOD_7+CLLD_1; //挑选输出形式7,当TBR计数到0时CCRx数据加载到TBCTLx

TBCCR1=SinTable[SampleTimes]; //将正弦表加载到CCR1

TBCCR2=128; //PWM的占空比为50%,发生0.5VCC的直流电平

_EINT(); //中止答应

for (;;)

{ _BIS_SR(LPM0_bits); //CUP进入低功耗形式

_NOP();

}

}

//调用中止函数

interrupt [TIMERB0_VECTOR] void Timer_B(void)

{

SampleTimes=(SampleTimes+1)%32;

TBCCR1=SinTable[SampleTimes]; //将新的抽样值装入CCR1

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/267970.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部