关于输入捕获问题
void TIM2_IRQHandler(void){
if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM2CH1_CAPTURE_VAL=0XFFFF;
}else TIM2CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM2CH1_CAPTURE_STA=TIM2CH1_CAPTURE_STA&0Xbf;
num_rise++;
HVAL=TIM_GetCapture1(TIM2);
HTIME=TIM2CH1_CAPTURE_STA&0X3f;
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}else //还未开始,第一次捕获上升沿
{
if(num_rise==0){
TIM2CH1_CAPTURE_STA=0; //清空
TIM2CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
}
if(num_rise==1)
{
num_rise=0;//为下次测量做准备
TIM2CH1_CAPTURE_STA|=0X80;//周期捕获成功
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
}
}
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
这是中断服务函数,在这边我捕获一个上升沿和一个下降沿来捕获高电平时间,然后再捕获一个上升沿来捕获周期时间,但是我这样好像只能同时测一个范围内的频率和占空比。。。。求解答!!!
定时器的时钟可以实时调节,这样就可以扩大测量范围了 这个很简单的 你好我好大家好! 发表于 2015-8-7 09:34
定时器的时钟可以实时调节,这样就可以扩大测量范围了
但是我又个疑问,现象是这样的:我测1KHZ以下的频率周期测得准,但是占空比测不准,不知道是什么原因,然后把分频数改到36735才可以测得到2HZ的占空比。这个是什么原因呢??? stary666 发表于 2015-8-7 09:46
这个很简单的
求解答,或者分享下程序我参考参考 你用的芯片型号是什么啊? 那就地方iv 发表于 2015-8-7 13:00
你用的芯片型号是什么啊?
stm32f103rct6 oh,no 发表于 2015-8-7 11:45
但是我又个疑问,现象是这样的:我测1KHZ以下的频率周期测得准,但是占空比测不准,不知道是什么原因,然 ...
是不是存储占空比变量的那个格式不正确 你好我好大家好! 发表于 2015-8-7 14:54
是不是存储占空比变量的那个格式不正确
应该不是,频率大一些的时候占空比测又得准了,小了反而测不准。前提是频率都测得准(也就是周期测得准)。。。 oh,no 发表于 2015-8-8 08:23
应该不是,频率大一些的时候占空比测又得准了,小了反而测不准。前提是频率都测得准(也就是周期测得准) ...
那就不清楚了
页:
[1]
2