打印

一个定时器需要捕捉多路信号,可以完成任务么

[复制链接]
1372|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
会飞的大白|  楼主 | 2015-8-23 13:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
deliciouscook| | 2015-8-23 16:18 | 只看该作者
可以的,本身就有这样的功能的

使用特权

评论回复
板凳
deliciouscook| | 2015-8-23 16:19 | 只看该作者
网上找的一段话
stm32f3捕获多路pwm输入
1.定时器有捕获 PWM 的功能. 这个方式用起来最简单, 但是一个定时器只能捕获一路.
2.只用定时器双边沿捕获功能, 发生捕获时产生中断, 在中断里识别上升下降沿. 从而计算出 PWM 的频率和占空比, 这样一个定时器最多可捕获4路.
3. 用 IO 口双边沿触发中断, 在中断里读取定时器的值. 这样一个定时器可以测量任意个 PWM 信号.

使用特权

评论回复
地板
通宵敲代码| | 2015-8-23 17:09 | 只看该作者
做好信号区分就行,完全没问题的

使用特权

评论回复
5
HARRY007| | 2015-8-23 21:03 | 只看该作者
可以的,我们用的STM8的一个定时器也是捕捉的多路信号。不过速度太快,交叉很多的话也会存在问题的

使用特权

评论回复
6
李冬发| | 2015-8-24 02:13 | 只看该作者
现代的MCU的定时器捕捉都是多路的,3路到7路不等。

使用特权

评论回复
7
e08610318| | 2015-8-24 09:38 | 只看该作者
1.读datasheet,看看芯片硬件功能是否可以实现
2.考虑软件实现的可能性

使用特权

评论回复
8
yklstudent| | 2015-8-24 12:12 | 只看该作者
STM32F207上试过,调试测路数没有问题,不过频率不要太高

使用特权

评论回复
9
若相依| | 2015-8-28 08:55 | 只看该作者
void EXTI3_IRQHandler(void)
{
         if(GPIOB->IDR & GPIO_Pin_3)
         {
         //高启动定时器,清标准字
         PPM_star[1]=TIM_GetCounter(TIM2);
         }
         else
         {
         PPM_end[1]=TIM_GetCounter(TIM2)-PPM_star[1];
         if(PPM_end[1]>900 && PPM_end[1]<2100)
     {PPMINF[1]=PPM_end[1]-INF_DAT[PPM_mid1];}
         }
     EXTI_ClearITPendingBit(EXTI_Line3);        
}

void EXTI4_IRQHandler(void)
{
         if(GPIOB->IDR & GPIO_Pin_4)
         {
         //高启动定时器,清标准字
         PPM_star[2]=TIM_GetCounter(TIM2);
         }
         else
         {
         PPM_end[2]=TIM_GetCounter(TIM2)-PPM_star[2];
         if(PPM_end[2]>900 && PPM_end[2]<2100)
     {PPMINF[2]=PPM_end[2]-INF_DAT[PPM_mid2];}
         }
     EXTI_ClearITPendingBit(EXTI_Line4);        
}

void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line5) != RESET)
  {
     //高开始计时
         //低停止计时
         if(GPIOB->IDR & GPIO_Pin_5)
         {
         //高启动定时器,清标准字
         PPM_star[3]=TIM_GetCounter(TIM2);
         }
         else
         {
         PPM_end[3]=TIM_GetCounter(TIM2)-PPM_star[3];
         if(PPM_end[3]>900 && PPM_end[3]<2100)
     {PPMINF[3]=PPM_end[3]-INF_DAT[PPM_mid3];}
         }
     EXTI_ClearITPendingBit(EXTI_Line5);
  }

if(EXTI_GetITStatus(EXTI_Line8) != RESET)
  {
     //高开始计时
         //低停止计时
         if(GPIOB->IDR & GPIO_Pin_8)
         {
         //高启动定时器,清标准字
         PPM_star[4]=TIM_GetCounter(TIM2);
         }
         else
         {
         PPM_end[4]=TIM_GetCounter(TIM2)-PPM_star[4];
         if(PPM_end[4]>900 && PPM_end[4]<2100)
     {PPMINF[4]=PPM_end[4]-INF_DAT[PPM_mid4];}
         }
     EXTI_ClearITPendingBit(EXTI_Line8);
  }

if(EXTI_GetITStatus(EXTI_Line9) != RESET)
  {
     //高开始计时
         //低停止计时   
         if(GPIOB->IDR & GPIO_Pin_9)
         {
         //高启动定时器,清标准字
         PPM_star[5]=TIM_GetCounter(TIM2);
         }
         else
         {
         PPM_end[5]=TIM_GetCounter(TIM2)-PPM_star[5];                 
           if(PPM_end[5]>900 && PPM_end[5]<2100)
     {PPMINF[5]=PPM_end[5]-INF_DAT[PPM_mid5];}
         }
     EXTI_ClearITPendingBit(EXTI_Line9);
  }
}
//外部中断
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line13) != RESET)
  {
     //高开始计时
         //低停止计时   
         if(GPIOC->IDR & GPIO_Pin_13)
         {
         //高启动定时器,清标准字
         PPM_star[6]=TIM_GetCounter(TIM2);
         }
         else
         {
         PPM_end[6]=TIM_GetCounter(TIM2)-PPM_star[6];                 
           if(PPM_end[6]>900 && PPM_end[6]<2100)
     {PPMINF[6]=PPM_end[6]-INF_DAT[PPM_mid6];}
         }
     EXTI_ClearITPendingBit(EXTI_Line13);
  }
}


给你个例程看看

使用特权

评论回复
10
会飞的大白|  楼主 | 2015-8-31 08:45 | 只看该作者
yklstudent 发表于 2015-8-24 12:12
STM32F207上试过,调试测路数没有问题,不过频率不要太高

207比103主频高多了

使用特权

评论回复
11
会飞的大白|  楼主 | 2015-8-31 08:45 | 只看该作者

我试试看看

使用特权

评论回复
12
会飞的大白|  楼主 | 2015-8-31 08:59 | 只看该作者
e08610318 发表于 2015-8-24 09:38
1.读datasheet,看看芯片硬件功能是否可以实现
2.考虑软件实现的可能性

学习了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

139

帖子

0

粉丝