1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
```C++
################################################
// бегущее среднее
float k = 0.1; // коэффициент фильтрации, 0.0-1.0
float expRunningAverage(float newVal) {
static float filVal = 0;
filVal += (newVal - filVal) * k;
return filVal;
}
################################################
// медиана на 3 значения со своим буфером
float medianRoom(float newValRoom) {
static float bufRoom[3] = {0, 0, 0};
if (!(bufRoom[0] + bufRoom[1] + bufRoom[2]))
bufRoom[0] = bufRoom[1] = bufRoom[2] = newValRoom;
static byte countRoom = 0;
bufRoom[countRoom] = newValRoom;
if (++countRoom >= 3)
countRoom = 0;
float dataRoom = (max(bufRoom[0], bufRoom[1]) == max(bufRoom[1], bufRoom[2]))
? max(bufRoom[0], bufRoom[2])
: max(bufRoom[1], min(bufRoom[0], bufRoom[2]));
// return expRunningAverage(data);
return dataRoom;
}
################################################
# это не совсем средние это апериодичное звено или простейший фильтр НЧ , и он имеет зону не чувствительности, скользящие средние делается через массив, код для ПЫКов , ну думаю разберетесь.
unsigned int ReadADC_AN0(void)
{ static unsigned char s_ucCount;
static unsigned int m_TempResalt[32];
static unsigned int s_uiSymm;
s_ucCount++;
s_ucCount&=0b00011111;
s_uiSymm -= m_TempResalt[s_ucCount];
__delay_us(20);
ADCON0bits.GO_DONE=1;
while(ADCON0bits.GO_DONE) continue;
__delay_us(5);
m_TempResalt[s_ucCount] = ADRESH;
m_TempResalt[s_ucCount]<<=8;
m_TempResalt[s_ucCount]+= ADRESL;
s_uiSymm += m_TempResalt[s_ucCount];
return s_uiSymm/32;
}
################################################
// AVR: Усредняем показания:
// revOld = старое значение
uint16_t filtr(uint16_t rev)
{
static uint8_t a = pow(2, KOEFF) - 1;
(revOld > rev / KOEFF) ? revOld = (a * revOld + rev) >> KOEFF : revOld = rev;
return revOld;
}
################################################
################################################
```
|