gpt4 book ai didi

c - C中三个值的有效平均

转载 作者:太空狗 更新时间:2023-10-29 17:12:48 26 4
gpt4 key购买 nike

我们正在从引脚读取一些信号并根据此读数设置更多事件。

为了安全起见,我想对引脚进行 3 次采样,比较三个值并使用最常见的值(即样本 A 为 1,B 为 3,C 为 1,我想使用 1,如果 A B 和C 都是 2 然后使用 2 但如果 A 是 1 ,B 是 2 和 C 是 3,我想再次捕获三个样本)。

目前我正在使用:

int getCAPValues (void)
{
// Get three samples to check CAP signals are stable:

uint32_t x = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // First set of CAP values
for (uint32_t i = 0; i < 7; i++) dummy = i; // Pause
uint32_t y = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // second set
for (uint32_t i = 0; i < 7; i++) dummy = i; // Pause
uint32_t z = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // third set

if (x == y) || (x == z)
{
//use the x value
}
else if (y == z)
{
// use the y value
x = y;
}
else
{
x = -1;
}

return x;
}

但这对我来说似乎不是很有效,有没有更好的方法来做到这一点?

这是在 C 语言的 SAMD21 Xplained Pro 开发板上。

编辑:

我已经根据答案更改了代码,如果将要使用它,则只读取“z”值,并使用 delay_us() 而不是虚拟循环:

int getCAPValues (void)
{
// Get three samples to check CAP signals are stable:

uint32_t x = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // First set of CAP values
delay_us(1);
//for (uint32_t i = 0; i < 7; i++) dummy = i; // Pause
uint32_t y = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // second set
// Using most common value, or error code of -1 if all different

if (!(x == y))
{
delay_us(1);
//for (uint32_t i = 0; i < 7; i++) dummy = i; // Pause
uint32_t z = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // third set
if (x == z)
{
// use the x/z value
return x;
}
else if (y == z)
{
// use the y/z value
return y;
}
else
{
return -1;
}
}
return x;
}

最佳答案

如果 x==y,您将使用 x 的值。所以那样的话你就可以躲开三读了。

我不知道你的值(value)观有多不稳定,但如果有争议的值(value)观实际上很少见,它可以有效地将性能几乎翻倍以避免第二次延迟。

事实上,如果它们并不罕见,那么整个理由可能是无效的。

int getCAPValues (void)
{
// Get three samples to check CAP signals are stable:

uint32_t x = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // First set of CAP values
for (uint32_t i = 0; i < 7; i++) dummy = i; // Pause
uint32_t y = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // second set
if(x!=y){
//x & y are different. Get a tie-breaker...
for (uint32_t i = 0; i < 7; i++) dummy = i; // Pause
uint32_t z = (PORT->Group[IN_PORT_CAP].IN.reg & IN_PORT_CAP_MASK) >> IN_PORT_CAP_PIN; // third set
if (y == z) {
// use the y value
x = y;
} else if(x!=z){
//tie-breaking failed...
x=-1;
}
}
return x;
}

PS:我还认为您应该使用“usleep()”而不是虚拟循环。这取决于您的平台上可用的内容。

关于c - C中三个值的有效平均,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34200046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com