[Kinetis] 关于MKE02Z输入捕获的精度问题(已解决)

[复制链接]
 楼主| jiandan_w 发表于 2014-8-21 10:09 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_A 于 2014-9-15 11:44 编辑

最近测试了MKE02Z的输入捕获功能,测试环境为:【Freescale】FRDM-KE02Z,脉冲源为函数发生器,芯片主频20MHZ。测试发现这款芯片的捕获精度达不到预期,比如脉冲频率为2.5k时,理论计数值为8000,但实际捕获的数值误差为4,如下图所示: 2.5k.PNG ,最大误差为8,具体数据见附件。

不知道是不是芯片自身原因,还是我们的配置有问题?
相关代码如下:
Code.PNG


测试数据.rar (7.38 KB, 下载次数: 2)

projects.rar

3.04 KB, 阅读权限: 100, 下载次数: 2

测试例程

FSL_TICS_Jeremy 发表于 2014-8-21 10:56 | 显示全部楼层
你好,楼主!
能简单介绍一下,程序设计的例程,你是使用中断来做的吗?
 楼主| jiandan_w 发表于 2014-8-21 13:50 | 显示全部楼层
是的,采用输入捕获,中断处理。
FSL_TICS_Jeremy 发表于 2014-8-21 13:59 | 显示全部楼层
jiandan_w 发表于 2014-8-21 13:50
是的,采用输入捕获,中断处理。

能否将中断函数贴出来?
 楼主| jiandan_w 发表于 2014-8-21 14:11 | 显示全部楼层
c:\中断处理.bmp

处于保密原因,我省略了溢出次数部分的处理。
 楼主| jiandan_w 发表于 2014-8-21 14:13 | 显示全部楼层
  1. void CaptureHandle(void)
  2. {
  3.         if( FTM_GetOverFlowFlag( FTM2 ))
  4.         {
  5.                 FTM_ClrOverFlowFlag( FTM2 );  // Clear TOF Flag if it was set
  6.                 ++g_u32OverFlowCounts;
  7.         }

  8.         if( FTM_GetChannelFlag( FTM2, FTM_CHANNEL_CHANNEL0))
  9.         {
  10.                 FTM_ClrChannelFlag( FTM2, FTM_CHANNEL_CHANNEL0 );  // Clear CH(n)F Flag
  11.                 g_u16CaptureValue = FTM2->CONTROLS[0].CnV;  // capture value
  12.                 if( g_bFirstEdge )
  13.                 {
  14.                         g_bFirstEdge = FALSE;
  15.                         g_u16FirstEdgeCountValue = g_u16CaptureValue;
  16.                 }
  17.                 else
  18.                 {
  19.                         // Index of count buffer
  20.                         g_u32CurCntIndex++;
  21.                         if( g_u32CurCntIndex >= COUNT_NUM )
  22.                         {
  23.                                 g_u32CurCntIndex = 0;
  24.                         }
  25.                
  26.                         // Calc Count
  27.                         g_n32CountBuffer[g_u32CurCntIndex] = g_u16CaptureValue + (g_u32OverFlowCounts<<16) - g_u16FirstEdgeCountValue;
  28.                         g_u16FirstEdgeCountValue = g_u16CaptureValue;  // Treak it as the first edge of the next pulse
  29.                 }
  30.         }
  31. }
FSL_TICS_Jeremy 发表于 2014-8-22 10:37 | 显示全部楼层
jiandan_w 发表于 2014-8-21 14:13

从代码上看应该是没有问题的,我认为有偏差的原因:1方面来是FTM模块有误差,2.波形有毛刺或者其他干扰
 楼主| jiandan_w 发表于 2014-8-22 11:21 | 显示全部楼层
本帖最后由 jiandan_w 于 2014-8-22 11:24 编辑
FSL_TICS_Jeremy 发表于 2014-8-22 10:37
从代码上看应该是没有问题的,我认为有偏差的原因:1方面来是FTM模块有误差,2.波形有毛刺或者其他干扰 ...

您好,我们做过对比测试:AT80C51ED2上,当脉冲频率为15k时,捕获值只差1个 - 测试环境相同,方法类似。
我们用的是函数发生器,脉冲是很干净的,不会有毛刺和干扰的问题。

对于MKE02Z的捕获精度,我们一直觉得不应该差这么多,所以我们想确认这个问题,你们有没有这款芯片的出厂测试数据,能否帮我们确认下这个问题。非常感谢!!


FSL_TICS_Jeremy 发表于 2014-8-22 11:46 | 显示全部楼层
jiandan_w 发表于 2014-8-22 11:21
您好,我们做过对比测试:AT80C51ED2上,当脉冲频率为15k时,捕获值只差1个 - 测试环境相同,方法类似。
...

我也觉得不应该是这样,要不你把例程给我,我在FRDM-KE02上测试一下。
 楼主| jiandan_w 发表于 2014-8-26 09:49 | 显示全部楼层
FSL_TICS_Jeremy 发表于 2014-8-22 11:46
我也觉得不应该是这样,要不你把例程给我,我在FRDM-KE02上测试一下。

我整理了一下,已经上传。

由于整个工程超过1M,我只能上传projects文件夹,  工程的其他部分与 KEXX_DRIVERS_V1.2.1_DEVD\kexx_drv_lib\src 中的一致。
FSL_TICS_Robin 发表于 2014-9-3 10:15 | 显示全部楼层
楼主你好
建议你先测试非溢出情况下输入捕获是否准确
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

4

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部