Как снимать пиковые значения с аналового входа???
- Войдите на сайт для отправки комментариев
Пнд, 17/02/2014 - 04:09
Как снимать пиковые значения с аналового входа???
ну или как этим потоком заполнить массив, для дальнейшей сортировки и нахождения максимального значения.???
А чего сложного ? объявляем переменную , и сравниваем с ней аналогреад , если значение на аналогреад больше,то пишем его в эту переменную..
ну... у мне надо, чтобы выводилось единственное макс. значение.
у меня пьезоэлемент подключён к аналоговому входу. if (val !=0) {Serial.print(val)}; так ограничил монитор порта от нулевых значений. когда я ударяю по пьезоэлементу выдаёт странные значения:
34,36,38,40,42,44,46,47,48,50,50,50,50,49,48,48,47,46,46,45,45,45,45,45,45,45,45,45,46,46,46,46,47,47,47,47,47,45,41,37,33,30,27,24
22,19,18,16,14,13,11,10
и все эти значения за долю секунды
при этом, почему-то первое значение не максимальное..
___________________________________
я попробовал как вы предлагали, т.е.
void setup()
{
Serial.begin(57600);
}
void loop()
{
int Max = 0;
int val = analogRead(3);
val = map(val,0,1023,0,127);
if (val !=0)
{
if (val > Max)
Max = val;
}
if (Max !=0)
{
Serial.println (Max);
delay(1);
}
}
но всё равно монитор лупит кучу значений....(((
надо что-то вроде временного фильтра или ещё что-то...
при этом, почему-то первое значение не максимальное..
в момент измерения - это значение было максимальным.
ну ,да) в этотм-то и проблема.....
Я думал снимать значения в течении 0.5с, заносить в массив, этот масив уже отсортировать и выдавать макс.значение.
Я в программировании не очень. Но минимальная база знаний у меня есть. НО я вообще без понятия как это сделать
Вот я пытался сортировать с массивом, но как-то не получилось..... может найдёте ошибку
int maxiVel =0;
int velociti = 0;
int Max[100];
int indx = 0;
void setup()
{
Serial.begin(57600);
}
int maks(int maxi)
{
int val = analogRead(3);
val = map(val,0,1023,0,127);
if (val > 0) {
Max[indx] = val;
indx =indx + 1;
if (indx >=100) indx = 0;
maxi= 0;
for ( int i=0 ; i < 100; i++)
{
if (Max[i] > maxi)
{
maxi = Max[i];
}
}
return maxi;
}
}
void loop()
{
{
velociti = maks(maxiVel);
if ( velociti < 5) velociti = 0;
if (velociti != 0)
{
Serial.print(0x90);
Serial.print(" ");
Serial.print(68);
Serial.print(" ");
Serial.println (velociti);
delay(5);
}
}
}
1. ... у меня пьезоэлемент подключён к аналоговому входу.
2. ... и все эти значения за долю секунды
3. ... при этом, почему-то первое значение не максимальное..
4. .... но всё равно монитор лупит кучу значений....(((
5. ....надо что-то вроде временного фильтра или ещё что-то...
1. А может быть сигнал усиливать надо?
2. Так и есть.
3. А кто оно, первое, а где то, что было до первого?
4. А что ему ещё делать? Не лупить?
5. Что-то вроде кольцевого буфера с детекцией импульса, тогда, считав его немного пораньше, увидите весь импульс. Правда на Мегах памяти маловато для него, прийдётся буфер SPI SRAM ставить .
Одно измерение - 2 байта.
Вроде етого:
Попробуйте поставить вот этот монитор, может быть по скорости справится.
http://megunolink.software.informer.com/download/
Только ставьте сериал 115200
это всё очень громоздко и не нужно.
т.е. концепция - у нас есть некие данные, кторые в любой момент времени могут увеличиться, нас интересует максимальное значение переменной в данный момент времени, а не через определённый промежуток времени, т.к. неизвестно в какой момент времени произойдёт увеличение значения, поэтому:
делаем всё, как выше делалось - пуляем в компорт максимальное значение, но данные храним в переменной и посылаем только отличное от предыдущего значение(сравниваем новое с предыдущим - зачем нам повторы?)
так будет красиво и честно - хоть через милисекунду, хоть через полгода значение изменится, но мы будем иметь максимальное значение, актуальное на данный момент.
Вот оно готовое
23LCV............
Мегабитник:
http://www.tme.eu/ru/details/23lcv1024-i_p/zapominajuszczije-ust-wa-sram-posljedowatjel/microchip-technology/#
Мне нужно чтобы оно отсылало одно максимальное значение. только одно.
Мне нужно чтобы оно отсылало одно максимальное значение. только одно.
а если через долю секунды, как оно отослало одно максимальное значение, датчик выдал новое максимальное значение, другое, которое оказалось больше первого? и теперь у нас.... ммм... нет, у вас :) два максимальных значения. что делать со вторым?
Arxsab, вам нужно точно определиться по какому событию максимум перестаёт быть актуальным, тогда можно будет придумывать алгоритм, а не наоборот, сначала алгоритм, а потом думать )
Мне нужно чтобы оно отсылало одно максимальное значение. только одно.
ок - принимайте "одно".
вопрос - когда "одно"? вчера или сейчас?
удар по датчику не абсолютно упругий, как я понял, и длится долю секуды.
я вижу это так: в течении где-то 20мс снимаются значения, все эти значения поочерёдно заносятся в массив[100], те номера которые не заполнились значениями с датчика заполняются нулями, дальше идёт поиск максимума, и одно это значение выводится, массив сбрасывается и всё по новой.
1. я не понимаю как снимать значения в течении какого-то времени
2. да и дальше не совсем понимаю как сделать))
п.с. Я пытаюсь сделать электронную барабанную установку))))
Arxsab, вот уже что-то вырисовывается :) Итого - мониторим аналоговый вход. Как только появилось что-то , отличное от 0, то включаем проверку if millis-prevmillis < 20 . Пока меньше заносим данные в массив, созданный с запасом. Я бы даже сделал проверку, что-бы повторный отсчёт не вносился в таблицу, так можно сильно экономить место. Как только время кончилось выходим из цикла, находим максимальное значение в массиве, записываем его в переменную, обнуляем массив, и снова ждём сигнала. Алгоритм похож на то, что нужно получить?
да))
но я с if millis-prevmillis < 20 пытался....
в общем-то ничего толкового не вышло.( но может я что-то не правильно сделал... фиг его знает.
но в любом случае спасибо) буду пытаться)
Arxsab, вот примерно набил скетч. Но 20миллисекунд это маловато вроде, скорее всего один удар длится дольше, и алгоритм выдаст несколько результатов подряд. Тут нужно играться длительностью. Либо ещё раз обдумать, по какому события переставать аккумулировать данные.
хм) Спасибо огромное) сейчас проверю)))
отлично!!!! Еще раз спасибо огромное!)
Как то делал нечто подобное , проблема поиска максимума осложнялась в основном кучей локальных максимумов. Сначала начал городить прграмму, потом понял, что по сути получается фильтр высоких частот. Подобрал конденсатор и получил огибающую с одним максимумом, который легко ловится программно.