本帖最后由 287213431 于 2016-10-10 13:38 编辑
有偿请解决STM8输入捕获测量PWM脉宽问题 问题是:测量20Hz—450Hz的频率不准确。 用中断方式或者查询方式都得不到正确的结果。 实验硬件:STM8S003F3P6, TIM2—CH1(PC5)输出PWM(频率:20Hz—450Hz),(频率用示波器测量 准确!) TIM1——CH3(PC3)输入捕获通道, 测量TIM2—CH1输出的PWM频率(如图)。
有偿100元解决问题。测试成功立即转账 微信红包或者支付宝。
下面是测试代码(有问题的):
int main(void) { /*设置内部高速时钟16M为主时钟*/ CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
TIM2_DeInit(); TIM2_TimeBaseInit(TIM2_PRESCALER_32, 25000); TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 2500, TIM2_OCPOLARITY_HIGH); TIM2_Cmd(ENABLE);
GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT); //初始化TIM1输入捕捉通道3 TIM1_DeInit(); //16分频 TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 20000, 0); TIM1_ICInit(TIM1_CHANNEL_3,TIM1_ICPOLARITY_RISING,TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV4, 0x00); IM1_ClearFlag(TIM1_FLAG_CC3); TIM1_ITConfig( TIM1_IT_CC3 , ENABLE); //去掉是查询方式,否则是中断方式 //TIM1_ITConfig( TIM1_IT_UPDATE, ENABLE); TIM1_CCxCmd(TIM1_CHANNEL_3, ENABLE);//使能输入捕获通道3 TIM1_Cmd(ENABLE); //使能定时器 __enable_interrupt();//启动全局中断 while(1) {
} // main loop }
中断部分: #pragma vector=0xD __interrupt voidTIM1_UPD_OVF_TRG_BRK_IRQHandler(void) { F01++ ; TIM1_ClearITPendingBit(TIM1_IT_UPDATE); } #pragma vector=0xE __interrupt voidTIM1_CAP_COM_IRQHandler(void) { if((TIM1_GetITStatus(TIM1_FLAG_CC3)) != RESET) { switch(temp) { case 0: ICValue1=TIM1_GetCapture3(); TIM1_ITConfig( TIM1_IT_UPDATE, ENABLE); temp=1; break; case 1: ICValue2=TIM1_GetCapture3(); TIM1_ITConfig( TIM1_IT_UPDATE, DISABLE); temp=2; break; default: TIM1_CCxCmd(TIM1_CHANNEL_3, DISABLE); TIM1_ITConfig(TIM1_IT_CC3, DISABLE); temp=3; break; }
TIM1_ClearITPendingBit(TIM1_IT_CC3); TIM1_ClearFlag(TIM1_FLAG_CC3); } if(temp==2) { Period = 20000*(u32)F01 + ICValue2-ICValue1; Hz_V=4000000/Period ; T_V=10000/Hz_V; F01=0; } TIM1_ClearITPendingBit(TIM1_IT_UPDATE); }
上面的代码,测量20Hz 、40Hz 、80Hz 、120Hz、…… 很准(在IAR下ST-LINK V2 仿真 结果)。 前提只改变函数TIM2_TimeBaseInit(TIM2_PRESCALER_32,25000);函数里的TIM2_PRESCALER_32分频系数,比如改16分频,8分频,4分频,2分频等 都很准。
改变计数值就不准了,比如吧25000改 10000.测量结果就不准了。 这是问题一。 还有就是改变 输入捕获TIM1函数TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP, 20000, 0);的计数值也测量不准了。比如把20000改成30000 就不准了。改小还是准的(如改成10000或者5000)。
搞了一个星期了 没有搞出来,我甚至怀疑硬件有BUG。欢迎高手不惜赐教! 微信号:18806541688 2016-10-10
|