Попытка найти разницу во времени между 2 пиками от 2 аналоговых датчиков - PullRequest
0 голосов
/ 17 октября 2019

[введите описание изображения здесь] [1] [введите описание изображения здесь] [1] У меня есть 2 аналоговых датчика, которые подключены к моей плате Arduino. Каждый из датчиков будет генерировать пульсовую волну (синусоидальную волну) со временем

Функция кода, который я хочу получить, состоит в том, чтобы получить время пикового значения каждого датчика и в конечном итоге вычислить разницу во времени пиков 2 датчиков (разница t1 и t2, разница2-го t1 и 2-го t2 и т. д.) https://i.stack.imgur.com/DYJzg.png

Подход к обнаружению пиков, который я использовал, заключается в обнаружении на основе порогов (прилагаемое изображение для информации о методе) https://i.stack.imgur.com/JUEPj.png. Это кодчто у меня сейчас. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что на последовательном мониторе отображаются случайные значения разницы во времени (PTT), даже если на датчики не поступает никаких сигналов.

Буду признателен за помощь по этой теме. Спасибо!

const int sensorPin2= A1;
int Max1 = 0;
int Max2=0;

int sensorValue1;
int sensorValue2;

int threshold = 100;

unsigned long time1=0;
unsigned long time2=0;
unsigned long ptt=0;
unsigned long realtime1=0;
unsigned long realtime2=0;

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

void loop() 
{

 sensorValue1 = analogRead(sensorPin1);
 sensorValue2= analogRead(sensorPin2);
//for detection of peak for sensor1
  if (sensorValue1 > Max1) 
  {
    Max1 = sensorValue1;
    time1=millis();
  }
  if (sensorValue1 <= threshold && Max1> threshold) 
  {
     Serial.print(Max1);
     Serial.print("\t");
     Serial.print(time1);
     Serial.print("\t"); 
     realtime1=time1;
     Max1=0;
    }
 //for detection of peak for sensor2
 if (sensorValue2>Max2)
 {
  Max2= sensorValue2;
  time2=millis();
 }
 if (sensorValue2<=threshold && Max2> threshold)
 {
  Serial.print(Max2);
  Serial.print("\t");
  Serial.print(time2);
  Serial.print("\t");
  realtime2= time2;
  Max2=0;
 }
 //time difference between peaks from both sensors
 ptt=abs(realtime1-realtime2);
Serial.println(ptt);
ptt=0;

  }```


  [1]: https://i.stack.imgur.com/DYJzg.png

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Ваша реализация обнаружения пиков выглядит нормально.

Ваш код для синхронизации немного не соответствует.

Что вы делаете:

read sensor 1
read sensor 2
if value 1 is a new max:
  store timestamp 1  
if it is a new peak:
  report new peak through serial
  register timestamp 1 as time for peak 1
if value 2 is a new max:
  store timestamp 2
if it is a new peak:
  report new peak through serial
  register timestamp 2 as time for peak 2
calculate time difference and send it through serial

Некоторыепроблемы с этим:

a) вы сохраняете не время вашего измерения, а время, когда вы обнаруживаете, что это новый максимум. поскольку у вас есть последовательная связь между измерением с датчиком 2 и созданием вашей метки времени, вы всегда вводите задержку для датчика 2. все задержки последовательной связи в вашем коде будут суммироваться с течением времени, пока у вас нет 1 пика.

b) вы сообщаете о своей разнице во времени в каждом цикле цикла. Даже если у вас еще нет 2 пиков

Вот что вы должны сделать:

read sensor 1
if value 1 is a new max 1:
  store timestamp 1
read sensor 2
if value 2 is a new max 2:
  store timestamp 2

if max1 is a new peak and timestamp1 is > timestamp 2:
  report time difference
if max2 is a new peak and timestamp2 is > timestamp 1:
  report time difference

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

0 голосов
/ 17 октября 2019

Одной из возможных причин может быть именно это: когда ваши входы не подключены ни к чему, они плавают. Это объясняется здесь, например: Плавающие булавки, резисторы с повышением напряжения и ARDUINO В основном это означает, что они будут выплевывать случайные числа, что будет запускать ваш алгоритм пиков случайным образом, что в свою очередь даст вам случайные результаты ptt.

Еще один интересный факт заключается в следующем: Ссылка на Arduino Abs , где говорится:

Примечания и предупреждения Из-за способа реализации функции abs () избегайтеиспользование других функций внутри скобок может привести к неверным результатам.

// that would mean instead of
ptt = abs(realtime1-realtime2);
// rather use
ptt = (realtime1-realtime2);
ptt = abs(ptt);

Также abs () выдаст неверные значения, когда ptt, realtime1 и realtime2 - все переменные без знака, которые не могутчтобы быть отрицательным.

Я построил небольшую тестовую установку с Arduino Nano и двумя potis для имитации аналоговых входов. Я редактировал вашу программу и вставлял комментарии при каждом внесенном мной изменении.

const int sensorPin1= A0;
const int sensorPin2= A1;
int Max1 = 0;
int Max2 = 0;

int sensorValue1;
int sensorValue2;

int threshold = 100;
// this deadband resolves jitter when the sensorValue is exactly
// at the threshold value
#define thresh_deadband 2

unsigned long time1=0;
unsigned long time2=0;
// making this signed long will eliminate the error of huge ppt values
// because now you can calculate more easely negative numbers and you
// still have about 600 hours run time before overflow
long ptt=0;
long realtime1=0;
long realtime2=0;

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

void loop() 
{

 sensorValue1 = analogRead(sensorPin1);
 sensorValue2 = analogRead(sensorPin2);

//for detection of peak for sensor1
  if (sensorValue1 > Max1) 
  {
    Max1 = sensorValue1;
    time1 = millis();
  }
  if (sensorValue1 <= threshold && Max1 > threshold + thresh_deadband) 
  {
     Serial.print(Max1);
     Serial.print("\t");
     Serial.print(time1);
     Serial.print("\t"); 
     realtime1=time1;
     Max1=0;
    }
 //for detection of peak for sensor2
 if (sensorValue2>Max2)
 {
  Max2= sensorValue2;
  time2=millis();
 }
 if (sensorValue2<=threshold && Max2> threshold + thresh_deadband)
 {
  Serial.print(Max2);
  Serial.print("\t");
  Serial.print(time2);
  Serial.print("\t");
  realtime2= time2;
  Max2=0;
 }

 // this block makes sure ptt is only calculated and showed once
 // there is new values for realtime1 and realtime2
 if(realtime1 > 0 && realtime2 > 0) {
  // time difference between peaks from both sensors
  // see https://www.arduino.cc/reference/en/language/functions/math/abs/
  // apparently your not supposed to execute any funtions inside the abs
  // brackets. Either uncomment the abs line or just use at is and see by
  // the value if realtime1 or 2 is smaller
  ptt=(realtime1-realtime2);
  // ptt = abs(ptt);
  Serial.println(ptt);
  realtime1 = 0;
  realtime2 = 0;
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...