summaryrefslogtreecommitdiff
path: root/_PROGRAMs/C++/УСРЕДНЕНИЕ.md
diff options
context:
space:
mode:
authorvlapa <vlapa@ya.ru>2026-06-13 20:33:26 +0300
committervlapa <vlapa@ya.ru>2026-06-13 20:33:26 +0300
commite5abc1fe99340b979b18864d978179f71fe8f5c5 (patch)
tree98fd0ad7c6d0744894d6e74e446daacd9e6dd1b5 /_PROGRAMs/C++/УСРЕДНЕНИЕ.md
First
Diffstat (limited to '_PROGRAMs/C++/УСРЕДНЕНИЕ.md')
-rw-r--r--_PROGRAMs/C++/УСРЕДНЕНИЕ.md67
1 files changed, 67 insertions, 0 deletions
diff --git a/_PROGRAMs/C++/УСРЕДНЕНИЕ.md b/_PROGRAMs/C++/УСРЕДНЕНИЕ.md
new file mode 100644
index 0000000..3204281
--- /dev/null
+++ b/_PROGRAMs/C++/УСРЕДНЕНИЕ.md
@@ -0,0 +1,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;
+}
+
+################################################
+
+
+################################################
+```
+