如何实时测转速?对每个信号周期(每个高+低电平5ms----500ms)都要测量,测量完毕(在一个周期内)马上做出处理,请大家给予指点。不能通过定时时间内计算脉冲个数来测量,那样太慢,下面的程序为什么不能够测量?
转速问题if(T0IF) //time0 200us中断0.2ms
{
T0IF=0;
TMR0=53;
if(!in1)//发动机开始旋转RA2口平时转速为0的时候一直为高,转速以来马上变低
{
if(gaodi) { tlow++;} //低 电平时间长
else
{
if (thigh>=250) //1200转以下设标志位speed1=1 {
tlow=0;
thigh=0;
speed1=1;led2=0;
}
else if ((thigh>=130) && (thigh<250))//1200--2400转以下设标志位speed2=1 {
tlow=0;
thigh=0;
speed2=1; led2=1;
}
else //2400转以上 设标志位speed3=1
{
//tlow=0;
//thigh=0;
speed3=1; led2=0;
}
} //上次为高的标志
gaodi=0;
}
else
{
if(!gaodi)
{
thigh++; // 高 电平时间长
}
gaodi=1;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
如果使用8位定时器,则定时器的溢出中断服务程序中将一个16位变量加1;如果是16位定时器,则使用8位的变量——如此联合构成“24位”的定时器。
引脚的电平变化中断服务程序中,将“24位”的定时器值保存(程序中维护两个定时器的值:“高电平时间值”一个、“低电平时间值”一个)并将其清零准备下一次“捕获”。
“捕获”发生时,如果是正跳变,则用当前“24位”定时器的值来更新“低电平时间值”;如果是负跳变,则更新“高电平时间值”。由“低电平时间值”与“高电平时间值”相加,得到外部脉冲信号的“实时”周期——这样的好处是,每周期可以计算两次,缺点是程序稍显复杂、运算量偏大,适合于外部信号的频率不很快、其高低电平宽度大致相当的情况。
如果是使用霍尔器件等情况,由于一个周期内,高低电平时间有显著差异,可以每周期只计算一次,可以在正跳变之后、也可以在负跳变之后,根据脉冲信号的高低电平时间长短来选择。
once the ioc is triggered, reset the timer; and wait for the next ioc to trigger. so you know the duration of each cycle.
一周热门 更多>