Как снимать пиковые значения с аналового входа???

Arxsab
Offline
Зарегистрирован: 17.02.2014

Как снимать пиковые значения с аналового входа???

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

MaksMS
Offline
Зарегистрирован: 11.03.2013

А чего сложного ? объявляем переменную , и сравниваем с ней аналогреад , если значение на аналогреад больше,то пишем его в эту переменную..

Arxsab
Offline
Зарегистрирован: 17.02.2014

ну... у мне надо, чтобы выводилось единственное макс. значение.

у меня пьезоэлемент подключён к аналоговому входу.  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);
 }

}

но всё равно монитор лупит кучу значений....(((

надо что-то вроде временного фильтра или ещё что-то...

Клапауций
Offline
Зарегистрирован: 10.02.2013

Arxsab пишет:

при этом, почему-то первое значение не максимальное..

в момент измерения - это значение было максимальным.

Arxsab
Offline
Зарегистрирован: 17.02.2014

ну ,да) в этотм-то и проблема.....

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

Я в программировании не очень. Но  минимальная база знаний у меня есть. НО я вообще без понятия как это сделать

Arxsab
Offline
Зарегистрирован: 17.02.2014

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

 

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);
   
   }
 }
}

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Arxsab пишет:

1. ... у меня пьезоэлемент подключён к аналоговому входу. 

2.  ... и все эти значения за долю секунды

3. ... при этом, почему-то первое значение не максимальное..

4.  .... но всё равно монитор лупит кучу значений....(((

5. ....надо что-то вроде временного фильтра или ещё что-то...

1. А может быть сигнал усиливать надо?

2.  Так и есть.

3. А кто оно, первое, а где то, что было до первого?

4. А что ему ещё делать? Не лупить?

5.  Что-то вроде кольцевого  буфера с детекцией импульса, тогда, считав его немного пораньше, увидите весь  импульс. Правда на Мегах памяти маловато для него, прийдётся  буфер SPI SRAM ставить .

Одно измерение  - 2 байта.

Вроде етого:

Попробуйте поставить вот этот монитор, может быть по скорости справится.

http://megunolink.software.informer.com/download/

Только ставьте сериал 115200

Клапауций
Offline
Зарегистрирован: 10.02.2013

это всё очень громоздко и не нужно.

т.е. концепция - у нас есть некие данные, кторые в любой момент времени могут увеличиться, нас интересует максимальное значение переменной в данный момент времени, а не через определённый промежуток времени, т.к. неизвестно в какой момент времени произойдёт увеличение значения, поэтому:

делаем всё, как выше делалось - пуляем в компорт максимальное значение, но данные храним в переменной и посылаем только отличное от предыдущего значение(сравниваем новое с предыдущим - зачем нам повторы?)

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

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Вот оно готовое  

23LCV............

Мегабитник:

http://www.tme.eu/ru/details/23lcv1024-i_p/zapominajuszczije-ust-wa-sram-posljedowatjel/microchip-technology/#

Arxsab
Offline
Зарегистрирован: 17.02.2014

Мне нужно чтобы оно отсылало одно максимальное значение. только одно.

com
Offline
Зарегистрирован: 06.09.2013

Arxsab пишет:

Мне нужно чтобы оно отсылало одно максимальное значение. только одно.

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Arxsab, вам нужно точно определиться по какому событию максимум перестаёт быть актуальным, тогда можно будет придумывать алгоритм, а не наоборот, сначала алгоритм, а потом думать )

Клапауций
Offline
Зарегистрирован: 10.02.2013

Arxsab пишет:

Мне нужно чтобы оно отсылало одно максимальное значение. только одно.

ок - принимайте "одно".

вопрос - когда "одно"? вчера или сейчас?

Arxsab
Offline
Зарегистрирован: 17.02.2014

удар по датчику не абсолютно упругий, как я понял, и длится долю секуды.

я вижу это так: в течении где-то 20мс снимаются значения, все эти значения поочерёдно заносятся в массив[100], те номера которые не заполнились значениями с датчика заполняются нулями, дальше идёт поиск максимума, и одно это значение выводится, массив сбрасывается и всё по новой.

1. я не понимаю как снимать значения в течении какого-то времени

2. да и дальше не совсем понимаю как  сделать))

п.с. Я пытаюсь сделать электронную барабанную установку))))

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Arxsab,  вот уже что-то вырисовывается :) Итого - мониторим аналоговый вход. Как только появилось что-то , отличное от 0, то включаем проверку if millis-prevmillis < 20 . Пока меньше заносим данные в массив, созданный с запасом. Я бы даже сделал проверку, что-бы повторный отсчёт не вносился в таблицу, так можно сильно экономить место. Как только время кончилось выходим из цикла, находим максимальное значение в массиве,  записываем его в переменную, обнуляем массив, и снова ждём сигнала. Алгоритм похож на то, что нужно получить?

Arxsab
Offline
Зарегистрирован: 17.02.2014

да))

но я с if millis-prevmillis < 20 пытался....

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

но в любом случае спасибо) буду пытаться)

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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; } // и тоже уходим из функции
  } }
  
  

 

Arxsab
Offline
Зарегистрирован: 17.02.2014

хм) Спасибо огромное) сейчас проверю)))

Arxsab
Offline
Зарегистрирован: 17.02.2014

отлично!!!! Еще раз спасибо огромное!)

inspiritus
Offline
Зарегистрирован: 17.12.2012

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