使用Java从Raspberry Pi 3进行高频GPIO输出

h6my8fg2  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(193)

我使用LibGDX为firma创建了一个Java游戏。它将在树莓派3上运行。它是一个著名的街机内阁的克隆。游戏已经准备好了。使用evdev库的端口的操纵杆控制工作良好。应用程序将使用Pi 4j库与硬币接受器等外部设备进行交互,基于WS 2812芯片和7段式LED显示屏的串行LED显示链,但串行LED显示链的控制存在问题,需要有高频的串行脉冲。控制脉冲必须在500到1500纳秒之间才能传输数据。我对引脚GPIO 26进行了一个简单的测试,以了解GPIO输出的典型频率:

long end;
long start = System.nanoTime();
for (int i =0; i++; i<10000){
     ledPin.high();
     ledPin.low();
}
end = System.nanoTime();
double statementChangingTime = (double)(end - start)/(10000*2);

我已经得到了语句更改之间的时间在3500 - 9000纳秒之间。它太长了。
我想知道,是否可以使用Pi 4J来增加频率(使statementChangingTime更小)?也许我需要选择另一个引脚?也许我需要改变raspi-config中的某些内容?也许我可以使用另一个库?我不知道C/C++,也不能为自己编写低级代码和Java Package 器。

x8diyxa7

x8diyxa71#

pi 4j库有不同的代码示例。其中一个(LED Strip example)似乎是您问题的完美匹配。
生成WS 2812芯片所需的时序,并以所需的速率将GPIO引脚切换到高/低,即使在C中工作也很困难,在Java中工作时可能几乎不可能。
pi 4j中的示例使用SPI接口来精确地生成所需的时序。(注意,所采用的方法与您在评论中链接的elektormagazine中的方法不同。)
SPI的位时序设置为基本速率,约为156 ns/位,WS 28 xx的数据产生如下:

  • WS 2812的0位(350 ns高电平,900 ns低电平)被写为0b1100_0000(2位高电平-〉312 ns,6位低电平-〉936 ns)
  • WS 2812的1位(900 ns高,随后是350 ns低)被写入0xb1111_1000(5位高-〉780 ns,3位低-〉468 ns低)

这样产生的时序完全在WS 28 xx芯片的规定限制范围内。
该示例采用所有已配置芯片的RGB代码,并创建一个字节数组,其中每个字节对应一个输出位。然后通过MOSI引脚发送这些字节,从而创建所需的波形。
请注意,驱动程序使用SPI的集成FIFO连续发送这些字节(只要有一些数据可供发送,它就会使FIFO保持满状态)。
您注意到直接使用GPIO并使用CPU创建所需波形将允许您基本上发送无限长度的位流。
然而,这样做可以证明棘手,如果你想

  • 动态生成数据(使用循环和if/else)
  • 产生精确的波形而没有太多的抖动

如果你的CPU /运行时很慢,那么你根本就不能使用这种方法。

相关问题