查看: 2624|回复: 1

[求助] 求助KL25输入捕捉问题

[复制链接]

该用户从未签到

1

主题

5

帖子

0

新手上路

Rank: 1

积分
2
最后登录
1970-1-1
发表于 2013-8-2 17:01:01 | 显示全部楼层 |阅读模式
用KL25 TPM0CH0上升沿捕捉出现问题,偶尔会计数混乱。
实际应用中脉宽较大,一个计时周期不够计时,所以开了TPM0模块溢出中断累计溢出次数。除了TPM0模块,其他模块都关闭,在打印调试中开了串口打印数据和LED指示。输入脉宽有2种宽度,暂时用不超过一个计时周期的脉宽调试。  计数频率48M,16位可计时1.3MS  测试脉冲238US和716US.
程序如下
//初始化程序
void tpm0_init(void)
{  
    port_io_set(pe,24,3);        //设置引脚 TPM0CH0
    tpm0_clk_en();                  //使能时钟 分配时钟  
    //通道值  无意义
    //TPM0->CONTROLS[0].CnV=0;
    //通道配置                                                      使能中断                        捕获模式              上升沿
    TPM0->CONTROLS[0].CnSC  = bv(tpm_ch_sc_chie)|(0 0x2d00)
        {
            led1_sh();//宽脉冲
#if 0
//打印数据 将长脉冲时候数据打出   串口中断输出 不会卡死TPM0中断
            a[0]  =0x55;
            a[1]  =inputd_now>>24;
            a[2]  =inputd_now>>16;
            a[3]  =inputd_now>>8;
            a[4]  =inputd_now;
            a[5]  =inputd_last>>24;
            a[6]  =inputd_last>>16;
            a[7]  =inputd_last>>8;
            a[8]  =inputd_last;
            a[9]  =input_now>>8;
            a[10] =input_now;
            a[11] =input_last>>8;
            a[12] =input_last;
            a[13] =input_cnt;
            uart0_send(a);           
#endif 
       }
        else
//窄脉冲
            led2_sh();

        input_cnt= 0;        //重新累计溢出次数
          
        //更新计数值
        input_last  = input_now;    //计数
        inputd_last = inputd_now;   //差值计数   
      
    }
 
}      
现象如下:
1 将每次捕捉事件通过LED指示,示波器与输入波形对比,没有误触发,也没有漏触发,延时非常小没有出现中断被耽误延迟,也观测了中断时长非常短。
2 将溢出事件通过LED指示,也没发现问题,溢出事件间隔很整齐。
3 直接相减,将计数宽度换算到US时间值,计算结果正确,用溢出次数计算(现在只有0次和1次)偶尔出错。
4 后面贴出的打印数据可以看到计数值有问题。错的都是短脉冲,长脉冲没有错过
正常情况下的打印数据
55 00 00 86 5D 00 00 2C C9 AD 0A 26 AD 00
55 00 00 86 5C 00 00 2C CA 2C 47 A5 EB 01
55 00 00 86 5C 00 00 2C CA AB D8 25 7C 00
55 00 00 86 5D 00 00 2C CA 2B 16 A4 B9 01
55 00 00 86 5D 00 00 2C C9 AA 53 23 F6 00
55 00 00 86 5C 00 00 2C CA 29 DE A3 82 01
55 00 00 86 6E 00 00 2C D0 A9 51 22 E3 00
不正常情况下的打印数据
55 00 00 86 6E 00 00 2C D0 ED 41 66 D3 00
55 00 00 86 5D 00 00 2C CA 6C E5 E6 88 01
55 00 01 2C CA 00 00 2C CA FF FB D3 31 01
55 FF FF 2C C9 00 01 2C CA 2C C4 FF FB 00
55 00 00 86 5D 00 00 2C C9 EC 22 65 C5 00
55 00 00 86 5D 00 00 2C C9 6B AD E5 50 01
55 00 00 86 5C 00 00 2C CA EA EA 64 8E 00
 
对55 00 00 86 5D 00 00 2C CA 6C E5 E6 88 01这条数据
脉宽865d,是长脉冲宽度,计算准确。
对55 00 01 2C CA  00 00 2C CA FF FB D3 31 01 这条数据
本次计数 FFFB  上次计数D331  本次比上次大,期间怎么还会有溢出一次?  按照没溢出计算 FFFB-D331=2CCA是正常短脉冲  按溢出计算 1fffb-d331=12cca  按照已经溢出一次算肯定不对,有LED监视每次捕捉闪一次,不存在漏了,这个溢出次数是怎么来的?
对55 FF FF 2C C9 00 01 2C CA 2C C4 FF FB 00 这条数据
本次计数2CC4 上次计数FFFB,本次比上次小,期间应该有溢出一次,12CC4-FFFB=2CC9,也是正常短脉冲,按照没溢出计算  则变成负数肯定不对。为什么这个溢出事件丢了或者没有累计次数?
 
然后示波器观察发现,外部脉冲沿后2US处理捕捉事件,发生错误时,溢出事件与捕捉事件一起发生。  找到了问题的解释。
01 2C CA这条好像可以解释为捕捉后还没处理捕捉事件时候计数继续,所以发生了溢出事件,等进入事件处理后,被错误的多记了一次溢出事件。 对此,外部信号传输到引脚上到进入中断函数,到底需要多久(现在为了测试,主函数是空循环,也没有其他中断任务,如果程序加上其他功能进中断压栈之类是不是更久),如果通过判断当前计数是否接近0XFFFF来防止发生这样问题,由上面引出的问题是不知道信号过来到处理捕捉事件间隔多久,而且这个还是动态的每次不同,如何取值判断是否不要累计最后一次溢出?
FFFF2CC9这条也顺势解释为上一次捕捉后,肯定是是将溢出次数清零,所以也就少了一次溢出。解决办法同样可以由上面顺势。问题也同样是如何取值判断?
或者通过判断溢出事件和捕捉事件同时发生来判断?
或者,对于这种问题,是否还有其他办法可解决?
 
 
 
 
 
我知道答案 目前已有0人回答
回复

使用道具 举报

该用户从未签到

1

主题

5

帖子

0

新手上路

Rank: 1

积分
2
最后登录
1970-1-1
 楼主| 发表于 2013-8-2 17:06:13 | 显示全部楼层

回复:求助KL25输入捕捉问题

通过加一个变量判断溢出事件和捕捉事件同时发生来决定是否对溢出次数人为干涉,暂时没发现错误,是否从理论上分析真的不会发生错误?
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-20 07:59 , Processed in 0.093114 second(s), 21 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表