Как снимать пиковые значения с аналового входа???
- Войдите на сайт для отправки комментариев
Пнд, 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миллисекунд это маловато вроде, скорее всего один удар длится дольше, и алгоритм выдаст несколько результатов подряд. Тут нужно играться длительностью. Либо ещё раз обдумать, по какому события переставать аккумулировать данные.
#define tb 50 // зададим размер массива unsigned int myArray[tb], aread, rezult; unsigned long prevmillis; void setup() { Serial.begin(115200); } void loop() { aread=analogRead(A0); if (aread> 0) { process_begin(); Serial.println(rezult); } } void process_begin() { //обнулить таблицу for (int n=0; n < tb; n++ ) myArray[n] = 0; // входим в цикл по времени for (prevmillis=millis(); (millis()- prevmillis) < 20 ; ) { // тут проще отправить в другую функцию.. tablework(); //пришедшие из функции вернулись за новым отсчётом aread=analogRead(A0); // и обратно ныряем в tablework пока время не кончилось } //сюда пришли когда вылетели из цикла 20мс, пора подбивать итоги.. int max1=0; //вводим переменную максимальных значений for (byte n = 0; n <tb ; n++) { if (myArray[n]> max1) max1=myArray[n]; } rezult=max1; //сохраним результат в свою переменную. }//end process void tablework(){ //проверям нет ли уже такого значение в таблице for (int n=0; n < tb; n++ ){ if (myArray[n]== aread) return;} //если есть, то выскакиваем из функции //иначе заносим значение в первую чистую ячейку for (int n=0; n < tb; n++ ){ if (myArray[n] == 0){ myArray[n]=aread; return; } // и тоже уходим из функции } }хм) Спасибо огромное) сейчас проверю)))
отлично!!!! Еще раз спасибо огромное!)
Как то делал нечто подобное , проблема поиска максимума осложнялась в основном кучей локальных максимумов. Сначала начал городить прграмму, потом понял, что по сути получается фильтр высоких частот. Подобрал конденсатор и получил огибающую с одним максимумом, который легко ловится программно.