基于MSP430 Timer_B的D/A转换及C语言源程序

最新更新时间:2013-10-16来源: 互联网关键字:MSP430  Timer_B  C语言  源程序 手机看文章 扫描二维码
随时随地手机看文章

本文分析了利用MSP430的Timer_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

关键字:MSP430  Timer_B  C语言  源程序 编辑:神话 引用地址:基于MSP430 Timer_B的D/A转换及C语言源程序

上一篇:适用于高增益应用高性能140V精准运算放大器
下一篇:Pericom推出全新HiFlex时钟发生器

推荐阅读最新更新时间:2023-10-12 20:50

MSP430 _data16_memzero问题
移植uCOS-II到MSP430一切都OK,后来加了TI的一个小的TCP/IP协议栈就老是死掉,纠结了两个晚上,现在把问题解决了。uCOS-II的运行需要一个时钟信号,也就是“心跳”信号,以此来进行系统运行和任务调度,我这里开了MSP430的看门狗中断作为“心跳”信号。第一个问题是我在创建任务之前开了总中断_EINT()函数,这就打开了看门狗中断,但是任务还没建立,怎么跑任务呢,那个看门狗时钟节拍中断就是任务切换用的,如果任务还没建立起来,也就是说任务的堆栈还没初始化,那任务指向哪里呢。这个问题找到了,但是另外一个问题又来了。当在一个任务中添加一个比较大的函数时(TCP监听处理函数)几死掉,进不了main函数,死在__data16
[单片机]
12位串行A/D转换器的原理及应用开发
摘要:介绍MAXl224,MAxl225系列12位串行模/数转换器(ADC),该系列器件具有低功耗、高速、串行输出等特点。详细描述MAX1224/MAX1225的功能、原理和使用方法,给出在AT89C51型单片机控制下该系列A/D转换器在数据采集系统中的应用及电路连接方法。 关键词:模,数转换器;MAXl224/MAXl225;数据采集;应用 1 引言 MAXl224/MAXl225系列12位模/数转换器(ADC)具有低功耗、高速、串行输出等特点,其采样速率最高可达1.5Ms/s,在+2.7V至+3.6V的单电源下工作,需要1个外部基准源;可进行真差分输入,较单端输入可提供更好的噪声抑制、失真改善及更宽的动态范围;同时,具有标准
[模拟电子]
步进电机控制程序(c语言+51单片机)
#include reg51.h #define uint unsigned int #define uchar unsigned char #define ms *77 // f = 12 M #define LEDLen 4 #define Dj_star() {IE=0x81; pri_dj=0; } #define Dj_stop() {IE=0x00; pri_dj=1; P1=0xff; shache="0"; delay(800ms); delay(800ms);delay(400ms); shache = 1; } #define Chilun_Num 8 /* 齿轮数 8 个*/ #define set_d
[单片机]
MSP430单片机各种寄存器总结(7)——USCI_A in UART mode
第七章 USCI 7.1 UCA1CTL1 【注意】配置USCI先将UCSWRST置位 7.2 UCA1BR0 & UCA1BR1 BRCLK预分频器 预分频系数=UCA1BR0 + UCA1BR1*256 7.3 UCA1MCTL 注意复习波特率的计算!! 7.4 UCA1RXBUF 接收数据的寄存器 7.5 UCA1TXBUF 发送数据的寄存器,写入后自动发送 7.6 UCA1IE & UCA1IFG 中断使能和中断标志位,其中TX是发送,RX是接受 UCTXIFG置位表明UCAxTXBUF为空,可向其写入待发送字符,若UCTXIE 和GIE也置位,将产生发送中断请求。写UCAxTXB
[单片机]
<font color='red'>MSP430</font>单片机各种寄存器总结(7)——USCI_<font color='red'>A</font> in UART mode
DS18B20,源程序测试OK
; FLAG1: 标志位,为 1 时表示检测到DS18B20 ; DQ: DS18B20的数据总线接脚 ; TEMPER_NUM:保存读出的温度数据 ; 本程序仅适合单个DS18B20和51 单片机 的连接, 晶振 为12M Hz 左右 TEMPER_L EQU 36H TEMPER_H EQU 35H DQ BIT P1.7 ; DS18B20初始化程序 ;//*****************************************// INIT_1820: SETB DQ NOP CLR DQ MOV R0,#06BH TSR1: DJNZ R0,TSR1 ;
[单片机]
MSP430 的 PxSEL1, PxSEL0 说明
1.在《User's Guide》10.2.5有寄存器的说明: 2.在《dataSheet》中,6.11.23中见Pin Functions,例:
[单片机]
<font color='red'>MSP430</font> 的 PxSEL1, PxSEL0 说明
基于51单片机的MODBUS通信C语言程序(从机)
#include reg52.h typedef unsigned char uint8; typedef unsigned int uint16; typedef unsigned long uint32; #define TIMER_HIGHT 0xf8 #define TIMER_LOW 0xcd sbit bRunLED =P3^4; //运行指示灯 sbit bWatchDog =P1^7; //看门狗复位 sbit b485Send= P1^3; //75LBC184 发送接收控制 uint32 dwTickCount,dw
[单片机]
提高PIC16C711单片机片内A/D分辨率方法
      摘要: 介绍一种将PIC16C711片内8位A/D提高到11位的方法。此方法电路简单,速度快,可提高单片机应用系统的性能价格比,具有一定的推广价值。    关键词: PIC16C711 单片机 A/D 分辨率   目前,单片机中嵌入的A/D一般为8位到10位,难以满足信号处理应用中高分辨率的要求;而外接高分辨率的A/D将使成本明显提高,因为A/D转换器的价格将随其位数的增加而成倍增加。本文介绍一种提高PIC16C711单片机片内A/D分辨率的方法,将PIC16C711片内的8位A/D提高到11位。这种方法在PIC系列的其他单片机也适用。   美国Microchip公司推出的8位单片机PIC16C
[单片机]
提高PIC16C711单片机片内<font color='red'>A</font>/<font color='red'>D</font>分辨率方法
小广播
最新模拟电子文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved