gpt4 book ai didi

c - LED 条形指示器在相邻值内闪烁以及如何避免这种情况(嵌入式 C)

转载 作者:行者123 更新时间:2023-12-01 17:11:28 27 4
gpt4 key购买 nike

我正在设计一种测量仪器,该仪器在 30 个 LED 条上具有可见的用户输出。程序逻辑以这种方式运行(伪代码)

while(1)
{
(1)Sensor_Read();
(2)Transform_counts_into_leds();
(3)Send_to_bar();
{

相关函数 (2) 是一个简单的算法,它将 I2C 传感器的计数转换为串行发送到控制单个 LED 的移位寄存器的值。发送到函数 (3) 的变量只是必须保持开启状态的 LED 数量(0 表示所有 LED 关闭,30 表示所有 LED 开启)

uint8_t Transform_counts_into_leds(uint16_t counts)
{
float on_leds;
on_leds = (uint8_t)(counts * 0.134); /*0.134 is a dummy value*/
return on_leds;
}

使用此程序逻辑,当计数值达到两个 LED 之间的阈值时,下一个 LED 闪烁

我认为这对我的设备来说是一种糟糕的用户体验,我希望 LED 在点亮后能够在较小的值范围内保持稳定。

问题:如何在我的项目中实现此问题的解决方案?

最佳答案

迟滞对于许多应用都很有用,但我建议在这种情况下不合适。问题是,如果水平真的从 8 下降到 7,那么您不会看到任何变化,直到至少有一个 6 的样本,它会跳到 6,并且在返回到 6 之前必须有 8 的样本。 7.

在这种情况下,更合适的解决方案是移动平均值,尽管使用移动总和并使用给出的更高分辨率更简单且更有用。例如,16 的移动和有效地增加了(几乎)4 位分辨率,使 8 位传感器有效地变为 12 位 - 当然是以带宽为代价的;你不会不劳而获。在这种情况下,较低的带宽(即对较高频率的响应较少正是您所需要的)

移动总和:

#define BUFFER_LEN 16 ;
#define SUM_MAX (255 * BUFFER_LEN)
#define LED_MAX 30

uint8_t buffer[BUFFER_LEN] = {0} ;
int index = 0 ;
uint16_t sum = 0 ;

for(;;)
{
uint8_t sample = Sensor_Read() ;

// Maintain sum of buffered values by
// subtracting oldest buffered value and
// adding the new sample
sum -= buffer[index] ;
sum += sample ;

// Replace oldest sample with new sample
// and increment index to next oldest sample
buffer[index] = sample ;
index = (index + 1) % BUFFER_LEN ;

// Transform to LED bar level
int led_level = (LED_MAX * sum) / SUM_MAX ;

// Show level
setLedBar( led_level ) ;
}

关于c - LED 条形指示器在相邻值内闪烁以及如何避免这种情况(嵌入式 C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41188461/

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