在线时间0 小时
UID57351
注册时间2008-7-3
NXP金币0
该用户从未签到
新手上路

- 积分
- 2
- 最后登录
- 1970-1-1
|
用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这条也顺势解释为上一次捕捉后,肯定是是将溢出次数清零,所以也就少了一次溢出。解决办法同样可以由上面顺势。问题也同样是如何取值判断?
或者通过判断溢出事件和捕捉事件同时发生来判断?
或者,对于这种问题,是否还有其他办法可解决?
|
|