TI中文支持网
TI专业的中文技术问题搜集分享网站

脉冲计数器

设计脉冲计数器, 脉冲间隔0.5-2s, 最大计数值百万;

哪位给个程序设计思路, 或稳定的程序例程

—————————————分割线——————————————-

感谢chaosong huang1和 Lichen Wang 二位

进一步请教:

若同样的脉冲有多路, 譬如20路, 每一路记录的信号脉冲数要实时显示, 程序结构应该怎么设计?

谢谢.

user3917511:

MSP430的定时器中有比较捕获可以实现

比较模式:

这是定时器的默认模式,当在比较模式下的时候,与捕获模式相关的硬件停止工作,如果这个时候开启定时器中断,然后设置定时器终值(将终值写入TACCRx),开启定时器,当TAR的值增到TACCRx的时候,中断标志位CCIFGx置一,同时产生中断。若中断允许未开启则只将中断标志位CCIFGx置一。

例子:比较模式就像51单片机一样,要能够软件设置定时间隔来产生中断处理一些事情,如键盘扫描,也可以结合信号输出产生时序脉冲发生器,PWM信号发生器。如:不断装载TACCRx,启动定时器,TAR和TACCRx比较产生中断处理。

捕获模式:

利用外部信号的上升沿、下降沿或上升下降沿触发来测量外部或内部事件,也可以由软件停止。捕获源可以由CCISx选择CCIxA,CCIxB,GND,VCC。完成捕获后相应的捕获标志位CCIFGx置一

捕获模式的应用:

利用捕获源的来触发捕获TAR的值,并将每次捕获的值都保存到TACCRx中,可以随时读取TACCRx的值,TACCRx是个16位的寄存器,捕获模式用于事件的精确定位。如测量时间、频率、速度等

例子:利用两次捕获的值来测量脉冲的宽度。或捕获选择任意沿,CCISx=”11“(输入选择VCC),这样即当VCC与GND发生切换时产生捕获条件

结合利用:异步通讯

同时应用比较模式和捕获模式来实现UART异步通信。即利用定时器的比较模式来模拟通讯时序的波特率来发送数据,同时采用捕获模式来接收数据,并及时转换比较模式来选定调整通信的接受波特率,达到几首一个字节的目的

—————————————-

利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量。

本例程用到了定时器A的CCI1A端口(例如MSP430F14X的P1.2引脚)作捕获外部输入的脉冲电平跳变,同时结合简单的软件算法就能实现脉冲宽度的测量。在实际应用中可根据例程中的start,end,overflow三个变量来计算脉冲宽度。此功能模块在实际产品应用中体现出有较高的应用价值。

2-例程

#include

unsigned int start,end;

unsigned char overflow;

void main (void)

{

WDTCTL = WDTPW+WDTHOLD; //关闭看门狗定时器

P1DIR = BIT0+BIT4; //设置P1.0方向为输出

P1SEL = BIT2; //设置P1.2端口为功能模块使用

TACTL = TASSEL0+TACLR+TAIE+MC1; //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式

CCTL1 = MC0+SCS+CAP+CCIE; //输入上升沿捕获,CCI0A为捕获信号源

_EINT(); //中断允许

while(1); //LOOP

}

#pragma vector=TIMERA1_VECTOR //定时器A中断处理

__interrupt void timer_a(void)

{

switch(TAIV) //向量查询

{ case 2: //捕获中断

if(CCTL1&CM0) //上升沿

{

CCTL1=(CCTL1&(~CM0))|CM1; //更变设置为下降沿触发

start=TAR; //记录初始时间

overflow=0; //溢出计数变量复位

}

else if (CCTL1&CM1) //下降沿

{

CCTL1=(CCTL1&(~CM1))|CM0; //更变设置为上升沿触发

end=TAR; //用start,end,overflow计算脉冲宽度

}

break;

case 10: //定时器溢出中断

overflow++;

break; //溢出计数加1

default:break;

}

}

//例程结束

———————————–

Timer_A定时器:

注:msp430有两个16位定时器Timer_A和Timer_B.二者基本相同。

主要有TACTL,TAR,CCTL0,CCR0,CCTL1,CCR1,CCTL2,CCR2,TAIV几个寄存器。其中最主要的是TACTL寄存器,它决定Timer_A的输入时钟信号,Timer_A的工作模式,Timer_A的开启与停止,中断的申请等。

定时器A大致可分为四个功能模块:计数器、比较/捕获寄存器0、比较/捕获寄存器1、比较/捕获寄存器2。计数器是主体它是一个开启和关闭的定时器,如果开启它就是一直在循环计数,只会有一个溢出中断,也就是当计数由0xffff到0时会产生一个中断。那怎么实现定时功能呢?这就要靠三个比较/捕获寄存器了以后用CCRx表示。CCR0比较特殊,通过他可以改变计数器的最大计数值,也就是当计数器计数到CCR0的值时自动会将计数器清零。但这需要设置相应的工作模式,模式列表如下:

0——停止模式,用于定时器的暂停

1——增计数模式,计数器计数到CCR0,再清零计数

2——连续计数模式,计数器增计数到0xffff,再清零计数

3——增/减计数模式,增计数到CCR0,再减计数到0

当计数器计数到CCR0时,CCR0单元会产生一个中断。同样当计数器计数到CCR1和CCR2时,两个单元也都会个产生一个中断。这样我们可以通过定时器A得到三个定时时间了。

看程序中的定时器初始化模块。CCTLx是相应比较/捕获寄存器的控制寄存器。它可对比较/捕获寄存器进行设置,在这里只用到比较功能,也就是当计数到CCRx时产生中断,由于CCTLx默认的是比较功能,所以一般也就只用到CCIE这个控制字,就是开启相应比较器的中断。CCRx就是相应比较器的值。

下面介绍几个Timer_A的重要寄存器:

TACTL寄存器:

SSEL_1 SSEL_0 是时钟源的选择

0——TACLK,使用外部引脚信号作为输入

1——ACLK,辅助时钟

2——SMCLK,子系统主时钟

3——INCLK,外部输入时钟

对TACTL进行模式设置的同时也开启了定时器,要停止只需把MC_0赋值给TACTL就可以。

ID1 ID0 是时钟源的分频选择

00——不分频

01——2分频

10——4分频

11——8分频

MC1 MC0 是模式选择

0——停止模式,用于定时器的暂停

Lichen Wang:

如果你衹是要計數,可以更簡單化。例如外來脈衝是接在 Port 1, BIT3, 可用下列程式:

#include "msp430.h"void main( void ){  long int counter;  WDTCTL = WDTPW + WDTHOLD;  counter = 0;  P1IFG = 0;  do  {    if (P1IFG & BIT3)    {      P1IFG &= ~BIT3;      counter++;    }  } while (你還要計數);

顯視計數結果

}

Lichen Wang:

我上次的簡例是用 Port1 的 BIT3。 其實 Port1 和 Port2 所有的 BIT 都可以有同樣的功能。 所以可以依樣葫蘆,數十六個多路的脈衝。 此外再加上 chaosong huang1 建議的方法,不難再闊充更多路。

tao song1:

回复 Lichen Wang:

你好,想问一下你从外部输入的信号的最大的频率可以达到多少?

tao song1:

假如测一个1K到100K的信号频率,如果用定时1S的方法,然后利用timer的捕获模块捕获上升沿的个数,这样会不会误差比较大?

Ling Zhu2:

回复 tao song1:

可以参考 http://www.ti.com/tool/TIDM-FRAM-WATERMETER 设计中使用的频率测量方法,利用Timer_A和RTC 配合。

tao song1:

回复 user3917511:

TACTL = TASSEL0+TACLR+TAIE+MC1; //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式

定时器的时钟源选择ACLK,这样的话可以捕获到的信号的频率可以达到多少?

是不是只能最高到32.768KHz?

赞(0)
未经允许不得转载:TI中文支持网 » 脉冲计数器
分享到: 更多 (0)