2025-02-28 C#上位机实现沿信号检测

/// <summary>
/// 带消抖处理的上升沿检测器(精确到毫秒级)
/// </summary>
public class DebouncedRisingEdgeDetector
{
    private bool _previousState; 
    private DateTime _lastTriggerTime = DateTime.MinValue;
    private readonly int _debounceMs; 
    private readonly object _lock = new object();

    /// <summary>    
    /// 初始化消抖检测器    
    /// </summary>    
    /// <param name="debounceMilliseconds">消抖时间(毫秒)</param>   
    /// <param name="initialState">初始输入状态</param>    
    public DebouncedRisingEdgeDetector(int debounceMilliseconds, bool initialState = false)
    {
        _debounceMs = debounceMilliseconds > 0 ? debounceMilliseconds : 10;
        _previousState = initialState;
    }

    /// <summary>    
    /// 检测输入信号的有效上升沿    
    /// </summary>    
    public bool CheckForRisingEdge(bool currentState)    
    {        
        lock (_lock)        
        {            
            bool edgeDetected = false;            
            bool potentialEdge = !_previousState && currentState;            
            if (potentialEdge)
            {                
                TimeSpan elapsed = DateTime.UtcNow - _lastTriggerTime;                
                if (elapsed.TotalMilliseconds > _debounceMs)                
                {                    
                    edgeDetected = true;                    
                    _lastTriggerTime = DateTime.UtcNow;               
                }            
            }           
            _previousState = currentState;            
            return edgeDetected;        
        }    
    }    

    /// <summary>    
    /// 重置检测器状态    
    /// </summary>    
    public void Reset(bool initialState = false)    
    {        
        lock (_lock)        
        {            
            _previousState = initialState;           
            _lastTriggerTime = DateTime.MinValue;       
        }    
    }
}
    //初始化50ms消抖的检测器
    var debounceDetector = new DebouncedRisingEdgeDetector(50);
    //模拟带抖动的输入序列
     bool[] noisyInputs = { false, true, false, true, true, false, true, true };
     foreach (var input in noisyInputs)
     {    
     bool validEdge = debounceDetector.CheckForRisingEdge(input);
    Console.WriteLine($"输入 {input,-5} 有效触发: {validEdge}");    
     //模拟实际应用中的时间间隔
     Thread.Sleep(30);
}

    /* 输出结果:输入 False 有效触发: False
     * 输入 True  有效触发: True  ← 首次触发
     * 输入 False 有效触发: False
     * 输入 True  有效触发: False ← 30ms后仍在消抖期
     * 输入 True  有效触发: False
     * 输入 False 有效触发: False
     * 输入 True  有效触发: True  ← 超过50ms后再次触发
     * 输入 True  有效触发: False
     */
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容