初级会员

- 积分
- 134
- 金钱
- 134
- 注册时间
- 2014-11-21
- 在线时间
- 11 小时
|
10金钱
本帖最后由 woshiyunsk 于 2016-8-22 17:38 编辑
我用一个定时器捕获多路PWM输入,会出现如下情况:
1、同时打开时,一个准确,其他几个有误差;
2、单独测试某一个时,均无误差;
4路信号频率都在600Hz以下,请各位大侠帮忙看一下(这是,屏蔽掉其他通道,只保留一个通道后的代码),看看有什么好的解决办法:
void SpdCaptureFinishedHandler(void)
{
uint16_t u16SpdCaptureCurrentCounter;
// uint8_t i;
if(TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
{
if(g_eSpdCaptureWorkSwitch[0] == ON)
{
u16SpdCaptureCurrentCounter = TIM_GetCapture1(TIM3);
if(g_u8SpdCaptureTriggersCrossCycleNmb[0] < 1)//未跨越计时周期
{
if((u16SpdCaptureCurrentCounter - 2) >= g_u16SpdCaptureLastTimeCounter[0])
{
g_fSpdCaptureFrequency[0] = 2000.0 / (u16SpdCaptureCurrentCounter - g_u16SpdCaptureLastTimeCounter[0]);
}
else //比较值未变化,则认为没转动
{
g_fSpdCaptureFrequency[0] = 0;
}
}
else if(g_u8SpdCaptureTriggersCrossCycleNmb[0] < 10)//跨周期时间为1-10个
{
g_fSpdCaptureFrequency[0] = 2000.0 / ((1000 - 1 - g_u16SpdCaptureLastTimeCounter[0]) + ((g_u8SpdCaptureTriggersCrossCycleNmb[0] - 1) * 2000) + u16SpdCaptureCurrentCounter); //
}
else//跨周期超过10个,认为未转动
{
g_fSpdCaptureFrequency[0] = 0;
}
g_u16SpdCaptureLastTimeCounter[0] = u16SpdCaptureCurrentCounter; g_u8SpdCaptureTriggersCrossCycleNmb[0] = 0;
}
else
{}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
}
// if(TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
// {
// if(g_eSpdCaptureWorkSwitch[1] == ON)
// {
// u16SpdCaptureCurrentCounter = TIM_GetCapture2(TIM3);
// if(g_u8SpdCaptureTriggersCrossCycleNmb[1] < 1)//未跨越计时周期
// {
// if((u16SpdCaptureCurrentCounter - 2) >= g_u16SpdCaptureLastTimeCounter[1])
// {
// g_fSpdCaptureFrequency[1] = 4000.0 / (u16SpdCaptureCurrentCounter - g_u16SpdCaptureLastTimeCounter[1]);
// }
// else //比较值未变化,则认为没转动
// {
// g_fSpdCaptureFrequency[1] = 0;
// }
// }
// else if(g_u8SpdCaptureTriggersCrossCycleNmb[1] < 10)//跨周期时间为1-10个
// {
// g_fSpdCaptureFrequency[1] = 4000.0 / ((1000 - 1 - g_u16SpdCaptureLastTimeCounter[1]) + ((g_u8SpdCaptureTriggersCrossCycleNmb[1] - 1) * 1000) + u16SpdCaptureCurrentCounter); //
// }
// else//跨周期超过10个,认为未转动
// {
// g_fSpdCaptureFrequency[1] = 0;
// }
// g_u16SpdCaptureLastTimeCounter[1] = u16SpdCaptureCurrentCounter;
// g_u8SpdCaptureTriggersCrossCycleNmb[1] = 0;
// }
// else
// {}
// TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
// }
// if(TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
// {
// if(g_eSpdCaptureWorkSwitch[2] == ON)
// {
// u16SpdCaptureCurrentCounter = TIM_GetCapture3(TIM3);
// if(g_u8SpdCaptureTriggersCrossCycleNmb[2] < 1)//未跨越计时周期
// {
// if((u16SpdCaptureCurrentCounter - 2) >= g_u16SpdCaptureLastTimeCounter[2])
// {
// g_fSpdCaptureFrequency[2] = 4000.0 / (u16SpdCaptureCurrentCounter - g_u16SpdCaptureLastTimeCounter[2]);
// }
// else //比较值未变化,则认为没转动
// {
// g_fSpdCaptureFrequency[2] = 0;
// }
// }
// else if(g_u8SpdCaptureTriggersCrossCycleNmb[2] < 10)//跨周期时间为1-10个
// {
// g_fSpdCaptureFrequency[2] = 4000.0 / ((1000 - 1 - g_u16SpdCaptureLastTimeCounter[2]) + ((g_u8SpdCaptureTriggersCrossCycleNmb[2] - 1) * 1000) + u16SpdCaptureCurrentCounter);
// }
// else//跨周期超过10个,认为未转动
// {
// g_fSpdCaptureFrequency[2] = 0;
// }
// g_u16SpdCaptureLastTimeCounter[0] = u16SpdCaptureCurrentCounter;
// g_u8SpdCaptureTriggersCrossCycleNmb[0] = 0;
// }
// else
// {}
// TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
// }
// if(TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
// {
// if(g_eSpdCaptureWorkSwitch[3] == ON)
// {
// u16SpdCaptureCurrentCounter = TIM_GetCapture4(TIM3);
// if(g_u8SpdCaptureTriggersCrossCycleNmb[3] < 1)//未跨越计时周期
// {
// if((u16SpdCaptureCurrentCounter - 2) >= g_u16SpdCaptureLastTimeCounter[3])
// {
// g_fSpdCaptureFrequency[3] = 4000.0 / (u16SpdCaptureCurrentCounter - g_u16SpdCaptureLastTimeCounter[3]);
// }
// else //比较值未变化,则认为没转动
// {
// g_fSpdCaptureFrequency[3] = 0;
// }
// }
// else if(g_u8SpdCaptureTriggersCrossCycleNmb[3] < 10)//跨周期时间为1-10个
// {
// g_fSpdCaptureFrequency[3] = 4000.0 / ((1000 - 1 - g_u16SpdCaptureLastTimeCounter[3]) + ((g_u8SpdCaptureTriggersCrossCycleNmb[3] - 1) * 1000) + u16SpdCaptureCurrentCounter);
// }
// else//跨周期超过10个,认为未转动
// {
// g_fSpdCaptureFrequency[3] = 0;
// }
// g_u16SpdCaptureLastTimeCounter[3] = u16SpdCaptureCurrentCounter;
// g_u8SpdCaptureTriggersCrossCycleNmb[3] = 0;
// }
// else
// {}
// TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
// }
//更新中断产生
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
// for(i = 0; i < 4; i++)
// {
// if(g_eSpdCaptureWorkSwitch == ON)
// {
// g_u8SpdCaptureTriggersCrossCycleNmb++;
// if(g_u8SpdCaptureTriggersCrossCycleNmb >= 10)
// {
// g_u8SpdCaptureTriggersCrossCycleNmb = 0; //
// g_fSpdCaptureFrequency = 0;
// }
// }
// else
// {
// g_u8SpdCaptureTriggersCrossCycleNmb = 0;
// g_fSpdCaptureFrequency = 0;
// g_u16SpdCaptureLastTimeCounter = 0;
// }
// }
if(g_eSpdCaptureWorkSwitch[0] == ON)
{
g_u8SpdCaptureTriggersCrossCycleNmb[0]++;
if(g_u8SpdCaptureTriggersCrossCycleNmb[0] >= 20)
{
g_u8SpdCaptureTriggersCrossCycleNmb[0] = 0;
g_fSpdCaptureFrequency[0] = 0;
}
}
else
{
g_u8SpdCaptureTriggersCrossCycleNmb[0] = 0;
g_fSpdCaptureFrequency[0] = 0;
g_u16SpdCaptureLastTimeCounter[0] = 0;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
|
|