注册 登录
查看: 419|回复: 8

[K60] 输入捕捉两个通道相互影响是怎么回事?

[复制链接]
发表于 2014-12-2 13:20:54 | 显示全部楼层 |阅读模式
代码如下:
  1. /*!
  2. *     COPYRIGHT NOTICE
  3. *     Copyright (c) 2013,山外科技
  4. *     All rights reserved.
  5. *     技术讨论:山外初学论坛 http://www.vcan123.com
  6. *
  7. *     除注明出处外,以下所有内容版权均属山外科技所有,未经允许,不得用于商业用途,
  8. *     修改内容时必须保留山外科技的版权声明。
  9. *
  10. * @file       main.c
  11. * @brief      山外K60 平台主程序
  12. * @author     山外科技
  13. * @version    v5.0
  14. * @date       2013-08-28
  15. */

  16. #include "common.h"
  17. #include "include.h"
  18. uint8   CH1_CAPTURE_STA=0;        //                                
  19. uint16        CH1_CAPTURE_UPVAL;        //
  20. uint16        CH1_CAPTURE_DOWNVAL;//

  21. uint8   CH2_CAPTURE_STA=0;        //                                
  22. uint16        CH2_CAPTURE_UPVAL;        //
  23. uint16        CH2_CAPTURE_DOWNVAL;//

  24. uint16  RC_CH[8];
  25. //全局变量定义
  26. volatile uint32 cnvtime = 0;                //输入捕捉值
  27. //函数声明
  28. void FTM0_INPUT_IRQHandler(void);        //FTM0中断服务函数
  29. /*!
  30. *  @brief      main函数
  31. *  @since      v5.0
  32. *  @note       FTM 输入捕捉 测脉冲宽度 测试
  33. */
  34. void main()
  35. {
  36.     FTM_Input_init(FTM0, FTM_CH6, FTM_Rising,FTM_PS_32);     //初始化FTM输入捕捉模式,下降沿捕捉(FTM0_CH6 为 PTD6)
  37.     FTM_Input_init(FTM0, FTM_CH5, FTM_Rising,FTM_PS_32);     //初始化FTM输入捕捉模式,下降沿捕捉(FTM0_CH6 为 PTD6)
  38.     set_vector_handler(FTM0_VECTORn ,FTM0_INPUT_IRQHandler);    //设置FTM0的中断服务函数为 FTM0_INPUT_IRQHandler
  39.     enable_irq (FTM0_IRQn);                                     //使能FTM0中断
  40.     //FTM_PWM_init(FTM1, FTM_CH1,10*1000,50);
  41.     while(1)
  42.     {
  43.         if(RC_CH[0] != 0)
  44.         {
  45.             //捕捉频率 = bus 时钟 / (分频系数) / cnvtime
  46.             //分频系数 是 由 初始化时传递进去的分频因子FTM_PS_e 决定,分频系数 = 1<<FTM_PS_e
  47.             //最大支持频率为 bus 时钟 四分之一
  48.             //printf("\n捕捉到频率为:%d",RC_CH[0]);//bus_clk_khz*1000/(1<<FTM_PS_2)/
  49.             //printf("\nup:%d,down:%d,error:%d",CH1_CAPTURE_UPVAL,CH1_CAPTURE_DOWNVAL,RC_CH[0]);
  50.           printf("\nerror1:%d,error2:%d",RC_CH[0],RC_CH[1]);
  51.             CH1_CAPTURE_UPVAL = 0;CH1_CAPTURE_DOWNVAL = 0;RC_CH[0] = 0;
  52.             CH2_CAPTURE_UPVAL = 0;CH2_CAPTURE_DOWNVAL = 0;RC_CH[1] = 0;
  53.         }
  54.         //else
  55.         //{
  56.          //   printf("\n没有捕捉到频率");
  57.         //}
  58.         DELAY_MS(300);      //这里 的延时 ,仅仅是 避免 过于频繁打印数据到串口
  59.     }
  60. }
  61. void FTM0_INPUT_IRQHandler(void)
  62. {
  63.     uint8 s = FTM0_STATUS;          //读取捕捉和比较状态  All CHnF bits can be checked using only one read of STATUS.
  64.     uint8 CHn;
  65.     FTM0_STATUS = 0x00;             //清中断标志位    All CHnF bits can be cleared by reading STATUS followed by writing 0x00 to STATUS.
  66.    
  67.     FTM0_CNT = 0;//清计数器计数值
  68.    
  69.     CHn = 6;
  70.     if( s & (1 << CHn) )
  71.     {
  72.       FTM_IRQ_DIS(FTM0, CHn);     //禁止输入捕捉中断
  73.       if(CH1_CAPTURE_STA == 0)//捕获上升沿
  74.       {
  75.         CH1_CAPTURE_UPVAL = FTM0_CnV(CHn);
  76.         CH1_CAPTURE_STA = 1;//标记捕获到了上升沿
  77.         config_pin_mode(FTM0, FTM_CH6, FTM_Falling);//改变下降沿触发
  78.       }
  79.       else
  80.       {  
  81.         CH1_CAPTURE_DOWNVAL = FTM0_CnV(CHn);
  82.         RC_CH[0] = CH1_CAPTURE_UPVAL - CH1_CAPTURE_DOWNVAL;
  83.         CH1_CAPTURE_STA = 0;
  84.         config_pin_mode(FTM0, FTM_CH6, FTM_Rising); //设置上升沿捕捉
  85.       }
  86.       FTM_IRQ_EN(FTM0, CHn); //开启输入捕捉中断
  87.     }
  88.    
  89.     FTM0_CNT = 0;//清计数器计数值
  90.     CHn = 5;
  91.     if( s & (1 << CHn) )
  92.     {
  93.       FTM_IRQ_DIS(FTM0, CHn);     //禁止输入捕捉中断
  94.       if(CH2_CAPTURE_STA == 0)//捕获上升沿
  95.       {
  96.         CH2_CAPTURE_UPVAL = FTM0_CnV(CHn);
  97.         CH2_CAPTURE_STA = 1;//标记捕获到了上升沿
  98.         config_pin_mode(FTM0, FTM_CH5, FTM_Falling);//改变下降沿触发
  99.       }
  100.       else
  101.       {  
  102.         CH2_CAPTURE_DOWNVAL = FTM0_CnV(CHn);
  103.         RC_CH[1] = CH2_CAPTURE_UPVAL - CH2_CAPTURE_DOWNVAL;
  104.         CH2_CAPTURE_STA = 0;
  105.         config_pin_mode(FTM0, FTM_CH5, FTM_Rising); //设置上升沿捕捉
  106.       }
  107.        FTM_IRQ_EN(FTM0, CHn); //开启输入捕捉中断
  108.     }
  109. }
PTD5、PTD6输入脉冲信号时,当其中一个脉冲的高电平变化时,输出数据表现为输入捕捉数据两个脉冲都在变化。两个通道不独立了。不知道怎么回事,谢谢!

回复

使用道具 举报

发表于 2014-12-2 13:29:26 | 显示全部楼层
一个FTM只有一个计数器啊,只能分时复用,不可同时用。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-2 13:35:06 | 显示全部楼层
山外メ雲ジ 发表于 2014-12-2 13:29
一个FTM只有一个计数器啊,只能分时复用,不可同时用。

中断服务函数怎么分时复用?
回复 支持 反对

使用道具 举报

发表于 2014-12-2 13:37:41 | 显示全部楼层
快乐的味道92 发表于 1417498506
中断服务函数怎么分时复用?
测完一个,再测另外一个。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-2 13:50:46 | 显示全部楼层
山外メ雲ジ 发表于 2014-12-2 13:37
测完一个,再测另外一个。

中断服务函数只有一个,一旦其中一个通道出发了,进入中断服务函数后,就会执行中断服务函数里两个引脚的判断。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-12-2 14:34:48 | 显示全部楼层
快乐的味道92 发表于 2014-12-2 13:50
中断服务函数只有一个,一旦其中一个通道出发了,进入中断服务函数后,就会执行中断服务函数里两个引脚的 ...

可以暂时关闭一个的输入捕捉,等另外一个测完再开。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-2 14:37:54 | 显示全部楼层
仰逸致 发表于 2014-12-2 14:34
可以暂时关闭一个的输入捕捉,等另外一个测完再开。

怎么关闭?求指教
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-12-2 14:43:20 | 显示全部楼层

FTM_IRQ_DIS(FTM0, CHn);     //禁止输入捕捉中断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-2 14:51:34 | 显示全部楼层
仰逸致 发表于 2014-12-2 14:43
FTM_IRQ_DIS(FTM0, CHn);     //禁止输入捕捉中断

谢谢,等会试一下
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

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

本版积分规则

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