Полученный усредненный результат будет на ~6% меньше фактического т.к. мы делим на 128 вместо 120
На вскидку код получается вот такой:
map.h
Code: Select all
typedef struct {
uint16_t buffer[120];
uint16_t *cursor;
}map_t;
map_t map;
#define MAP_START &map.buffer[0]
#define MAP_END &map.buffer[119]
for (map.cursor = MAP_START; map.cursor <= MAP_END; map.cursor++) *map.cursor = 0xFFF; // забиваем в таблицу по дефолту атмосферное давление
map.c
Code: Select all
#include <map.h>
void add_map(uint16_t adc) {
if (map.cursor == MAP_END)
map.cursor = MAP_START;
else map.cursor++;
*map.cursor = adc;
}
// Целочислительный алгоритм усреднения без деления:
// в цилке, начиная от текущщей ячейки буфера, выбираем и складываем их вместе, делаем сдвиг >> 16 для деления и отброса дробной части, примерный код:
uint16_t get_avg_map() {
uint16_t *tmp_cursor;
uint32_t result;
// начинаем от текущщей ячейки включительно и до конца таблицы
for (tmp_cursor = map.cursor; tmp_cursor <= MAP_END; tmp_cursor++) result += *tmp_cursor;
// продолжаем от начала таблицы и до текущщей ячейки
for (tmp_cursor = MAP_START; tmp_cursor < map_buffer_cursor; tmp_cursor++) result += *tmp_cursor;
return ((uint16_t)(result >> 7)); // делим на 128 и приводим тип
}