搜索
bottom↓
回复: 8

STM8S103K3T6捕获程序,捕获的值错误。有做过的,指点下

[复制链接]

出0入0汤圆

发表于 2014-11-28 17:33:21 | 显示全部楼层 |阅读模式
MCU  :  STM8S103K3T6
目的:捕获4路PWM的高电平宽度,频率50HZ 周期20MS  高电平宽度1——2MS     (航模接收机输出的信号,要求捕获这个脉宽值)

写了个测试程序   一路信号接到   TIM1_CH1 通道 利用中断方式  来捕获值。

然后网上找了一些资料,看了一下。 参考下载的资料程序,对照手册   不断测试了,发现就是捕获不到实际的值。

无奈,发帖请教大家 ,如果做过的朋友,请指点下。

以下 是程序部分

中断能进去  上升 下降 中断 都没问题。 就是读取值部分 总是不对。 不知道哪里有误。。




  1. //定时器 设置部分

  2.    enableInterrupts(); //打开总中断

  3.   TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP,6000, 0);
  4.   
  5.   //RISING 上升
  6.   TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI , TIM1_ICPSC_DIV8, 0x0);
  7.   
  8.   TIM1_ITConfig( TIM1_IT_CC1 , ENABLE);
  9.   
  10.   TIM1_ClearFlag(TIM1_FLAG_CC1);
  11.   
  12.   TIM1_Cmd(ENABLE);       


  13. //TIM1  捕获中断 程序部分

  14. INTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12)
  15. {
  16.   /* In order to detect unexpected events during development,
  17.      it is recommended to set a breakpoint on the following instruction.
  18.   */
  19.   //是不是上升沿捕获中断
  20.   if((TIM1->CCER1 & TIM1_CCER1_CC1P)==0)//  //与运算 之前是上升沿 还是下降沿中断 如果之前是1 那么下降 那么就是下降沿
  21.   {
  22. //   T1_CAP[0]  = ( TIM1->CCR1H << 8 );
  23. //   T1_CAP[0] |= TIM1->CCR1L;
  24.    
  25.     TIM1->CCR1H=0;
  26.     TIM1->CCR1L=0;
  27.    
  28. //    TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1P);   //设置 上升沿中断
  29.     TIM1->CCER1 |= TIM1_CCER1_CC1P;                          //设置  下降沿中断
  30.       
  31.   }
  32.   else //下降沿中断
  33.   {
  34.     T1_CAP[1]  = ( TIM1->CCR1H << 8 );
  35.     T1_CAP[1] |= TIM1->CCR1L;;
  36.    
  37.     T1_CAP_VAL=T1_CAP[1]-T1_CAP[0];
  38.    
  39.     TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1P);     //设置 上升沿中断
  40. //    TIM1->CCER1 |= TIM1_CCER1_CC1P;                    //设置  下降沿中断
  41.   }
  42.   
  43.   TIM1_ClearFlag(TIM1_FLAG_CC1);
  44. // TIM1_ClearITPendingBit(TIM1_IT_CC1) ;      
  45. }
复制代码


阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-11-28 17:33:22 | 显示全部楼层
我以前写过,当时虽然用的也是S系列,但我是用寄存器写的。一开始也是老读数不正常,只记得手册上有一句话

TIM1_CCR1L(即计数高位)可以清除标志位,

或也可以软件写零来清除。

就是因为这句话,我把最后一个清除输入捕获标志位给去了。然后就正常了

楼主你也可以试下。

出0入0汤圆

 楼主| 发表于 2014-11-29 10:15:54 | 显示全部楼层
一心2013 发表于 2014-11-28 19:25
我以前写过,当时虽然用的也是S系列,但我是用寄存器写的。一开始也是老读数不正常,只记得手册上有一句话
...

行 我试试                 

出0入0汤圆

发表于 2014-11-29 11:13:05 | 显示全部楼层
没有明白你说的实际值,可能你的理解错误,捕获值没有任何意义,只有两次捕获的差值才有意义,而且定时器周期必须大于脉冲周期

出0入0汤圆

 楼主| 发表于 2014-12-3 16:36:58 | 显示全部楼层
问题找到了,主要在于初始化地方有问题

TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI , TIM1_ICPSC_DIV8, 0x0);

  * tim1_icpsc_div1:没有预分频器
  * tim1_icpsc_div2:每2个事件触发一次捕获
  * tim1_icpsc_div4:每4个事件触发一次捕获
  * tim1_icpsc_div8:每8个事件触发一次捕获

初始化设置为 tim1_icpsc_div8  当有8个事件 才触发一次,显然不对。 改成  tim1_icpsc_div1:没有预分频器    即可。

这里的设置  之前用编码器时候 用过这个功能,STM32的。  仔细核对 后 才知道 原来是这里有问题。

出0入0汤圆

 楼主| 发表于 2014-12-3 16:37:44 | 显示全部楼层
一心2013 发表于 2014-11-28 17:33
我以前写过,当时虽然用的也是S系列,但我是用寄存器写的。一开始也是老读数不正常,只记得手册上有一句话
...

第一个回复的,那么 最佳答案就给你了。 谢谢

出0入0汤圆

发表于 2017-11-22 10:53:11 | 显示全部楼层
Mark               

出0入0汤圆

发表于 2018-5-1 22:27:00 | 显示全部楼层
学习了解一下了,stm8s的中断好像不好用啊。

出0入85汤圆

发表于 2018-5-3 09:08:37 | 显示全部楼层
我也Mark一下。正需要。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 08:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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