4600|9

11

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

LPC1114 的定时器捕获中断总是出错 [复制链接]

用的是周公的模板,我用两个定时器分别进行上升沿和下降沿捕获,然后把前后两次的时间相减,得出高电平的时间,但是通过设置的flags和flags0发现进入两个定时器中断的次数不一样,问题出在哪里啊?
  1. /*********************************************************************************************************
  2. * Function Name:        timer0Isr
  3. * Description:          TIMER0 下降沿捕获中断处理函数
  4. * Input:                无
  5. * Output:               无
  6. * Return:               无
  7. *********************************************************************************************************/
  8. void timer0Isr(void)
  9. {

  10.         TMR32B0IR=0x1f; //清除中断标志位
  11.         flagDOWN=TMR32B0CR0;
  12.         flags0=flags0+1;

  13.         return;
  14. }
  15. /*********************************************************************************************************
  16. * Function Name:        timer1Isr
  17. * Description:          TIMER1 上升沿捕获中断处理函数
  18. * Input:                无
  19. * Output:               无
  20. * Return:               无
  21. *********************************************************************************************************/
  22. void timer1Isr (void)
  23. {
  24.           TMR32B1IR=0x1f; //清除中断标志位         
  25.         flagUP=TMR32B1CR0;
  26.         flags=flags+1;
  27.         if((flags==1)&&(flagDOWN==0))
  28.         {
  29.                 flagLOW=flagLOW+flagUP;
  30.         }
  31.         else
  32.         {
  33.                 flagLOW=flagLOW+(flagUP-flagDOWN);
  34.         }
  35.         return;

  36. }
  37. /*********************************************************************************************************
  38. ** Function name:       timer0Init
  39. ** Descriptions:        32位定时器0初始化函数
  40. ** input parameters:    无
  41. ** output parameters:   无
  42. ** Returned value:      无
  43. *********************************************************************************************************/
  44. void timer0Init (void)
  45. {
  46.     SYSAHBCLKCTRL |= (1ul << 9);                                        //  打开定时器模块              
  47.     TMR32B0PR  =480-1;                                                       //  设置分频系数      
  48.         IOCON_PIO1_5 &= ~0x07;                                                                                                //初始化捕获引脚
  49.         IOCON_PIO1_5 |=0x02;
  50.         TMR32B0CCR  = 0x05;                                                         //  设置CAP0.0上升沿捕获
  51.         TMR32B0TC  = 0;
  52.     zyIsrSet(NVIC_TIMER32B0, (unsigned long)timer0Isr, PRIO_ONE);       //  设置外部中断并使能         
  53.         TMR32B0TCR=0x01;   //启动定时器
  54. }
  55. /*********************************************************************************************************
  56. ** Function name:       timer1Init
  57. ** Descriptions:        32位定时器1初始化函数
  58. ** input parameters:    无
  59. ** output parameters:   无
  60. ** Returned value:      无
  61. *********************************************************************************************************/
  62. void timer1Init (void)
  63. {
  64.     SYSAHBCLKCTRL |= (1ul << 10);                                       // 打开32定时器1模块         
  65.     TMR32B1PR   =480-1;                                                // 设置分频系数                 
  66.         IOCON_PIO1_0 &= ~0x07;                                                                                                //初始化捕获引脚
  67.         IOCON_PIO1_0 |=0x03;
  68.         TMR32B1CCR  = 0x06;                                                         //  设置CAP1下降沿捕获
  69.         TMR32B1TC = 0;
  70.     zyIsrSet(NVIC_TIMER32B1, (unsigned long)timer1Isr, PRIO_TWO);       //  设置外部中断并使能         
  71.         TMR32B1TCR=0x01;   //启动定时器
  72. }
复制代码
此帖出自NXP MCU论坛

最新回复

这个说不好了。没有遇到过类似的情况  详情 回复 发表于 2014-11-14 10:10
点赞 关注
 

回复
举报

3404

帖子

6

TA的资源

裸片初长成(初级)

沙发
 
干嘛用两个定时器,测量必须要有统一的标准,用一个定时器的两个捕获模块就可以了
此帖出自NXP MCU论坛

点评

又是版主大大啊,谢谢啊…… 那如果两个定时器的话,是不是就由于两个定时器采集信号的端口不一样造成误差?  详情 回复 发表于 2014-11-7 18:47
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
jishuaihu 发表于 2014-11-7 17:16
干嘛用两个定时器,测量必须要有统一的标准,用一个定时器的两个捕获模块就可以了

又是版主大大啊,谢谢啊……
那如果两个定时器的话,是不是就由于两个定时器采集信号的端口不一样造成误差?

此帖出自NXP MCU论坛

点评

可能会有这样的误差,由于两个定时器的启动时间上不一致,某一时刻两个定时器值肯定也不一样。 仔细看一下数据手册里面应该有你这方便的应用介绍,具体1114的数据手册里有没有我还真不清楚,反正很多都有的。用一个  详情 回复 发表于 2014-11-8 09:25
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

4
 
wheats 发表于 2014-11-7 18:47
又是版主大大啊,谢谢啊……
那如果两个定时器的话,是不是就由于两个定时器采集信号的端口不一样造成误 ...

可能会有这样的误差,由于两个定时器的启动时间上不一致,某一时刻两个定时器值肯定也不一样。
仔细看一下数据手册里面应该有你这方便的应用介绍,具体1114的数据手册里有没有我还真不清楚,反正很多都有的。用一个定时器设定两个捕获就可以了,有些芯片可以在捕获中断里查看是上升沿或者是下降沿,那样就一个捕获就可以了。
此帖出自NXP MCU论坛

点评

我改成一个定时器进行捕获的了,但是发现这样做,和我用采样得来的数据还是相差较大的,有什么办法可以减少这种误差吗  详情 回复 发表于 2014-11-10 09:23
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

5
 
设置为双边沿触发,每次进入中断都读,上升沿保存一次捕获寄存器,否则下降沿来了要冲掉。
此帖出自NXP MCU论坛

点评

怎么设置成双边沿触发?我这样行不行  详情 回复 发表于 2014-11-10 09:20
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

6
 
ytqiqiang 发表于 2014-11-8 12:35
设置为双边沿触发,每次进入中断都读,上升沿保存一次捕获寄存器,否则下降沿来了要冲掉。

怎么设置成双边沿触发?我这样行不行
  1. /*********************************************************************************************************
  2. * Function Name:        timer0Isr
  3. * Description:          TIMER0 下降沿捕获中断处理函数
  4. * Input:                无
  5. * Output:               无
  6. * Return:               无
  7. *********************************************************************************************************/
  8. void timer0Isr(void)
  9. {
  10.         TMR32B0IR=0x1f; //清除中断标志位
  11.         flagALL = TMR32B0CCR;
  12.         flags=flags+1;
  13.        
  14.         if(flagALL == 0x06)
  15.         {
  16.                 flagDOWN=TMR32B0CR0;
  17.                 TMR32B0CCR=0x05;
  18.                 flagsd=flagsd+1;
  19.                 if(flags==1)
  20.                 {
  21.                         flagLOW=flagLOW+flagDOWN;
  22.                 }
  23.                 else
  24.                 {
  25.                         flagLOW=flagLOW+(flagDOWN-flagUP);
  26.                 }
  27.         }
  28.         if(flagALL == 0x05)
  29.         {
  30.                 flagUP=TMR32B0CR0;
  31.                 TMR32B0CCR=0x06;
  32.                 flagsu=flagsu+1;
  33.                
  34.         }

  35.         return;
  36. }

  37. /*********************************************************************************************************
  38. ** Function name:       timer0Init
  39. ** Descriptions:        32位定时器0初始化函数
  40. ** input parameters:    无
  41. ** output parameters:   无
  42. ** Returned value:      无
  43. *********************************************************************************************************/
  44. void timer0Init (void)
  45. {
  46.     SYSAHBCLKCTRL |= (1ul << 9);                                        //  打开定时器模块              
  47.     TMR32B0PR  =480-1;                                                       //  设置分频系数      
  48.         IOCON_PIO1_5 &= ~0x07;                                                                                                //初始化捕获引脚
  49.         IOCON_PIO1_5 |=0x02;
  50.         TMR32B0CCR  = 0x05;                                                         //  设置CAP0.0上升沿捕获
  51.         TMR32B0TC  = 0;
  52.     zyIsrSet(NVIC_TIMER32B0, (unsigned long)timer0Isr, PRIO_ONE);       //  设置外部中断并使能         
  53.         TMR32B0TCR=0x01;   //启动定时器
  54. }
复制代码


此帖出自NXP MCU论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

7
 
本帖最后由 wheats 于 2014-11-10 09:33 编辑
jishuaihu 发表于 2014-11-8 09:25
可能会有这样的误差,由于两个定时器的启动时间上不一致,某一时刻两个定时器值肯定也不一样。
仔细看一 ...

我改成一个定时器进行捕获的了,但是发现这样做,和我用采样得来的数据还是相差较大的,有什么办法可以减少这种误差吗
我采样使用的计数方法是:一定时间内,当采样得到的值小于定值的时候,就记一次,最后把记的总次数除以定时,得到占空比
此帖出自NXP MCU论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

8
 
采样是什么意思?用AD吗?用AD的误差应该不会大于两次AD采样的间隔,应该是比较稳定了。
至于定时器捕获方便,首先你看一下定时器的的周期,你定时器的周期要能保证完整的采集到一个信号周期,否则还没有匹配一个周期定时器就溢出了,这样肯定就会差的比较多了,当然这样也是有办法的,每次溢出的时候记一次就可以了。不过如果你的定时器周期能完整的测量一个信号周期的话最好了。再一个就是匹配的设置,比如你用上升沿作为一个周期的开始,那么在上升沿读完捕获时是数据后就把定时器清零,重新开始计时,有的厂家的芯片可以设置成捕获的时候定时器清零,你看看1114可不可以。下降沿只读数不清零,这样做就比较方便了,上升沿读到的数就是周期,下降沿的就是就是高电平的时间。
如果你的两个捕获配置的没有问题的话有可能是你没有考虑定时器的溢出,我没有用过这个片子,没时间看你的代码对数据手册了,自己看一下吧
此帖出自NXP MCU论坛

点评

我在用一个定时器进行捕获试验的时候,在一个30s段内有时候发现低电平的时间会突然急剧增加一大截,而这样时长的低电平段在示波器上没有出现过,这是什么原因呢?虽然有纹波,但是基本上应该不会影响这么多吧?而且L  详情 回复 发表于 2014-11-13 21:54
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

9
 
本帖最后由 wheats 于 2014-11-13 21:56 编辑
jishuaihu 发表于 2014-11-11 13:12
采样是什么意思?用AD吗?用AD的误差应该不会大于两次AD采样的间隔,应该是比较稳定了。
至于定时器捕获方 ...

我在用一个定时器进行捕获试验的时候,在一个30s段内有时候发现低电平的时间会突然急剧增加一大截,而这样时长的低电平段在示波器上没有出现过,这是什么原因呢?虽然有纹波,但是基本上应该不会影响这么多吧?而且LPC引脚上的低电平最大是0.8v,高电平最小是2v,我的波形基本上低电平在0.2v,高电平在3.1v。每次30s过后,都会清零
此帖出自NXP MCU论坛
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

10
 
这个说不好了。没有遇到过类似的情况
此帖出自NXP MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表