1

Я хочу измерить время, прошедшее между моими двумя с использованием модуля rx/tx в микросекундах. Я сделал свои коды, и я заметил, что что-то не так в моей работе. Я надеюсь, что вы можете мне помочь.Получение эллипса времени между двумя ардуино в микросекундах

Оба устройства A (устройство 1) и B (устройство 2) отвечают за точное измерение времени с использованием местных часов.

  • Если время A посылает сигнал TSA,
  • время B принимает сигнал TRB,
  • время B ответов на это TSB,
  • время A принимает сигнал спина TRA
  • такой, что TSA < TRB <TSB < TRA,
  • затем A меры TA = TRA -TSA и
  • B меры TB = TSB - TRB.

TOF можно оценить путем сочетания этих двух измерений:

  • Total time elapsed = (TA-TB)/2

код ПРЕОБРАЗОВАТЕЛЬ

#include <VirtualWire.h> 
#include <LiquidCrystal.h> 
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); 

const int transmit_pin = 12; 
const int receive_pin = 11; 
char *c; 

unsigned long received, sends, elapsed; 

void setup() { 
    Serial.println(); 
    Serial.begin(9600); // Debugging only 

    //transmitter settings 
    pinMode(13, OUTPUT) 
    vw_set_ptt_inverted(true); // Required for DR3100 
    vw_set_tx_pin(12); 
    vw_setup(1000); // speed of data transfer Kbps 

    //receiver settings 
    Serial.println(); 
    Serial.begin(9600); // Debugging only 
    vw_set_rx_pin(11); 
    vw_rx_start(); 
} 

void loop() { 
    //Transmitter 
    digitalWrite(13, 1); 
    c = "1"; 
    vw_send((uint8_t *)c, strlen(c)); 
    vw_wait_tx(); //Wait until the whole message is go 
    delay(1000); // for debounce 
    sends=micros(); 

    //Receiver 
    uint8_t buf[VW_MAX_MESSAGE_LEN]; 
    uint8_t buflen = VW_MAX_MESSAGE_LEN; 
    if (vw_get_message(buf, &buflen)) { // Non-blocking 
     for(int i = 0;i < buflen;i++) { 
      if(buf[i] == '2') { 
       digitalWrite(13, 0); 
       delay(1000); // for debounce 
       received=micros(); 
       elapsed=(received-sends); 

       Serial.print(sends); 
       Serial.println(" TRANSMITTED TIME"); 
       Serial.print(received); 
       Serial.println(" RECEIVED TIME"); 
       Serial.print(elapsed); 
       Serial.println(" microseconds elapsed"); 
      } 
     } 
    } 
} 

RECEIVER код

#include <VirtualWire.h> 
const int receive_pin = 11; 
const int transmit_pin = 12; 

char *chars; 

unsigned long received, sends; 


void setup() { 
    Serial.println(); 
    Serial.begin(9600); // Debugging only 
    //transmitter settings 

    vw_set_ptt_inverted(true); // Required for DR3100 
    vw_set_tx_pin(12); 
    vw_setup(1000); // speed of data transfer Kbps 

    //receiver settings 
    vw_set_ptt_inverted(true); // Required for DR3100 
    vw_set_rx_pin(11); 
    vw_setup(1000); // Bits per sec 
    pinMode(13, OUTPUT); 
    vw_rx_start(); // Start the receiver PLL running 
} 

void loop() { 
    //Receiver 
    uint8_t buf[VW_MAX_MESSAGE_LEN]; 
    uint8_t buflen = VW_MAX_MESSAGE_LEN; 
    digitalWrite(13, 1); 
    if (vw_get_message(buf, &buflen)) { // Non-blocking 
     for(int i = 0;i < buflen;i++) { 
      if(buf[i] == '1') { 
       received=micros(); 

       //Transmitter 
       chars = "2"; 
       vw_send((uint8_t *)chars, strlen(chars)); 
       vw_wait_tx(); // Wait until the whole message is gone 
       digitalWrite(13, 0); 
       delay(1000); 
       sends=micros(); 

       Serial.print(received); 
       Serial.println(" RECEIVED TIME"); 
       Serial.print(sends); 
       Serial.println(" TRANSMTTED TIME"); 
      } 
     } 
    } 
}//End for Loop 

Мощность передатчика

Полученное время должно быть больше больше, как вы можете видеть в моей формуле.

transmitter output http://i58.tinypic.com/245xcag.jpg

выход приемника

receiver output http://i62.tinypic.com/23j5rfp.jpg

Я надеюсь, что вы можете помочь мне, что это проблема в моей программе.

ответ

0

читать ваш код:

delay(1000); 
sends=micros();      // timestamp <SEND> 

uint8_t buf[VW_MAX_MESSAGE_LEN];  // time to process is ε 
uint8_t buflen = VW_MAX_MESSAGE_LEN; // time to process is ε 
if (vw_get_message(buf, &buflen)) { // time to process is ε 
    for(int i = 0;i < buflen;i++) { // time to process is ε 
     if(buf[i] == '2') {   // time to process is ε 
      digitalWrite(13, 0);  // time to process is ε 
      delay(1000);    // time to process is 1000000µs 
      received=micros();   // timestamp <RECV> 
      elapsed=(received-sends); 

/* That means that in the following statements, all you'll see is 
    that the difference between received and sends is 1000000µs + a few ε µs 
    which is totally in line with your shown results */ 

      Serial.print(sends);  
      Serial.println(" TRANSMITTED TIME"); 
      Serial.print(received); 
      Serial.println(" RECEIVED TIME"); 
      Serial.print(elapsed); 
      Serial.println(" microseconds elapsed"); 
     } 
    } 
} 

Итак, как заключение, я считаю, что вы забыли несколько факторов в вашей формуле:

  1. вы также измерения времени обработки (сумма всех ε мкс)
  2. вы измерение sleep раз (в 1000000μs задержки)

На самом деле это не представляет фактический rx/tx, а также то, что вы делаете в своем коде, что добавляет до задержки. Так что вы - формула, на самом деле не так, просто ваш код не реализует ее.

Так что же происходит, что пинг эха времени для вашего сообщения является способом быстрее, чем 1000032μs, таким образом, что вы измеряете только скорость цикла вашей программы между <SEND> меткой времени и <RECV> временной меткой: которая 1000000μs от ожидания, и 32 мкс обработки.

+0

Что я должен изменить в своей программе, чтобы измерить прошедшее время? – Rafael

 Смежные вопросы

  • Нет связанных вопросов^_^