[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]
|