6201|11

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【求助】timerA捕获问题 [复制链接]

我用timerA的TA2(msp430f149 p1.3)对脉冲进行上升沿和下降沿进行捕获,从而计算脉冲宽度,进中断没问题,也能计算出宽度,但就是计算的值不对, 我得脉冲宽度是104。17us,相当于波特率为9600bps,外部晶振2.4576MHz,我计算出的脉冲宽度,new_ccr2 - old_ccr2 = 0x0049,显然不对,但我实在找不出毛病,现将我的部分程序贴上,请高手给分析一下。

中断函数:
Timer_A1
ADD &TAIV,PC
RETI
RETI
JMP CC2_INT

CC2_INT
MOV &CCR2,R14 //新值
MOV R14,R15
SUB R13,R15 //计算时钟数
MOV R14,R13 //旧值

.
.
.

主函数timerA初始化




MOV #TACLR+MCLK+MC_2,&TACTL //定时器A连续模式
MOV #CM_3+SCS+CAP+CCIE,&CCTL2 //上升沿下降沿均捕获

p1.3端口的模块化功能已初始化,即P1SEL |= BIT3;

请高手指点,不胜感激。

最新回复

算了,其实不用管波特率的问题了,仅仅是脉冲宽度就可以了,就是104.17us的脉冲宽度,晶振我测过了,没啥问题,timerA的时钟源我设的mclk,为了确信时钟没问题,我让p5.4输出mclk,虽说波形质量是差了点,但是频率还可以。关于溢出问题,第一次捕捉到上升沿(或下降沿)的时候,TAR的值可能是0到65535之间的任意值,但是第一次进的时候我已经清零了,咱们上面的那个程序就是这样做的,其实那样做,已经排除了tar溢出的可能性,你说呢?  详情 回复 发表于 2006-5-15 14:37
 
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
每次TA捕获中断后,都清除一次TAR试试?
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
老大,这样好像不行吧,因为是捕获时的TAR值给了CCR2,进了一次清掉后又从零,这样就没法计算差了,两次捕获,应该时同一起始点的两值差,刚才我按您的说的试了一下,确实不行。麻烦您再看看还有没有别的原因。我刚才改了一下程序,将上升沿和下降沿均捕获,改为上升沿或下降沿捕获,得到的结果确实是那个错误结果的两倍。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
1、第一次进入时,TAR已经被自动复制到CCR2,这个值不用。
2、给TAR清零。
3、第二次进入时,TAR又被自动复制到CCR2,用这个值。
4、再次给TAR清零。
5、如此循环。
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

5
 
老大的意思是每次都是0基础上的计数是吧
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
我按我对那个方法的理解,写了如下代码,测的结果不对,每次的结果是0x023E,这次结果是偏大了,这至少说明TAR的值,严重影响了结果,你看我理解的是不是有问题啊

CC2_INT
MOV TEST_STEP(R6),PC

TEST_STEP
DW TEST_STEP1
DW TEST_STEP2


TEST_STEP1
CLR TAR
INCD R6
RETI

TEST_STEP2
MOV &CCR2,R14
CLR TAR
RETI

这样每次进中断都进TEST_STEP2,实际上都再R14里。这里面是不是需要修正呢?我每次再TEST_STEP2 的 CLR TAR 语句前面设了断点,看R14里面的值,这样做有啥不妥吗?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

7
 
CC2_INT
MOV TEST_STEP(R6),PC

TEST_STEP
DW TEST_STEP1
DW TEST_STEP2


TEST_STEP1
CLR TAR
INCD R6
RETI

TEST_STEP2
MOV &CCR2,R14
CLR TAR
DECD R6
RETI
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢您,其实您这种方法和我哪种方法本质是一样的,改过之后,结果也是一样的,这说明这两种方法确实是一致的,我试着将tar的值改为别的,比如#0a,#0b,最后,减去这些基数,跟从0开始是一样的,也就是说,计算脉冲宽度,跟tar的初始值是没有关系的,它计算的仅仅是两次的差值,主要问题是捕获到的两次差值计算的不正确,实在想不出别的原因,难道会误判上升和下降沿吗,几乎不可能,因为我的脉冲宽度是一定的,所以每次计算出来的值是一样的,这是正确的,问题在于这个值不正确,分析不出来,还得麻烦您一下,我也在试,但是结果还是不如人意啊,高手还得出手啊。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
考虑到TAR可能记数到头(到0xffff后,返回0)的问题,增量方法比减法要简单些(前提是所捕获的脉冲的宽度不会大于TA的记数周期)
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 
我的脉冲宽度是104.17us,晶振2。4576mhz,震荡周期是0.407us,如果这样算的话,如果我循环回来给tar清零的话,那在脉冲的下降沿捕捉到的值应该是104。17/0。407=256,十六进制应该是0x0100,不会溢出,宽且捕捉到这一次之后,我又给tar清零了。。为了调下面的程序,现在我只能把它捕捉的值加上一个差值,但对于不知道宽度的脉冲这样做可就不行了,大虾,你看看我上面的计算方法得出256这个结果有没有问题,多谢。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

11
 
1、脉冲宽度为104.17us时,对应的TAR是256。但是9600的波特率时,上升沿与相邻下降沿之间的时间差应该是104.17us/s(50%占空比),对应的TAR应该在128左右。
2、关于溢出的可能性:关键是第一次捕捉到上升沿(或下降沿)的时候,TAR的值可能是0到65535之间的任意值,再次进入捕获中断的时候,TAR有可能已经溢出。
3、是否确定以上所说的波特率值(9600bps)与晶振频率值(2.4576mhz)是准确的?
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

12
 
算了,其实不用管波特率的问题了,仅仅是脉冲宽度就可以了,就是104.17us的脉冲宽度,晶振我测过了,没啥问题,timerA的时钟源我设的mclk,为了确信时钟没问题,我让p5.4输出mclk,虽说波形质量是差了点,但是频率还可以。关于溢出问题,第一次捕捉到上升沿(或下降沿)的时候,TAR的值可能是0到65535之间的任意值,但是第一次进的时候我已经清零了,咱们上面的那个程序就是这样做的,其实那样做,已经排除了tar溢出的可能性,你说呢?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表