我有大约6个传感器(GPS,IMU等)我需要不断地收集数据。为了我的目的,我需要从每一个(在一个小范围内)读取一个完整的数据包。现在我正在使用中断,但这会导致来自某些传感器的数据比其他传感器多,正如前面提到的,我需要将数据匹配起来。
是否更好的做法是采用基于轮询的系统,在这个系统中,我可以按设定的顺序轮询每个传感器?这样,我就可以在每一个“周期”从每个传感器获得数据。
然而,我担心投票的速度,因为这个系统需要接近实时运行。
发布于 2017-06-05 15:05:59
轮询与“主计时器中断”相结合可以成为您的朋友。假设您的“最慢”传感器可以每隔20‘s提供数据,而其他传感器的读取速度更快。这是每秒50次更新,。如果这足够接近实时(可能对IMU来说很接近),那么您可能会这样做:
timerFlag说是时候时,执行以下操作:
而( 1) { if(timerFlag == 1){<您有此想法;) > timerflag = 0;}通过这种方式,您可以读取每个设备,并保持他们的读数同步。这是在嵌入式空间中解决这个问题的一个典型方法。现在,如果你需要比20毫秒更快的数据,那么你可以缩短计时器等等。像这样的情况下,最大的问题是“你投票的速度有多快”和“你需要投票的速度有多快”。只有试验和了解您的各种设备的特点和时间可以告诉您这一点。但我提出的是一个通用的解决方案,当所有的时间表“合适”时。
编辑,一种不同的方法
一个更基于中断的例子:
volatile uint8_t device1Read = 0;
volatile uint8_t device2Read = 0;
etc...
ISR(device 1)
{
<read device>
device1Read = 1;
}
ISR(device 2)
{
<read device>
device2Read = 1;
}
etc...
// main loop
while(1)
{
if(device1Read == 1 && device2Read == 1 && etc...)
{
//< do something with your "packet" of data>
device1Read = 0;
device2Read = 0;
etc...
}
}在本例中,您的所有设备都可以由中断驱动,但是主循环处理仍然由最慢的中断的频率来控制和调整。每个设备的最新完整读取,无论速度或延迟,都可以使用。这个模式更接近你的想法吗?
发布于 2017-06-05 18:02:46
轮询是一个非常好的和容易实现的想法,万一你的传感器能够立即提供数据(与你想要的输出频率相比)。当数据源需要大量(甚至是变量)时间来提供读取或需要异步“初始化/收集”周期时,就会陷入梦魇。您必须对轮询周期进行排序,以适应“最慢”的数据源。
如果您知道每个源的平均“数据转换率”,可能会有什么解决方案,就是设置多个定时器(每个数据源),这些计时器在poll time - data conversion rate上触发并启动那些计时器ISRs的测量。然后有一个在poll timer + some safety margin上触发的最后一个计时器来收集所有的转换结果。
另一方面,只要您对浪费的CPU/传感器负载没有任何合理的处理,从“快速”数据源“获取太多测量”的明显问题就不会对我造成太大的困扰。
最后一个也是更简单的方法,如果您有一些周期浪费,是:简单地排序数据源从“最慢”到“最快”,并启动一个测量的顺序,然后等待相同的顺序和轮询结果。
https://stackoverflow.com/questions/44371706
复制相似问题