本人新手上路,最近在做测相位差的实验,考虑到响应时间与能力范围,暂不考虑用FFT做。
参考了原子的捕获高电平的实验与论坛里捕获周期的实验,感谢。
思路主要是:TIM2_CH1 测一路方波的频率 捕获连续两个上升沿的方法 存在ReadValue1、ReadValue2内 然后两者做差
TIM3_CH1 测另一路方波的频率 捕获连续两个上升沿的方法 存在ReadValue3、ReadValue4内 然后两者做差
以上步骤由两个中断完成,中断优先级设为一致,每完成一次捕捉,标志位over_ch1与over_ch2分别置位
当两组都捕捉完一次后清零两个计数器的值并对获取的ReadValue1、ReadValue3做处理
个人认为两者大小的差TIM2_CAPTURE_TC要减去一个周期,然后再折算成角度,该部分程序不贴了。
贴上关键的定时器的中断服务子程序与相位差求取数值程序
频率测量精度较高,相位差测量很不稳定
//定时器3中断服务程序 定时器2雷同
void TIM3_IRQHandler(void)
{
if((TIM3CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
if(TIM3CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM3CH1_CAPTURE_STA&0X3F)==0X3f)//高电平太长溢出了
{
TIM3CH1_CAPTURE_STA=0X80;//标记成功捕获了一次
TIM3CH1_CAPTURE_VAL=0;
}
else TIM3CH1_CAPTURE_STA++;
}
}
if(TIM_GetITStatus(TIM3,TIM_IT_CC1)!=RESET)//捕获1发生捕获事件
{
if(TIM3CH1_CAPTURE_STA&0X40) //捕第二次获到上升沿
{
ReadValue4 = TIM_GetCapture1(TIM3);
if ((ReadValue4 > ReadValue3)&&(TIM3CH1_CAPTURE_STA==0x40)) //无溢出低五位为零
{
TIM3CH1_CAPTURE_VAL=(ReadValue4-ReadValue3);
}
else //有溢出
{
TIM3CH1_CAPTURE_VAL=((0xFFFF-ReadValue3)+ReadValue4);
}
TIM3CH1_CAPTURE_STA=0X80; //标记成功捕获了一次
//TIM_SetCounter(TIM2,0);
over_T3CH1=1;
}
else //第一次捕获上升沿
{
ReadValue3=TIM_GetCapture1(TIM3);
TIM3CH1_CAPTURE_VAL=0;
TIM3CH1_CAPTURE_STA = 0X40; //标记捕获到了上升沿
}
}
}
TIM_ClearITPendingBit(TIM3,TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
void phase_del(void)
{
if(over_T2CH1==1&&over_T3CH1==1)
{
over_T2CH1=0;
over_T3CH1=0;
TIM_SetCounter(TIM2,0);
TIM_SetCounter(TIM3,0);
if(ReadValue3-ReadValue1>=0) //CH2超前CH1
{
TIM2_CAPTURE_TC=ReadValue3-ReadValue1;
flag=0;
}
if(ReadValue3-ReadValue1<0) //CH1超前CH2
{
TIM2_CAPTURE_TC=ReadValue1-ReadValue3;
flag=1;
}
}
}
|