在使用STM32F7定时器捕获时,同时开启多路通道,分别对其实时进行频率的计算,共开启了8路定时捕获。其中,TIM2和TIM5为32位定时器,TIM9----TIM14为16为定时器。测试结果发现,所有16位定时器在长时间运行之后(几分钟),频率和时间以及捕获的脉冲数量会不准,表现为脉冲数量增大,运行时间减小(几十毫秒)。并且在捕获频率增大情况下,出现问题的时间也会缩短。TIM2和TIM5为32位定时器所在的通道脉冲时间及频率十分稳定。
捕获的脉冲由脉冲发生器产生,很稳不存在问题。也不是因为几个通道同时开产生的原因,即使只开启一个通道,也是一样的情况。个人能力水平有限,身边没有同行能指导的人,现贴上源码,求助路过吧友。麻烦路过的各位集思广益,指出不对的地方和其他想法,谢谢。
[mw_shl_code=c,false]void TIM1_BRK_TIM9_IRQHandler(void)
{
u16 tsr;
tsr=TIM9->SR;
TIM9->SR=0;//Çå3yÖD¶Ï±ê־λ
// EXTI->IMR&=~(1<<5);
if(tsr&0X01)//òç3ö
{
TIM9CH1_CAPTURE_STA++;
// TIM9->SR&=~(1<<0);//Îñ±ØÇå3yÖD¶Ï±ê־λ
}
else if(tsr&0x02)//2¶»ñ1·¢éú2¶»ñê¼t
{
StandSign2Num+=1;
if(StandSign2Num==1)
{
StandSign2m0=TIM9->CCR1+(TIM9CH1_CAPTURE_STA<<16);//»ñè¡μ±Ç°μÄ2¶»ñÖμ.
Readystate=0;//
addr_data[30]=0x01; /* éÏéyÑØ1yà′£¬¼Æ3õÖμ */
}
else if(DoubleTime_flag==4) /* ÅD¶Ï±»¼ì±íêÇ·ñà′×îoóò»¸öéÏéyÑØ */
{
StandSign2m1=TIM9->CCR1+(TIM9CH1_CAPTURE_STA<<16); /* éÏéyÑØ1yà′£¬¼Æ×îoóÖμ */
Stand2WorkState=1;
if(Stand1WorkState&Stand2WorkState&Stand3WorkState&Stand4WorkState&Stand5WorkState&Stand6WorkState&Stand7WorkState)
{
DoubleTime_flag=0;
addr_data[30] = 0x0002; /* ¼ì¶¨±êÖ¾íê3飬¼Ä′æÆ÷μØÖ·±ØDë¿¿oó,ê1á|¿Øèí¼tÄüÅD¶¨±ê¶¨íê3é*/
addr_data[8] = 0x0002; /* ¼ì¶¨×′ì¬ÖÃ2 */
Readystate=1;
}
TIM9->DIER&=~(1<<1); //1رÕ2¶»ñ1ÖD¶Ï
TIM9->DIER&=~(1<<0); //1رոüDÂÖD¶Ï
TIM9->CR1&=~(1<<0) ;//1رն¨ê±Æ÷
}
if(StandSign2Num>=2)//·àÖ1ààËÆ0/0Ö®ààNot a Number′íÎó¼ÆËã
{
StandSign2m1=TIM9->CCR1+(TIM9CH1_CAPTURE_STA<<16);//
StandSign2m=(StandSign2m1-StandSign2m0);
addr_data2[6]=(Fpclk/(StandSign2m))*((StandSign2Num-1)); /* ±ê×¼±í2ÆμÂê */
addr_data[68]=((u16 *)(& addr_data2[6]))[0];
addr_data[69]=((u16 *)(& addr_data2[6]))[1];
addr_data2[12]=(StandSign2Num-1);//Îaê2Ã′òaoí±»¼ì±íμÄê±¼ä×ö±è½Ï£¿ÕaÑùμĽá1ûóDDTÕyòa궣¬2»·ûoÏêμ¼ê
addr_data[44]=((u16 *)(& addr_data2[12]))[0]; /* ±ê×¼±í2Âö3åêy */
addr_data[45]=((u16 *)(& addr_data2[12]))[1];
addr_data2[18]=(StandSign2m)/(Fpclk); /* ±ê×¼±í2ê±¼ä */
addr_data[32]=((u16 *)(& addr_data2[18]))[0];
addr_data[33]=((u16 *)(& addr_data2[18]))[1];
}
}
}[/mw_shl_code]
[mw_shl_code=c,true]void TIM9_CH1_Cap_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<16; //TIM9 ê±Öóê1Äü
RCC->AHB1ENR|=1<<4; //ê1ÄüPORTEê±Öó
GPIO_Set(GPIOE,PIN5,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PD);//¸′óÃ1|Äü,ÏÂà-
GPIO_AF_Set(GPIOE,5,3); //PE5,AF3
TIM9->ARR=arr; //é趨¼ÆêyÆ÷×Ô¶ˉÖØ×°Öμ
TIM9->

SC=psc; //Ô¤·ÖÆμÆ÷
TIM9->CCMR1|=1<<0; //CC1S=01 Ñ¡Ôñêäèë¶Ë IC1ó3éäμ½TI1éÏ
TIM9->CCMR1|=0<<4; //IC1F=0000 ÅäÖÃêäèëÂË2¨Æ÷ 2»ÂË2¨
TIM9->CCMR1|=0<<10; //IC1PS=00 ÅäÖÃêäèë·ÖÆμ,2»·ÖÆμ
TIM9->CCER|=0<<1; //CC1P=0 éÏéyÑØ2¶»ñ
TIM9->CCER|=1<<0; //CC1E=1 ÔêDí2¶»ñ¼ÆêyÆ÷μÄÖμμ½2¶»ñ¼Ä′æÆ÷ÖD
TIM9->EGR=1<<0; //èí¼t¿ØÖÆ2úéú¸üDÂê¼t,ê1D′èë

SCμÄÖμᢼ′éúD§,·ñÔò½«»áòaμè콶¨ê±Æ÷òç3ö2Å»áéúD§!
TIM9->DIER|=1<<1; //ÔêDí2¶»ñ1ÖD¶Ï
TIM9->DIER|=1<<0; //ÔêDí¸üDÂÖD¶Ï
TIM9->CR1|=0x01; //ê1Äü¶¨ê±Æ÷2
MY_NVIC_Init(0,6,TIM1_BRK_TIM9_IRQn,4);//ÇàÕ¼2£¬×óóÅÏ輶0£¬×é2
}[/mw_shl_code]
TIM2比其他定时器时间多1ms,为个人设置,并不是误差。其他所有定时器时间脉冲数和频率应和TIM5时间一样才对的。
有路过朋友提点意见吗?
一周热门 更多>