我是编程新手。我需要一些帮助。我的数据记录器中有5个传感器。我打算将传感器数据写入串行闪存。我打算用不同的采样率编写每个传感器。例如:压力= 1Hz,温度= 2Hz,湿度= 2Hz,光= 5Hz,3轴,100Hz。 因此我的循环将有不同的迭代。 如何制作一个每次都可以变化的循环?我写了一个函数来读取每个传感器的写入频率。
如下所示
char getpressurefreq();
char getluxfreq();
char gettempfreq();
char gethumidityfreq();
uint16_t getACCfreq();`
我把它们保留在主要功能中。 现在我有频率数据。 现在我必须根据上述频率进行循环。
如何为上述输入编写循环?请提出一些解决方案。谢谢大家。
答案 0 :(得分:0)
假设您已经编写了为这些功能提供数据的硬件驱动程序,那么第一步就是创建标准功能接口。
您可以通过牺牲几个字节的堆栈RAM来轻松完成此操作:
ManyToMany
由于其实现定义的签名,你永远不应该使用typedef uint16_t freq_read_t (void);
来保存整数值。
每个读取频率的传感器驱动程序现在必须实现具有上述指定格式的函数。
然后在调用者中,您可以创建一个函数指针数组:
char
(将指针声明为数据的常量指针,因此它将存储在NVM中)
无论函数如何,循环都将变得微不足道并且是相同的:
freq_read_t* const freq_read [SENSORS_N] =
{
getpressurefreq,
getluxfreq,
gettempfreq,
gethumidityfreq,
getACCfreq,
};
答案 1 :(得分:0)
在对传感器数据进行采样时,需要配置计时器模块以设置系统的基准时间。由于您的最快信号将以100 Hz的频率进行采样,因此您可以使用10 ms的时基。
通常定时器会触发一个中断,然后在定时器中断处理程序中你可以这样写:
Sub Tester()
Dim arr
arr = Split("A,B,C,D", ",")
Debug.Print "Before:", Join(arr, ",")
RemoveItem arr, "A"
Debug.Print "After:", Join(arr, ",")
End Sub
Sub RemoveItem(ByRef arr, v)
Dim rv(), i As Long, n As Long, ub As Long, lb As Long
lb = LBound(arr): ub = UBound(arr)
ReDim rv(lb To ub)
For i = lb To ub
If arr(i) <> v Then
rv(i - n) = arr(i)
Else
n = n + 1
End If
Next
'check bounds before resizing
If (ub - n) >= lb Then ReDim Preserve rv(lb To ub - n)
arr = rv
End Sub
作为替代方案,如果您没有计时器(或者您不想配置计时器),则需要使用相同的方法来创建延迟功能。然后在你的主循环中你可以这样做:
void TimerInt(void)
{
static uint32_t ticks = 0;
ticks++;
/* sample pressure */
if ((ticks % 100) == 0)
{
read_pressure();
}
/* sample temp and humidity*/
if ((ticks % 50) == 0)
{
read_temperature();
read_humidity();
}
/* sample light*/
if ((ticks % 20) == 0)
{
read_light();
}
/* sample 3-axis - every time */
read_3_axis();
}
PD:如果您提到您正在使用的平台,将会很有帮助。