Замер времени менее 1мкс.

ssss
Offline
Зарегистрирован: 01.07.2016

.del.

Производители МК от фонаря периферии... наверное... напичкали...del.

.del.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

.del.

ssss
Offline
Зарегистрирован: 01.07.2016

.del.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

.del.

Logik
Offline
Зарегистрирован: 05.08.2014

Ну вот и встретились баран и новые ворота ;)

vshurik
Offline
Зарегистрирован: 30.12.2017

на просторах интернета нашел про системный таймер ARM, плата китайская Arduino DUE.

int  t0 = 0, t1 = 0;
float tt = 0;
void setup() {
  Serial.begin(115200);    //открываем COM порт
  pinMode     (11, INPUT_PULLUP); //красная кнопка  обнуление t0 и t1
  attachInterrupt(digitalPinToInterrupt(27), start, RISING);
  attachInterrupt(digitalPinToInterrupt(28), stop, RISING);
}
//----------------------------
void start()
{
  if (t0 == 0)
  {
    t0 = SysTick->VAL; 
  }
}
//----------------------------
void stop()
{
  if (t1 == 0)
  {
    t1 = SysTick->VAL;
  }
}
//----------------------------

void loop() {
  if (t0 != 0 && t1 != 0)
  {
    tt = (t0 - t1) * 0.0119047619; //вычисляем задержку 2 сигнала относительно 1 сигнала (в микросекунах с дискретностью 0.1мкс), частота процессора 84МГц, 1 тик=0.0119047619мкс
    Serial.print ("t="); Serial.println(tt, 1);
    delay(200);

  }
  if (digitalRead(11) == LOW)
  {
    t0 = 0;
    t1 = 0;
    Serial.println("ОБНУЛЕНИЕ");
  }
}

Вроде все адекватно работает.

Жду конструктивной критики, может что кто посоветует.

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

vshurik, ну раз адекватно, так пользуйтесь.   Но надо понимать, что аппаратный способ будет существенно точнее, о чём вам ssss уже несколько раз сказал. У дуе есть навороченный 32-битный таймер, который может взять на себя вообще всё, и сделает это всё с максимально возможной для этого МК точностью.  Вам останется в loop только вычесть значение одного регистра захвата из другого. 

vshurik
Offline
Зарегистрирован: 30.12.2017

подскажите по прерванию systick

void SysTick_Handler(void) {
  // Тут делаем что-то полезное
}

вставляю в код, а он не комплируется.

пишет:

Arduino: 1.8.5 (Windows 10), Плата:"Arduino Due (Programming Port)"

 
Archiving built core (caching) in: C:\Users\8523~1\AppData\Local\Temp\arduino_cache_104864\core\core_arduino_sam_arduino_due_x_dbg_f03bc1497c21bab2a485c6edb88e6f7c.a
C:\Users\8523~1\AppData\Local\Temp\arduino_build_375163/core\core.a(cortex_handlers.c.o): In function `SysTick_Handler':
 
C:\Users\Александр\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.11\cores\arduino/cortex_handlers.c:47: multiple definition of `SysTick_Handler'
 
sketch\systick.ino.cpp.o:D:\arduino\systick/systick.ino:17: first defined here
 
collect2.exe: error: ld returned 1 exit status
 
exit status 1
Ошибка компиляции для платы Arduino Due (Programming Port).
 
 
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

vshurik
Offline
Зарегистрирован: 30.12.2017

как я понял, systick->val считает от 83999 до 0 (по времени 1мс), в момент счета с 1 на 0 вызывает прервание. 

читал вот здесь http://stm32.chrns.com/post/149112836514/systick

Вот мне в этот момент нужно инерементировать перменную на 1 (считать количестов отсчетов с 83999 до 0), для и измерения интервала времени >1мс.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ssss пишет:

А чё вы тут... SAM3X...

Нус... кто даташит читать начнёт??? ))))))))

мы даташиты начинаем читать когда "НУ НЕ ПОЛУЧИЛОСЬ" )))