请问C#如何实现微秒的延迟

解开了 20cm2022-04-101672 次点击
Python中的代码,可以实现10us的延迟。
```
# 发送高电平信号到 Trig 引脚
GPIO.output(GPIO_TRIGGER, True)
# 持续 10 us
time.sleep(0.00001)
GPIO.output(GPIO_TRIGGER, False)
```
C#用的包是 System.Device.Gpio
C#中的sleep是毫秒,不能是小数,请问怎么实现us的延迟。
收藏 ♥ 感谢
Spoony 小组长 2022-04-10 
/// <summary>
/// 微秒级延迟,会稍有偏差
/// </summary>
/// <param name="time">延迟时间 毫秒(除以1000即微秒,如输入参数0.05ms = 50us)</param>
/// <returns></returns>
public static double delayUs(double time)
{‌
System.Diagnostics.Stopwatch stopTime = new System.Diagnostics.Stopwatch();

stopTime.Start();
while (stopTime.Elapsed.TotalMilliseconds < time) {‌}
stopTime.Stop();

return stopTime.Elapsed.TotalMilliseconds;
}

https://www.cnblogs.com/Mars-0603/p/15325199.html
解开了 20cm 2022-04-10 
这个代码用过了,百度上的都是这个,没什么用。
输入0.05,返回的大概0.18左右,差别太大。
去除while,就start、stop两句占用0.03ms。
Spoony 小组长 2022-04-10 
@解开了 CPU对高级语言代码的执行本身就有时间开销,而且是以微甚至毫秒计的。
这个是无法避免的误差。高级语言的编译软件层面解决不了,要绝对精确可能要从硬件和操作系统层面解决。

因为这个,ASM 这类机器语言才一直存在至今啊。
解开了 20cm 2022-04-10 
C#操作树莓派的资料少的可怜,大部分都是python的。
感觉应该是有其他方法能够实现的,只是没有找到而已。
Mich_Chu 25cm 2022-04-10 
要非常淮的話, 要用PICO 的PIO去寫。
Spoony 小组长 2022-04-10 
@解开了 Python 的参数虽然可以指定为微秒,但是实际上误差是毫秒级的。你找到方法了希望能在这边反馈一下。
解开了 20cm 2022-04-10  ♥ 1
方法已找到,引用System.Device.Gpio包。
使用超声波模块测试成功,Trig使用以下代码发送。
int frequency = 20; //频率,1秒20次
double one = 1d / frequency * 1000d * 1000d; //每次占用的微秒数
double dutyTime = 10d / one; //占空比,HC-SR04超声波模块的脉冲高电平时间为10微秒
System.Device.Pwm.PwmChannel pwm = System.Device.Pwm.PwmChannel.Create(0, 0, frequency, dutyTime);
pwm.Start();

Pwm有个缺点,就是Create的第1、2参数,是固定的几个GPIO才行,BCM 12,18,13,19。
参考:https://github.com/dotnet/iot/blob/main/Documentation/raspi-pwm.md

登录注册 后可回复。