【问题标题】:Creating a Square Wave (Alternating between high and low) in C#在 C# 中创建方波(高低交替)
【发布时间】:2021-09-08 22:18:17
【问题描述】:

我正在尝试找到一种方法来为 LED 创建 2 Hz 方波(基本上在 2Hz 时在高低之间切换)我大致了解我认为应该如何进行,但不确定该怎么做由于我是 C# 新手,任何帮助将不胜感激!

这是我的一般思考过程:

While(Programruns){
      read input 
(I feel like there should be a for loop here to keep the square wave going forever until I stop it)
      if(button is pressed){
     output square wave
}
    else {
     off}
}

【问题讨论】:

  • 您忘记提问了吗?
  • @CaiusJard - "...但是not really sure what to do 因为我是 C# 新手,任何帮助将不胜感激!"
  • 我认为,对于我们这个行业的新手来说,这是一个很好的问题。最简单且天真的答案涉及在循环中使用Thread.Sleep(500)。但一个好的答案涉及更多,因为线程不会在请求的确切时间内休眠。
  • 糟糕,我的意思是Thread,Sleep(250)。看我的回答。

标签: c# datetime waveform


【解决方案1】:

你想要一个包含睡眠操作的循环。

您没有告诉我们如何打开和关闭 LED,所以我假设您有一个名为 SetLED(val) 的方法。 val 为 0 关闭 LED,1 将其打开。并且,让我们有一个名为 ButtonPressed() 的方法,当按下按钮时返回 true

要获得 2Hz 方波,您需要每 250 毫秒翻转一次val。此代码将为您完成。

var ledState = 1;
while (ButtonPressed()) {
    SetLED(ledState);
    Thread.Sleep(250);         //milliseconds
    ledState = 1 - ledState;   //flip the value
}
SetLED(0);   // turn the LED off when done.

这基本上会奏效。但有一个复杂之处:C# 及其各种底层操作系统不是hard real-time systems。因此Thread.Sleep() 有时会醒得有点晚。这些迟到的唤醒会累积起来,使您的方波有点紧张,累积起来会小于 2Hz。对于抖动,您无能为力。

但是您可以通过查看时间时钟并计算每个循环中的休眠时间来避免频率下降。

表达式DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond 以毫秒为单位为您提供当前时间(从很久以前的某个时代开始)。

因此,您可以计算代码中下一次睡眠的毫秒数。这更正了 .Sleep() 睡过头。

var ledState = 1;
long nextTickTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; 
while (ButtonPressed()) {
    SetLED(ledState);
    nextTickTime += 250;
    long nowTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
    int sleepInterval = nextTickTime - nowTime;
    if (sleepInterval > 0) 
      Thread.Sleep(sleepInterval); 
    ledState = 1 - ledState;   //flip the value
}
SetLED(0);   // turn the LED off when done.

这是一个相当强大的闪光灯。您也可以在循环运行时提出priority of the thread,但这是另一天的问题和答案。

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2011-12-26
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    相关资源
    最近更新 更多