MCU : STM8S103K3T6
目的:捕获4路PWM的高电平宽度,频率50HZ 周期20MS 高电平宽度1——2MS (航模接收机输出的信号,要求捕获这个脉宽值)
写了个测试程序 一路信号接到 TIM1_CH1 通道 利用中断方式 来捕获值。
然后网上找了一些资料,看了一下。 参考下载的资料程序,对照手册 不断测试了,发现就是捕获不到实际的值。
无奈,发帖请教大家 ,如果做过的朋友,请指点下。
以下 是程序部分
中断能进去 上升 下降 中断 都没问题。 就是读取值部分 总是不对。 不知道哪里有误。。
- //定时器 设置部分
- enableInterrupts(); //打开总中断
- TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP,6000, 0);
-
- //RISING 上升
- TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI , TIM1_ICPSC_DIV8, 0x0);
-
- TIM1_ITConfig( TIM1_IT_CC1 , ENABLE);
-
- TIM1_ClearFlag(TIM1_FLAG_CC1);
-
- TIM1_Cmd(ENABLE);
- //TIM1 捕获中断 程序部分
- INTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12)
- {
- /* In order to detect unexpected events during development,
- it is recommended to set a breakpoint on the following instruction.
- */
- //是不是上升沿捕获中断
- if((TIM1->CCER1 & TIM1_CCER1_CC1P)==0)// //与运算 之前是上升沿 还是下降沿中断 如果之前是1 那么下降 那么就是下降沿
- {
- // T1_CAP[0] = ( TIM1->CCR1H << 8 );
- // T1_CAP[0] |= TIM1->CCR1L;
-
- TIM1->CCR1H=0;
- TIM1->CCR1L=0;
-
- // TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1P); //设置 上升沿中断
- TIM1->CCER1 |= TIM1_CCER1_CC1P; //设置 下降沿中断
-
- }
- else //下降沿中断
- {
- T1_CAP[1] = ( TIM1->CCR1H << 8 );
- T1_CAP[1] |= TIM1->CCR1L;;
-
- T1_CAP_VAL=T1_CAP[1]-T1_CAP[0];
-
- TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1P); //设置 上升沿中断
- // TIM1->CCER1 |= TIM1_CCER1_CC1P; //设置 下降沿中断
- }
-
- TIM1_ClearFlag(TIM1_FLAG_CC1);
- // TIM1_ClearITPendingBit(TIM1_IT_CC1) ;
- }
复制代码
TIM1_CCR1L(即计数高位)可以清除标志位,
或也可以软件写零来清除。
就是因为这句话,我把最后一个清除输入捕获标志位给去了。然后就正常了
楼主你也可以试下。
行 我试试
第一个回复的,那么 最佳答案就给你了。 谢谢
一周热门 更多>