MSP430定时器A捕捉脉实例

合集下载

使用MSP430的TB捕获器计算多路PWM脉宽

使用MSP430的TB捕获器计算多路PWM脉宽

/*LFX1-----32768HZP4.1<--------PWM input0P4.2<--------PWM input1P4.3<--------PWM input2P4.4<--------PWM input3*/#include <msp430x16x.h>#define TBLENGTH 0XFFvoid calPWM(unsigned char channel);//中断中的捕获值处理子程序声明// 上升沿捕获值,下降沿捕获值,PWM脉宽存放数组int pwm_start[4],pwm_end[4],pwm_dt[4];//定时器溢出标志,如果在溢出之前捕获到上升沿,在溢出之后捕获到下降沿,标志为0xff,否则为0unsigned char flag[4],flag_tov[4];void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTP4SEL =0x1e; //P4.1-4 CCI(1-4)B//捕获模式,上升沿和下降沿都捕获,捕获CCIxBTBCCTL1 =CAP+CM_3+CCIS_1+SCS+CCIE;TBCCTL2 =CAP+CM_3+CCIS_1+SCS+CCIE;TBCCTL3 =CAP+CM_3+CCIS_1+SCS+CCIE;TBCCTL4 =CAP+CM_3+CCIS_1+SCS+CCIE;// ACLK, 连续模式(0-FF),8分频,定时器长度,定时器溢出中断,这些可以根据自己的设计重新定义TBCTL = TBSSEL_1 + MC_2+ID_3+CNTL_3+TBIE ; _EINT();while(1);{}}//捕获值处理子程序,channel为通道值,范围0-3,对应存放的数组的序号void calPWM(unsigned char channel){unsigned volatile short *tbcctlx,*tbccrx;tbcctlx=&TBCCTL1+channel;tbccrx=&TBCCR1+channel;if(*tbcctlx & CCI)//上升沿判断{pwm_start[channel]=*tbccrx;flag[channel]=0;}else //否则就是下降沿{if(flag[channel]==0xff)//如果捕获跨越了定时器溢出边沿{flag[channel]=0;pwm_dt[channel]=TBLENGTH-pwm_start[channel]+*tbccrx+1;}elsepwm_dt[channel]=*tbccrx-pwm_start[channel]+1;}}//每次定时器溢出检查是否有通道断开,,每个定时器周期中至少PWM更新一次,否则认为断路void brkChk(unsigned char channel){ flag[channel]=0xff;if (flag_tov[channel]==0)pwm_dt[channel]=0;flag_tov[channel]=0;}// Timer_A3 Interrupt Vector (TAIV) handler #pragma vector=TIMERB1_VECTOR__interrupt void Timer_B(void){switch(TBIV){case 2://捕获器1flag_tov[0]++;calPWM(0);break;case 4://捕获器2flag_tov[1]++;calPWM(1);break;case 6://捕获器3flag_tov[2]++;calPWM(2);break;case 8://捕获器4flag_tov[3]++;calPWM(3);break;case 14 ://TBIFGbrkChk(0);brkChk(1);brkChk(2);brkChk(3);break;}}。

MSP430G2553捕获程序案例与经验分享

MSP430G2553捕获程序案例与经验分享

MSP430G2553捕获程序案例与经验分享MSP430G2553单片机定时器A有3个捕获比较寄存器CCR0,CCR1,CCR2.。

MSP430G2553捕获程序应用很广泛,电子工程师可以多加了解。

所谓捕获,就是我们来检测外围的信号跳变时刻(此时信号理解为数字信号,即脉冲),此信号乃为我们捕获的对象,可以测量信号的脉冲宽度,即频率等。

捕获首先需要考虑的初始化工作1.设置BCS模块,确定系统时钟MCLK子系统时钟SMCLK把MCLK设置为8MHZ,SMCLK设置为1MHZ。

2.捕获输入引脚的选择选择IO引脚时应查阅器件的手册,能够快速的查阅PDF资料找到正确的答案是一个程序员的基本素质。

3.程序设计思路根据测频的原理,需要2次捕获才能测量一次输入信号的频率。

因此要定义2个变量保存2次捕获结果。

变量是无符号的整数型变量(与捕获寄存器的字长匹配)。

输入信号与CPU的工作是异步的,所以设计程序的时候是不知道什么时候才有捕获输入。

程序处理何时发生了捕获的方法有2种一是查询的方法,定时器硬件在发生捕获事件后会置捕获中断表示CCIF为1,程序在主循环里不断的查询这个标志即可判断是否有捕获事件发生。

二是定时器中断法,当发生捕获事件时必产生定时器中断,在中断中读取捕获寄存器即可。

查询的方法不是好的程序设计方法,因为查询时要占用CPU,使得CPU不能再做其他任务。

中断的方法对初学者有一定的困难。

即中断程序如何与主程序通信(交换信息)。

理解中断及设计中断服务程序要困难一些。

捕获模式捕获外部输入的信号的上升沿或下降沿或上升沿下降沿都捕捉,当捕捉发生时,把TAR 的值装载到TACCRx中,同时也可以进入中断,执行相应的操作。

这样利用捕捉上升沿或。

MSP430定时器

MSP430定时器

比较输出电路
x=0,1,2
OUTx
x=0,1,2
输出方式选择 除方式0外,OUTx在Timer Clock
(8种)
的上升沿处改变
OUTx
OUTMODx = 000,输出方式0,OUTx = OUT
OUT=TACCTLx.2
1
输出方式 0 可用于输出信号的初始化
OUTx
x=0,1,2
OUTMODx ≠ 000,输出方式1~7 OUTx 与 OUT 无关
定时器 A 的四种计数方式(Count Mode)
MCx count mode
0 0: stop mode 0 1: up mode 1 0: continuous mode 1 1: up/down mode
Mode Control
Stop mode : the timer is halted
0: 比较方式 1: 捕捉方式
输出方式,8种
输出方式0的 直接输出编程位
中断标志
1: 中断允许
1: 捕捉溢出
Capture/Compare Block , 以 CCR2 为例
CAP=0 : Compare Mode 比较方式 CAP=1 : Capture Mode 捕捉方式
捕捉方式( Capture Mode , CAP=1 )
当不使用Timer时, 应将Timer配置为Stop mode , 这样可以降低芯片的功耗
Up Mode 锯齿波方式,需要CCR0(比较方式)协助
在Timer Clock的上升沿处TAR=TAR+1, 当TAR≥TACCR0时,自动清零TAR
period=(TACCR0+1)×T
T
Continuous Mode

MSP430 定时器A的使用

MSP430 定时器A的使用

第四讲定时器A的使用MSP430F413芯片中含有TimerA3模块,如图1-2所示。

其常用的外引线有三条:TACLK、TA1和TA2。

TACLK:定时器_A输入时钟(48脚),与P1.6和ACLK输出共用同一引脚。

TA1:定时器_A的第一通道输入、输出引脚(51脚)。

捕获方式:CCI1A输入;比较方式:OUT1输出。

TA2:定时器_A的第二通道输入、输出引脚(45脚)。

捕获方式:CCI2A输入;比较方式:OUT2输出。

1.定时器A功能及结构定时器A基本结构是一个十六位计数器,由时钟信号驱动工作,结构框图如图4-1所示。

图4-1 定时器A结构图定时器A具有多种功能,其特性如下:(1)输入时钟可以有三种选择,可以是慢时钟(ACLK)、快时钟(SMCLK与单片机主时钟同频)和外部时钟。

(2)能产生的定时中断、定时脉冲和PWM(脉宽调制)信号,没有软件带来的误差。

(3)不仅能捕获外部事件发生的时间,还可选择触发脉冲沿(由上升沿或下降沿触发)。

定时器A功能模块主要包括:(1)计数器部分:输入的时钟源具有4种选择,所选定的时钟源又可以1、2、4或8分频作为计数频率,Timer_A可以通过选择4种工作模式灵活的完成定时/计数功能。

(2)捕获/比较器:用于捕获事件发生的时间或产生时间间隔,捕获比较功能的引入主要是为了提高I/O 端口处理事务的能力和速度。

不同的MSP430单片机,Timer_A模块中所含有的捕获/比较器的数量不一样,每个捕获/比较器的结构完全相同,输入和输出都取决于各自所带控制寄存器的控制字,捕获/比较器相互之间完全独立工作。

(3)输出单元:具有可选的8种输出模式,用于产生用户需要的输出信号,支持PWM输出。

2.定时器工作模式(1)停止模式:停止模式用于定时器暂停,并不发生复位,所有寄存器现行的内容在停止模式结束后都可用。

当定时器暂停后重新计数时,计数器将从暂停时的值开始以暂停前的计数方向计数。

LaunchPad-MSP430入门系列4-定时器模块(定时、计数、捕获)

LaunchPad-MSP430入门系列4-定时器模块(定时、计数、捕获)

LaunchPad-MSP430入门系列4-定时器模块(定时、计数、捕获)Version 1.2文先,介绍几个英文缩写的意思以及一些注意的地方。

1.Timer0/1 定时器0/1,在User's Guide中用的是TimerA/B,所指的也是Timer0/1 。

G2553Datasheet中用的是Timer0/1 ,本文以G2553Datasheet为准。

全文以Timer0为例,Timer1类同。

2.TAxR(x = 0/1)定时器x对应的计数器,这是一个只读寄存器。

硬件自动驱动计数。

3.EQUy(y = 0/1/2)计数事件发生寄存器,当TAxR = TAxCCRy时EQUy置1。

4.定时器简介MSPG2553共有两个定时器,Timer0、Timer1,他们都是十六位的定时、计数器,内含三个捕获、比较寄存器。

两个定时器均支持多个捕获、PWM输出、间歇性计时,定时器包含多个中断源,可以是计数溢出中断、捕获中断等等。

定时器包含:●同步十六位定时、计数器运行模式。

●时钟源可从MCLK、SMCLK、ACLK任意选择。

●三个比较、捕获寄存器。

●中断向量寄存器能快速解码的所有定时器中断本文以Timer0为例详细介绍430的定时器模块,下图是Timer0组成框图0-1定时器0组成框图下面简要介绍一下该硬件框图的意思,从左上角看,首先是一个时钟源选择寄存器TASSELx,通过该寄存器选择定时器的时钟源,选择了时钟源后有一个分频器Divider,相应的设置寄存器是IDx,再过来就到一个定时器的核心部分,一个16位的定时器TAR。

其右侧有一个定时器的计数模块,MCx寄存器用来设置计数模式。

接下来,TAR正下方有三个横线,右侧标有CCR0、CCR1、CCR2,意思是CCR1、CCR0的框图和下方CCR2的框图是一样的。

此处省略不写。

在CCR中,左上角为一个捕获源选择寄存器。

可以从CCI2A、CCI2B、GND或者VCC选择捕获源,选择捕获源后有一个选择捕获模式寄存器Capture Mode,然后过来有一个捕获溢出状态寄存器COV,SCS同步/异步捕获模式选择位,然后连接到捕获比较寄存器。

S.D.Lu的MSP430入门学习笔记(9):定时器TimerA(4)捕获功能

S.D.Lu的MSP430入门学习笔记(9):定时器TimerA(4)捕获功能

S.D.Lu的MSP430入门学习笔记(9):定时器TimerA(4)捕获功能本篇笔记介绍如何使用TimerA的捕获模式校准DCO、测量方波信号的频率/周期、脉宽和占空比。

对DCO时钟进行校准对信号脉宽、占空比等参数的测量要求高频时钟。

但是MSP430G2452的不支持外部高频时钟,所以不能使用外部高频晶振作为时钟源。

内部数控时钟DCO就成了唯一选择。

虽然TI在出厂时对MSP430的DCO进行了校准,保存了1MHz、8MHz、12MHz、16MHz这几个频率的校准值,但是由于工作环境的不同,会因为温度等因素的影响而产生较大的偏差。

所以,在对时钟要求较高的设计中,最好对其进行再次校准。

对DCO进行校准的基本原理是用TimerA定时器的捕获/比较功能,进行两个频率的比较,然后根据比较结果调整DCO的输出,直到得到指定频率。

具体方法是,使用外部的32768Hz晶振作为基准时钟源,使用TimerA的捕获功能对DCO的频率进行测量,然后通过DCOx、MODx和RSELx位来调节DCO的频率,直到其输出等于想要的频率。

请看例程:本例中,P1.4用于输出SMCLK,即DCOCLK,程序运行时,可以用示波器观察P1.4口的信号,以确认当前的DCOCLK频率。

同时,在不同DCO频率下,可以观察到P1.0上的LED闪烁频率不同。

在21~24行选择任意一行,屏蔽其它3行,可以得到16MHz、12MHz、8MHz、1MHz不同的DCOCLK频率。

函数void Set_DCO(unsigned int Delta);的作用就是设定DCO输出指定频率。

应该注意的是,参数Delta的单位是4069Hz。

下面对该函数的代码进行分析。

37行,对LFXT1CLK进行8分频作为ACLK,因为本例中LFXT1使用外部32768Hz 晶振,所以ACLK=32768Hz/8=4096Hz,这就是Delta的单位。

38行,将CCR0单元设置为捕获上升沿模式,信号输入为CCI0B,即ACLK=4096Hz。

MSP430F149的定时器A操作

MSP430F149的定时器A操作

MSP430F149的定时器A定时操作1)定时器A的图解图1 定时器A图解2)定时器A的四种计数模式。

1.停止模式。

2.增计数模式。

(产生两个中断标志)也就是当计数到跟TACCR0一样的时候,就返回0,重新计数。

当计数到TACCR0的同时产生一个中断标志CCIFG,而当计数器溢出返回零的同时又同时产生一个中断标志TAIFG。

如图:图2 增计数模式的波形图3.连续计数模式。

(产生一个中断标志)也就是计数器将直接计数到计数器所能计数的最大值0FFFFH之后重新返回零,再次计数。

返回零的同时产生一个TAIFG中断标志。

如图:4.增减计数模式。

(产生两个中断标志)也就是当计数器计数到跟TACCR0一样的之后,然后从TACCR0开始又减少,直到为零,然后又开始增。

当计数跟TACCT0一样的时候产生一个中断标志CCIFG,当减到为零的时候又产生一个中断标志TAIFG。

如图:注意:当重新写入TACCR0数值的时候,当新的数据大于原来的数值的时候,计数器将计数到新的数值才重新返回零;当新的数据小于原来的数值的时候,计数器将直接返回零重新计数。

3)定时器A的寄存器。

1.TACTL●TASSELx:计时器A的时钟来源选择。

●IDx:计时器A时钟的分频选择。

●MCx:计时器A四种计数模式选择。

●TACLR:计数器A的TAR计数清零,同时也可以清楚时钟分频器和计数方向。

●TAIE:TAIFG中断标志使能。

在捕获模式下可以打开所有CCIFG的中断使能。

●TAIFG:中断标志位。

2.TAR计数器的计数寄存器。

3.TACCTLx●CMx:捕获模式选择。

00:关闭;01:上升沿捕获;10:下降沿捕获;11:上升下降沿捕获。

●CCISx:捕获引脚选择。

●SCS:选择捕获电平方式。

0异步时钟;1同步时钟。

●SCCI:锁存同步时钟输入端。

也就是锁存EQUx的值,以供CPU读取。

●CAP:捕获模式和比较模式选择。

0比较;1捕获。

●OUTMODx:输出模式选择。

基于MSP430F5438A单片机测量频率的程序实例

基于MSP430F5438A单片机测量频率的程序实例

基于MSP430F5438A单片机测量频率的程序实例基于MSP430F5438A单片机测量频率的程序实例/*****************************************************程序描述:利用Timer_A捕获脉冲宽度利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量程序用到了定时器A的CCI1A端口(MSP430F14X的P1.2引脚)作捕获外部输入的脉冲电平跳变,start,end,两个个变量来计算脉冲宽度*****************************************************/#include"msp430x14x.h"#include"lcd12864.h"uint start,end;uint width;//==用于存放脉宽==uint period;//==用于存放周期==uint frequency;//==用于存放频率==uint fy[7];//==用于存放频率显示数据==uint pd[7];//==用于存放周期显示数据==uint wh[6];//==用于存放脉宽显示数据==const unsigned char zhouqi[]={"周期为:(us) "};const unsigned char us[]={"us "};const unsigned char pinlv[]={"频率为:(Hz) "};const unsigned char hz[]={"HZ "};void process(void);//==函数声明==void delay();//==延时函数==void InitSys(); //==初始化时钟==/****************************************************主函数****************************************************/int main(void){WDTCTL = WDTPW + WDTHOLD;//==关狗==InitSys();//==初始化时钟,SMCLK,MCLK均为8M==P1DIR&=~BIT2;P1SEL = BIT2;//==设置P1.2端口为功能模块使用,即:做捕获源==TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC1;//==定时器A时钟信号选择SMCLK,8分频,同时设置定时器A计数模式为连续增计模式==CCTL1 =CM_1+SCS+CAP+CCIE;//==输入上升沿捕获,CCI0A为捕获信号源==_EINT();//==开全局中断允许==Ini_Lcd();//==初始化液晶==Clear_GDRAM();//==清屏==Disp_HZ(0x80,zhouqi,8);Disp_HZ(0x88,pinlv,8);while(1){process();Write_Cmd(0x90);//==写地址==Write_Data(0x30+pd[6]);Write_Data(0x30+pd[5]);Write_Data(0x30+pd[4]);Write_Data(0x30+pd[3]);Write_Data(0x30+pd[2]);Write_Data(0x30+pd[1]);Write_Data(0x30+pd[0]);Write_Cmd(0x98);//==写地址==Write_Data(0x30+fy[6]);Write_Data(0x30+fy[5]);Write_Data(0x30+fy[4]);Write_Data(0x30+fy[3]);Write_Data(0x30+fy[2]);Write_Data(0x30+fy[1]);Write_Data(0x30+fy[0]);delay();}}/*****************************************************初始化时钟*****************************************************/ void InitSys(){unsigned int i;//--- 使用XT2振荡器---BCSCTL1&=~XT2OFF;//==打开XT2振荡器==do{IFG1 &=~OFIFG;//==清除振荡器失效标志==for(i = 0xFF; i > 0; i--);//==延时,等待XT2起振==}while((IFG1 & OFIFG)!= 0);//==判断XT2是否起振== BCSCTL2 =SELM_2+SELS;//==选择MCLK、SMCLK为XT2,8M== }/*****************************************************延时函数*****************************************************/void delay(){unsigned int i;unsigned int j=10;for(i=10;i>0;i--){while(j--);}}/***************************************************数据处理***************************************************/void process(void){while(end<start);< bdsfid="155" p=""></start);<>//while(endstart width = end-start;//==实际脉冲宽度的计算==period = 2* width;frequency=1000000/period;pd[6]=period/1000000;pd[5]=(period-1000000*pd[6])/100000;pd[4]=(period-1000000*pd[6]-100000*pd[5])/10000;pd[3]=(period-1000000*pd[6]-100000*pd[5]-10000*pd[4])/100 0;pd[2]=(period-1000000*pd[6]-100000*pd[5]-10000*pd[4]-1000*pd[3])/100;pd[1]=(period-1000000*pd[6]-100000*pd[5]-10000*pd[4]-100 0*pd[3]-100*pd[2])/10;pd[0]=period%10;fy[6]=frequency/1000000;fy[5]=(frequency-1000000*fy[6])/100000;fy[4]=(frequency-1000000*fy[6]-100000*fy[5])/10000;fy[3]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4])/10 00;fy[2]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-100 0*fy[3])/100;fy[1]=(frequency-1000000*fy[6]-100000*fy[5]-10000*fy[4]-100 0*fy[3]-100*fy[2])/10;fy[0]=frequency%10;}/***************************************************中断处理函数***************************************************/#pragma vector=TIMERA1_VECTOR //==定时器A中断处理==__interrupt void timer_a(void){switch(TAIV)//==向量查询=={case 2://==捕获中断==if(CCTL1&CM0)//==捕获到上升沿=={CCTL1=(CCTL1&(~CM0))|CM1;//==更变设置为下降沿触发== start=TAR;//==记录初始时间==}else if(CCTL1&CM1)//==捕获到下降沿=={CCTL1=(CCTL1&(~CM1))|CM0;//==更变设置为上升沿触发== end=TAR;//==用start,end,overflow计算脉冲宽度==}break;default: break; } }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MSP430定时器A捕捉脉实例[调试通过,很好用]
微控论坛原创主贴作者:fangth
Microcontrol CODE
/*****************************************************************
//功能:利用定时器A的捕捉能测量脉冲信号的脉宽
//
//
// MSP430F449
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | P1.5/ACLK|---+
// | | |
// | P2.0/TA2|<--+
// | |
// | |
//说明:ACLK要进行8分频(4K),并将其作为外部的要捕获的脉冲;
//MCLK=SMCLK=8M;
*****************************************************************/
#include <msp430x44x.h>
int pwm_start,pwm_end,pwm_wide=0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR = 0x20; // P1.5 输出
P1SEL = 0x20; // P1.5输出ACLK
P2SEL|=BIT0; //P2.0 CCI2A
SCFI0 |= FN_4;
SCFQCTL = 121; // (121+1) ×32768 *2= 7.99Mhz
FLL_CTL0=DCOPLUS+OSCCAP1; //MCLK=SMCLK=8M
FLL_CTL1 |= FLL_DIV_8; //ACLK要进行8分频,ACLK=4K
TACCTL2 =CAP+CM_3+CCIS_0+SCS+CCIE; //捕获模式,上升和下降都捕获,选择CCI2A,同步,捕获中断开
//Capture input select: 0 - CCI2A
TACTL = TASSEL_2 + MC_2 ; //SMCLK=8M,L连续计数模式
_EINT(); //开总中断
LPM0;
_NOP();
pwm_wide=pwm_end-pwm_start;
while(1);
}
// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{case 2:break;
case 4:
if(TACCTL2 & CCI)
pwm_start=CCR2;
else
pwm_end=CCR2;
//pwm_wide=pwm_end-pwm_start;
break;
case 10:
break;
}
LPM0_EXIT;
}
检验方法:
在调试环境下,在watch 窗口观察pwm_end和pwm_start,然后相减!
我计算了一下。

在所给的例子中理论值pwm_end-pwm_start=976
通过观察的结果是978,还是有点误差,可能是由于晶振的值原因,计算上的舍入有点偏差。

相关文档
最新文档