0
点赞
收藏
分享

微信扫一扫

光电脉冲上升沿检测


方法一, 最大最小值, 跳变取50%

这种方法很简单, 但是这种方法 有bug, maxPulse 和minPulse 会陷入极限值, 例如 -0 和 -65536

应当要注意初始化参数的取值. 即便是取值正确也仍然会陷入局部最小值, 导致minPulse和maxPulse 取值失去作用.

/// <summary>
/// 最大光电脉冲值
/// </summary>
public static float maxPulse = float.MinValue; //初始化这么小,是为了防止陷入默认值. 不变化

/// <summary>
/// 最小光电脉冲值
/// </summary>
public static float minPulse = float.MaxValue; //初始化这么大,是为了防止陷入默认值. 不变化

/// <summary>
/// 平均光电脉冲值
/// </summary>
public static float avgPulse = 0;

/// <summary>
/// 上一个光电脉冲值
/// </summary>
public static float prePulse = 0;
/// <summary>

/// 光电脉冲边沿检测
/// </summary>
/// <param name="newPulse"></param>
static int 检测光电上升沿(float newPulse)
{
if(newPulse > GD.maxPulse)
{
GD.maxPulse = newPulse;
}
if(newPulse < GD.minPulse)
{
GD.minPulse = newPulse;
}

GD.avgPulse = (GD.maxPulse + GD.minPulse) / 2;

if (GD.prePulse < GD.avgPulse & newPulse > GD.avgPulse)
{
GD.prePulse = newPulse;
return GD.RisingEdge; //up
}
else if (GD.prePulse > GD.avgPulse & newPulse < GD.avgPulse)
{
GD.prePulse = newPulse;
return GD.FallingEdge;// down
}


GD.prePulse = newPulse;
return 0;
}

经过改进检测信号的变化率, 这个算法有bug, 微小的浮动也算

static GD.Edge 检测光电上升沿V2(float newPulse)
{
float pv = GD.prePulse1 - GD.prePulse0;//变化率
float nv = newPulse - GD.prePulse1;//变化率
GD.Edge f = GD.Edge.Flat;
if (nv > 0 && nv > pv * 2)
{
// 如果变化率提高了2倍以上, 则认为已经是上升沿来临
f = GD.Edge.Up; //up
}
else if (nv < 0 && nv > pv * 2)
{
f = GD.Edge.Down; //down
}

GD.prePulse0 = GD.prePulse1;
GD.prePulse1 = newPulse;
return f;

}

V3 经过改进检测信号的变化量的角度.原理图如下.

只需要求得α的角度值即可.

大于85度的变化才算是上升沿.

光电脉冲上升沿检测_初始化

static GD.Edge 检测光电上升沿V3(float newPulse)
{
//float pv = (GD.prePulse1 - GD.prePulse0;//变化率
float nv = newPulse - GD.prePulse1 ;//变化的高度
//根据勾股定理, a^2+b^2=c^2

float arf = //求角度这里不会算, 各位自己发挥吧.应该很简单//求阿尔法的角度值


if(arf > 80){
return GD.Edge.Up;
}else if(arf < -80){
return GD.Edge.Down;
}

GD.prePulse0 = GD.prePulse1;
GD.prePulse1 = newPulse;
return 0;

}



举报

相关推荐

下降沿脉冲

0 条评论