初级会员

- 积分
- 60
- 金钱
- 60
- 注册时间
- 2016-7-8
- 在线时间
- 11 小时
|
发表于 2016-7-11 20:49:35
|
显示全部楼层
都是自己凭感觉写的 可能比较乱 也不规范 见谅哈
用的是等精度方法测频率 开了2个定时器 TIM2作为预阀门信号,TIM3作为实际阀门信号,用捕获通道1捕获待测信号,计数脉冲。
// 32位控制&计数变量 state_cnt //
// 32:26 25 24 23-0 //
// 保留 valve busy cnt //
u32 state_cnt;
/****************TIM3中断服务函数****************/
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_FLAG_CC1))
{
switch(state_cnt&(1<<25))
{
case 0:
switch(state_cnt&(1<<24))
{
case 0:
state_cnt = (1<<25)|(1<<24) + 1; //valve = 1, busy = 1, cnt = 0
TIM3->CNT = 0;
TIM_Cmd(TIM3, ENABLE); //打开基准信号定时器
break;
default:
TIM_Cmd(TIM3, DISABLE); //关闭基准信号定时器
// state_cnt &= ~(1<<24); //把忙标志清除和计算freq放在按键的中断函数里,提升捕获中断函数的效率
break;
}
break;
default:
state_cnt++;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1|TIM_IT_Update);
}
}
/****************TIM2中断服务函数****************/
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(temp == 0) //加入这段代码消除打开更新中断时立即进入中断的影响
temp++;
else
state_cnt &= ~(1<<25); //发出关闭实际阀门的信号
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
|
|