OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4871|回复: 5

STM32战舰 多定时器各一个通道同时进行输入捕获,驱动电机发现出错(单通道均可行)求助!

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-4-10
在线时间
0 小时
发表于 2015-4-10 13:55:58 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true] [/mw_shl_code]
我现在想用两个定时器(TIM4的CH2和TIM5的CH1)进行两个通道的高电平输入捕获,改的是输入捕获实验的例程。根据捕获到的高电平值去驱动两个轮子(电机驱动)进行全速运动。
这两个通道单独进行输入捕获然后驱动轮子都没有问题。
但是现在把两个定时器输入捕获放到了一起,就出现了一个通道正常,轮子可以根据输入状态(遥控器给的信号)全速运动。另一个通道轮子也会动,但是转的特别慢,应该是输出不连续的问题。
两个通道的高电平是不会重叠的。因此我就想让两个通道顺序捕获就好了,一个通道检测完高电平长度,下一个通道的上升沿才会到来触发中断,再检测它的高电平长度。
我也觉得有点简单粗暴,但不知道问题出在了哪。原子大哥!各位好汉请给些指点啊!菜鸟一个呀。。


下面是我的输入捕获子函数,就直接改的定时器和通道值。前面是初始化,没有粘。
[mw_shl_code=c,true]u8 TIM4CH2_CAPTURE_STA=0; //输入捕获状态 u16 TIM4CH2_CAPTURE_VAL; //输入捕获值 u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态 u16 TIM5CH1_CAPTURE_VAL; //输入捕获值 //定时器4中断服务程序 void TIM4_IRQHandler(void) { if((TIM4CH2_CAPTURE_STA&0X80)==0)//还未成功捕获 { if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//溢出——更新中断 { if(TIM4CH2_CAPTURE_STA&0X40)//已经捕获到高电平了 { if((TIM4CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了 { TIM4CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次 TIM4CH2_CAPTURE_VAL=0XFFFF; }else TIM4CH2_CAPTURE_STA++; } } if (TIM_GetITStatus(TIM4, TIM_IT_CC2) != RESET)//捕获1发生捕获事件 { if(TIM4CH2_CAPTURE_STA&0X40) //捕获到一个下降沿 { TIM4CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次下降沿 TIM4CH2_CAPTURE_VAL=TIM_GetCapture2(TIM4); TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获 }else //还未开始,第一次捕获上升沿 { TIM4CH2_CAPTURE_STA=0; //清空 TIM4CH2_CAPTURE_VAL=0; TIM_SetCounter(TIM4,0); TIM4CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿 TIM_OC2PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获 } } } TIM_ClearITPendingBit(TIM4, TIM_IT_CC2|TIM_IT_Update); //清除中断标志位 } //定时器5通道1输入捕获配置 // u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态 // u16 TIM5CH1_CAPTURE_VAL; //输入捕获值 // //定时器5中断服务程序 void TIM5_IRQHandler(void) { if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获 { if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) { if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了 { if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了 { TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次 TIM5CH1_CAPTURE_VAL=0XFFFF; }else TIM5CH1_CAPTURE_STA++; } } if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件 { if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿 { TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获 }else //还未开始,第一次捕获上升沿 { TIM5CH1_CAPTURE_STA=0; //清空 TIM5CH1_CAPTURE_VAL=0; TIM_SetCounter(TIM5,0); TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获 } } } TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位 }[/mw_shl_code]
这是主函数部分,就是两个并列的输入捕获。

[mw_shl_code=c,true]while(1) { delay_ms(10); if(TIM4CH2_CAPTURE_STA&0X80)//成功捕获到了一次上升沿 { temp=TIM4CH2_CAPTURE_STA&0X3F; temp*=65536;//溢出时间总和 temp+=TIM4CH2_CAPTURE_VAL;//得到总的高电平时间 //printf("HIGH:%d us\r\n",temp);//打印总的高点平时间 TIM4CH2_CAPTURE_STA=0;//开启下一次捕获 if (temp>1600) { GPIO_SetBits(GPIOE,GPIO_Pin_1); GPIO_ResetBits(GPIOB,GPIO_Pin_2); GPIO_SetBits(GPIOE,GPIO_Pin_5); GPIO_ResetBits(GPIOE,GPIO_Pin_2); } else if(temp<1400) { GPIO_ResetBits(GPIOE,GPIO_Pin_1); GPIO_SetBits(GPIOB,GPIO_Pin_2); GPIO_ResetBits(GPIOE,GPIO_Pin_5); GPIO_SetBits(GPIOE,GPIO_Pin_2); } else{ GPIO_ResetBits(GPIOE,GPIO_Pin_1); GPIO_ResetBits(GPIOB,GPIO_Pin_2); GPIO_ResetBits(GPIOE,GPIO_Pin_5); GPIO_ResetBits(GPIOE,GPIO_Pin_2); } } if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿 { temp=TIM5CH1_CAPTURE_STA&0X3F; temp*=65536;//溢出时间总和 temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间 //printf("HIGH:%d us\r\n",temp);//打印总的高点平时间 TIM5CH1_CAPTURE_STA=0;//开启下一次捕获 if (temp>1600) { GPIO_SetBits(GPIOE,GPIO_Pin_1); GPIO_ResetBits(GPIOB,GPIO_Pin_2); GPIO_ResetBits(GPIOE,GPIO_Pin_5); GPIO_SetBits(GPIOE,GPIO_Pin_2); } else if(temp<1400) { GPIO_ResetBits(GPIOE,GPIO_Pin_1); GPIO_SetBits(GPIOB,GPIO_Pin_2); GPIO_SetBits(GPIOE,GPIO_Pin_5); GPIO_ResetBits(GPIOE,GPIO_Pin_2); } else{ GPIO_ResetBits(GPIOE,GPIO_Pin_1); GPIO_ResetBits(GPIOB,GPIO_Pin_2); GPIO_ResetBits(GPIOE,GPIO_Pin_5); GPIO_ResetBits(GPIOE,GPIO_Pin_2); } } } } [/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5788
金钱
5788
注册时间
2013-11-22
在线时间
1213 小时
发表于 2015-4-10 17:07:30 | 显示全部楼层
你的 TIM4中断函数里 把TIM5的中断标志都给清除了,可能导致TIM5不能进入中断
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-4-10
在线时间
0 小时
 楼主| 发表于 2015-4-10 23:30:35 | 显示全部楼层
回复【2楼】lycreturn:
---------------------------------
啊啊啊不好意思,本来是没有那句的。这个程序我改过了为了发求助帖又改回来,那里忘了改。
已经删掉了那句。

求再帮忙看看!多谢!
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2015-4-10
在线时间
0 小时
 楼主| 发表于 2015-4-12 09:46:17 | 显示全部楼层
自顶一下,求各路高手指点啊。
思路错哪了啊?
回复

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-3-12
在线时间
2 小时
发表于 2015-6-5 11:04:05 | 显示全部楼层
亲,你的问题解决了吗,我也是同样的问题
回复

使用道具 举报

7

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-3-12
在线时间
2 小时
发表于 2015-6-5 11:08:24 | 显示全部楼层
回复【2楼】lycreturn:
---------------------------------
请问是哪句把TIM5的中断标志清除了?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-28 18:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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