首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中创建方波(高低交替)

在C#中创建方波(高低交替)
EN

Stack Overflow用户
提问于 2021-09-08 22:18:17
回答 1查看 68关注 0票数 0

我正在试图找到一种方法来创建一个2赫兹的方波发光二极管(基本上在高和低之间切换2赫兹)我有一个一般的感觉,我认为它应该如何去,但不是真的确定该做什么,因为我是新手C#,任何帮助将不胜感激!

以下是我的总体思路:

代码语言:javascript
复制
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}
}
EN

回答 1

Stack Overflow用户

发布于 2021-09-09 12:48:55

您需要一个包含睡眠操作的循环。

您没有告诉我们如何打开和关闭发光二极管,所以我假设您有一个名为SetLED(val)的方法。val为0将关闭发光二极管,1将打开发光二极管。并且,我们有一个名为ButtonPressed()的方法,它在按钮被按下时返回true

要得到2 2Hz的方波,你需要每250毫秒翻转一次val。这段代码会帮你做到这一点。

代码语言:javascript
复制
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()有时会醒得有点晚。这些延迟唤醒可能会累积,使你的方波有点抖动,累积起来不到2赫兹。你不能对抖动做太多的事情。

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

表达式DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond以毫秒为单位得到当前时间(从很久以前的时期开始)。

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

代码语言:javascript
复制
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,但这是另一天的问答。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69110243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档