光电脉冲上升沿检测

方法一, 最大最小值, 跳变取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;

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值