Среднее значение в интервале
- Войдите на сайт для отправки комментариев
Втр, 26/03/2019 - 10:27
Добрый день. Подскажите пожалуйста, и если можно то пример кода. Происходит измерение напряжения, но 1 значение 10В, 2 уже 3В, 3, 4... Измерения - стабилене(2.8в-3в). Хочется чтобы выводилось на экран, среднее значение, начиная к примеру с 3 по 10 измерение.
вопрос не ясен, вам написать программу "среднего арифметического"?
upd раз 10 перечитал и не понял
А смысл таких вычислений? И что меряешь?
Может как в фигурном катании ... самый большой и самый маленький результат отбрасывать, а с остальных среднеарифметическое?
Гуглите пословам "медианный фильтр". Там не среднее, но технику работы с интервалами подсмотрите.
А смысл таких вычислений? И что меряешь?
Может как в фигурном катании ... самый большой и самый маленький результат отбрасывать, а с остальных среднеарифметическое?
Не буду лукавить, все не много по другому. Но смысл тот же.
Вот скетч.
#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.
Чет мне кажется, что для извлечения мин-макс нужен массив всех измерений, а потом уже расчет среднего. Могу ошибаться, по математике тройка.((((
в мониторе порта получаем отображение измеряных величин. При запуске программы, приходит максимальное значение, оно нас не устраивает, надо отфильтровать. Вторым делом, надо взять последующие 10 измерений и вывести среднеарефметическое, исключая Min Max.
Ну, если все "немного по-другому" то
вариант 1 ) собираем измерения в массив, применяем функции min и max для поиска "крайних", считаем сумму массива без учета крайних и делим на кол-во (среднее арифметическое) (это если уверены в постановке задачи)
вариант 2) выясняем постоянные времени измеряемого сигнала, подбираем аппаратный фильтр, подбираем под сигнал програмный фильтр - их много и они разные. т.к. вы решили использовтаь среднее арифметическое - выполнив первую чать, выясним необходимое кол-во измерений и интервал опроса АЦП. Не рационально делать 10 измерений с минимальным интервалом на медленной функции и наоборот, для быстроменяющейся функции сигнала можно получить непонятно что... если измерить ШИМ прибором TRMS - амплитуду сигнала можно увидеть только при максимальном заполнении ШИМ - самая частая ошибка новичков тыкать неизвестно что, неизвестно куда и кричать у меня не работает.
Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.
Однако в коде выше я подсчет Мин и Макс вообще не вижу, только сумму.
Совет не по делу - не пишите больше одного оператора на строке - крайне неряшливо выглядит и разбираться тяжело. пусть код станет втрое длиннее - зато читать его будет не в пример легче.
Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.
Однако в коде выше я подсчет Мин и Макс вообще не вижу, только сумму.
Совет не по делу - не пишите больше одного оператора на строке - крайне неряшливо выглядит и разбираться тяжело. пусть код станет втрое длиннее - зато читать его будет не в пример легче.
Спасибо, учтём.
Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.
Вы правы, но лично мне проще анализировать полные данные, после выполнения можно выгрузить в монитор порта весь массив и посмотреть, чего интересного намерил и как обработал... ИМХО ... монитор порта тормозит, а иногда, измерения необходимо делать часто, хотя 10 это излишество, на мой взгляд, только для дебага и годится
Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.
Я пять насчитал в голове, мин, макс, результат, считанное, счетчик.
А как с тремя?
Для десяти значений, тоже решил,что массив проще.
Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.
Я пять насчитал в голове, мин, макс, результат, считанное, счетчик.
А как с тремя?
Для десяти значений, тоже решил,что массив проще.
там про хранение идет речь, а не вычисление (альтернатива массиву)
Для подсчета Мин, Макс и среднего за вычетом крайних - массив не нужен, достаточно трех переменных - собственно минимума. максимума и суммы.
Я пять насчитал в голове, мин, макс, результат, считанное, счетчик.
А как с тремя?
Для десяти значений, тоже решил,что массив проще.
там про хранение идет речь, а не вычисление (альтернатива массиву)
Читаю вас, понимаю что нихрена не понимаю. Можете отрывок кода, написать,если не составит труда
пост 6 понятен? там ссылки
Я пять насчитал в голове, мин, макс, результат, считанное, счетчик.
А как с тремя?
Для десяти значений, тоже решил,что массив проще.
результат и счетчик для массива тоже нужны.
Для небольшого числа измерений массив выглядит проще, да. Но способ без массива хорош своей универсальностью - он подходит и для 10 измерений и для 10 тыс, так что его можно пихать в любой код, не заботясь о том, сколько будет замеров и хватит ли памяти.
типа ОФФТОП
Для небольшого числа измерений массив выглядит проще, да.
спорно, тому, кто понимает смысл, разницы не будет - просто больше строк в коде
Но способ без массива хорош своей универсальностью - он подходит и для 10 измерений и для 10 тыс, так что его можно пихать в любой код, не заботясь о том, сколько будет замеров и хватит ли памяти.
выделил, а следить за переполнением? Это как с синусом больших углов получим бяку восьмибитных процессоров. недавно обсуждали...
типа ОФФТОП
выделил, а следить за переполнением? Это как с синусом больших углов получим бяку восьмибитных процессоров. недавно обсуждали...
Не, ну здесь уже здравый смысл должен срабатывать. ИМХО.
выделил, а следить за переполнением?
так при сложении элементов массива тоже надо о переполнении помнить, разве нет?
Эт, Вы господа, уже в казуистику полезли. Применительно к атмеге, 10-бит АЦП и операции сложения, не нужно. Туда массив больше 4тыс элементов, не влезет.))))
так при сложении элементов массива тоже надо о переполнении помнить, разве нет?
вообще, я этот вопрос для ТС приберегал :))) подобные ошибки уже разбирали на форуме... просто 10 тыс. уж сильно круто взяли...
Эт, Вы господа, уже в казуистику полезли. Применительно к атмеге, 10-бит АЦП и операции сложения, не нужно. Туда массив больше 4тыс элементов, не влезет.))))
в 2 килобайта уны/наны?
А про эти и вовсе говорить не о чем.
Гриш, извиняй, что интригу испортил.))))