Среднее значение в интервале

GKS123
Offline
Зарегистрирован: 20.03.2019

Добрый день. Подскажите пожалуйста, и если можно то пример кода. Происходит измерение напряжения, но 1 значение 10В, 2 уже 3В, 3, 4... Измерения - стабилене(2.8в-3в). Хочется чтобы выводилось на экран, среднее значение, начиная к примеру с 3 по 10 измерение.

Гриша
Offline
Зарегистрирован: 27.04.2014

GKS123 пишет:
Добрый день. Подскажите пожалуйста, и если можно то пример кода. Происходит измерение напряжения, но 1 значение 10В, 2 уже 3В, 3, 4... Измерения - стабилене(2.8в-3в). Хочется чтобы выводилось на экран, среднее значение, начиная к примеру с 3 по 10 измерение.

вопрос не ясен, вам написать программу "среднего арифметического"?

upd  раз 10 перечитал и не понял

GKS123 пишет:
... но 1 значение 10В, 2 уже 3В, 3, 4... Измерения - стабилене(2.8в-3в). ...
а сколько по факту? и почему такой разброс? 

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

А смысл таких вычислений? И что меряешь?

Может как в фигурном катании ... самый большой и самый маленький результат отбрасывать, а с остальных среднеарифметическое?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Гуглите пословам "медианный фильтр". Там не среднее, но технику работы с интервалами подсмотрите.

GKS123
Offline
Зарегистрирован: 20.03.2019

Муж_Долговой пишет:

А смысл таких вычислений? И что меряешь?

Может как в фигурном катании ... самый большой и самый маленький результат отбрасывать, а с остальных среднеарифметическое?

Не буду лукавить, все не много по другому. Но смысл тот же. 

Вот скетч.

#include <Wire.h>
#include <Adafruit_ADS1015.h>

#define ledPin 13

Adafruit_ADS1115 ads;//(0x48);
/* в файле библиотеки Adafruit_ADS1015.cpp найти все строчки: ADS1015_REG_CONFIG_DR_1600SPS и заменить на: ADS1015_REG_CONFIG_DR_128SPS */

float multiplier = 0.0078125;
const int u_pogr=10;       // 10 мВ - погрешность ADS1115 при измерении 5 В
const float r_ogr=100;  // эталонное сопротивление 100 Ом
float u3300;
int  u_digital;
byte n,k;
long u_sum,u_an,x;
float u_iz,rx,rx_m;

void setup(void){
  Serial.begin(9600);
ads.begin();

//delay(1000);
}
 
void loop(){

  while(x<100){
x++;ads.setGain(GAIN_TWOTHIRDS);
u3300=ads.readADC_SingleEnded(2)*0.1875-u_pogr;}

k++;if(k==60){x=0;k=0;}  // измерение напряжения 5В каждую минуту
 
if(n==0){ads.setGain(GAIN_SIXTEEN);multiplier = 0.0078125;}
if(u_iz>250&&n==0){n=1;}
if(n==1){ads.setGain(GAIN_EIGHT);multiplier = 0.015625;}
if(u_iz>500&&n==1){n=2;}
if(n==2){ads.setGain(GAIN_FOUR);multiplier = 0.03125;}
 
if(u_iz<500&&n==2){n=1;}
if(u_iz<250&&n==1){n=0;}
 

u_sum=0;
for(int i=0;i<100;i++){  // измерение
u_digital = ads.readADC_Differential_0_1();
u_sum = u_sum + u_digital;
delay(1);
}
u_an=u_sum/100;
u_iz=u_an * multiplier;
rx=(u3300/((u3300-u_iz)/r_ogr))-r_ogr;



if(rx<1){rx_m=rx*1000;Serial.print("R = ");Serial.print(rx_m,1);Serial.println(" mOm");}
if(rx>=1&&rx<20){Serial.print("R = ");Serial.print(rx,3);Serial.println(" Om");}
if(rx>=20){Serial.println("  Rx > 20 Om    ");}

Serial.print("U = ");Serial.print(u3300,1);Serial.println(" mV");
Serial.println(" ");


 //delay(2000);
}

в мониторе порта получаем отображение измеряных величин. При запуске программы, приходит максимальное значение, оно нас не устраивает, надо отфильтровать. Вторым делом, надо взять последующие 10 измерений и вывести среднеарефметическое, исключая Min Max. 

bwn
Offline
Зарегистрирован: 25.08.2014

Чет мне кажется, что для извлечения мин-макс нужен массив всех измерений, а потом уже расчет среднего. Могу ошибаться, по математике тройка.((((

Гриша
Offline
Зарегистрирован: 27.04.2014

GKS123 пишет:

в мониторе порта получаем отображение измеряных величин. При запуске программы, приходит максимальное значение, оно нас не устраивает, надо отфильтровать. Вторым делом, надо взять последующие 10 измерений и вывести среднеарефметическое, исключая Min Max. 

Ну, если все "немного по-другому" то

вариант 1 ) собираем измерения в массив, применяем функции min и max для поиска "крайних", считаем сумму массива без учета крайних и делим на кол-во (среднее арифметическое) (это если уверены в постановке задачи)

вариант 2) выясняем постоянные времени измеряемого сигнала, подбираем аппаратный фильтр, подбираем под сигнал програмный фильтр - их много и они разные. т.к. вы решили использовтаь среднее арифметическое - выполнив первую чать, выясним необходимое кол-во измерений и интервал опроса АЦП. Не рационально делать 10 измерений с минимальным интервалом на медленной функции и наоборот, для быстроменяющейся функции сигнала можно получить непонятно что... если измерить ШИМ  прибором TRMS - амплитуду сигнала можно увидеть только при максимальном заполнении ШИМ - самая частая ошибка новичков тыкать неизвестно что, неизвестно куда и кричать у меня не работает.

b707
Offline
Зарегистрирован: 26.05.2017

Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.

Однако в коде выше я подсчет Мин и Макс вообще не вижу, только сумму.

Совет не по делу - не пишите больше одного оператора на строке - крайне неряшливо выглядит и разбираться тяжело. пусть код станет втрое длиннее - зато читать его будет не в пример легче.

GKS123
Offline
Зарегистрирован: 20.03.2019

b707 пишет:

Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.

Однако в коде выше я подсчет Мин и Макс вообще не вижу, только сумму.

Совет не по делу - не пишите больше одного оператора на строке - крайне неряшливо выглядит и разбираться тяжело. пусть код станет втрое длиннее - зато читать его будет не в пример легче.


Спасибо, учтём.

Гриша
Offline
Зарегистрирован: 27.04.2014

b707 пишет:

Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.

Вы правы, но лично мне проще анализировать полные данные, после выполнения можно выгрузить в монитор порта весь массив и посмотреть, чего интересного намерил и как обработал... ИМХО ... монитор порта тормозит, а иногда, измерения необходимо делать часто, хотя 10 это излишество, на мой взгляд, только для дебага и годится

 

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.

Я пять насчитал в голове, мин, макс, результат, считанное, счетчик.
А как с тремя?
Для десяти значений, тоже решил,что массив проще.

Гриша
Offline
Зарегистрирован: 27.04.2014

bwn пишет:

b707 пишет:

Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.

Я пять насчитал в голове, мин, макс, результат, считанное, счетчик.
А как с тремя?
Для десяти значений, тоже решил,что массив проще.

там про хранение идет речь, а не вычисление (альтернатива массиву)

GKS123
Offline
Зарегистрирован: 20.03.2019

Гриша пишет:

bwn пишет:

b707 пишет:

Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.

Я пять насчитал в голове, мин, макс, результат, считанное, счетчик.
А как с тремя?
Для десяти значений, тоже решил,что массив проще.

там про хранение идет речь, а не вычисление (альтернатива массиву)

Читаю вас, понимаю что нихрена не понимаю. Можете отрывок кода, написать,если не составит труда

Гриша
Offline
Зарегистрирован: 27.04.2014

GKS123 пишет:
Читаю вас, понимаю что нихрена не понимаю. Можете отрывок кода, написать,если не составит труда

пост 6 понятен? там ссылки

b707
Offline
Зарегистрирован: 26.05.2017

bwn пишет:

Я пять насчитал в голове, мин, макс, результат, считанное, счетчик.
А как с тремя?
Для десяти значений, тоже решил,что массив проще.

результат и счетчик для массива тоже нужны.

Для небольшого числа измерений массив выглядит проще, да. Но способ без массива хорош своей универсальностью - он подходит и для 10 измерений и для 10 тыс, так что его можно пихать в любой код, не заботясь о том, сколько будет замеров и хватит ли памяти.

Гриша
Offline
Зарегистрирован: 27.04.2014

типа ОФФТОП

b707 пишет:

Для небольшого числа измерений массив выглядит проще, да.

спорно, тому, кто понимает смысл, разницы не будет - просто больше строк в коде

b707 пишет:

 Но способ без массива хорош своей универсальностью - он подходит и для 10 измерений и для 10 тыс, так что его можно пихать в любой код, не заботясь о том, сколько будет замеров и хватит ли памяти.

выделил, а следить за переполнением? Это как с синусом больших углов получим бяку восьмибитных процессоров. недавно обсуждали...

bwn
Offline
Зарегистрирован: 25.08.2014

Гриша пишет:

типа ОФФТОП

выделил, а следить за переполнением? Это как с синусом больших углов получим бяку восьмибитных процессоров. недавно обсуждали...

Не, ну здесь уже здравый смысл должен срабатывать. ИМХО.

b707
Offline
Зарегистрирован: 26.05.2017

Гриша пишет:

выделил, а следить за переполнением?

так при сложении элементов массива тоже надо о переполнении помнить, разве нет?

 

bwn
Offline
Зарегистрирован: 25.08.2014

Эт, Вы господа, уже в казуистику полезли. Применительно к атмеге, 10-бит АЦП и операции сложения, не нужно. Туда массив больше 4тыс элементов, не влезет.))))

Гриша
Offline
Зарегистрирован: 27.04.2014

b707 пишет:

так при сложении элементов массива тоже надо о переполнении помнить, разве нет?

вообще, я этот вопрос для ТС приберегал :))) подобные ошибки уже разбирали на форуме... просто 10 тыс. уж сильно круто взяли...

SLKH
Offline
Зарегистрирован: 17.08.2015

bwn пишет:

Эт, Вы господа, уже в казуистику полезли. Применительно к атмеге, 10-бит АЦП и операции сложения, не нужно. Туда массив больше 4тыс элементов, не влезет.))))

в 2 килобайта уны/наны?

bwn
Offline
Зарегистрирован: 25.08.2014

SLKH пишет:

в 2 килобайта уны/наны?

А про эти и вовсе говорить не о чем.

Гриш, извиняй, что интригу испортил.))))