Время между прерываниямии

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

Доброго время суток! Подскажите такую весч - можно ли на ардуино уно посчитать время между превываниями? Интересует такой алгоритм: если интервал между прерываниями больше х или прерывание вообще не наступило, выполнить у. Или по прерыванию запускать таймер, по переполнению выполнять у, по превыванию обнулять. Помогите избразить в коде. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Clampo пишет:

Доброго время суток! Подскажите такую весч - можно ли на ардуино уно посчитать время между превываниями? 

Можно

Clampo пишет:

Помогите избразить в коде. 

В этом разделе помогают тем, кто пишет сам и у него не получается. Тем, кому нужно просто написать от начала до конца, помогают в разделе "Ищу исполнителя".

 

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

На счет алгоритма - правильно думаю?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Clampo пишет:

На счет алгоритма - правильно думаю?

Я не знаю, что Вы понимаете под выражением "или прерывание вообще не наступило" и как Вы собираетесь это условие проверять.

Гриша
Offline
Зарегистрирован: 27.04.2014

ЕвгенийП пишет:

Clampo пишет:

На счет алгоритма - правильно думаю?

Я не знаю, что Вы понимаете под выражением "или прерывание вообще не наступило" и как Вы собираетесь это условие проверять.

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

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

Думаю так. По прерыванию запускать таймер и выполнять функцию, при этом время работы таймера больше самого большого времени ожидания прерывания. И по переполнению таймера выполнять другую функцию. Т.е. так - Таймер на минуту, если частота прерываний меньше минуты - будет выполняться только функция по прерыванию, а если интервал прерываний станет больше минуты, то выполнится функция таймера. Делаю устройство контроля скорости конвеерной ленты. замер скорости есть, а при неожиданной резкой остановке не обнуляется значение скорости. 

void speedometr(){                 

  speed = (500000.0 / (micros() - micros_speed)); 
  micros_speed = micros(); 
  
  }

Скорость считаю так. Функцию вызываю по прерыванию.

Гриша
Offline
Зарегистрирован: 27.04.2014

Clampo пишет:

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

так а задача какая? поймать стоп ленты? или не обнулять значение скорости?

axill
Offline
Зарегистрирован: 05.09.2011

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

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

Скорость надо замерять и при определенной скорости делать определенное действие(н\р включать или выключать двигатель) Это все работает. Но при резкой остановке нет обнуления значения скорости. Поэтому, при резкой остановке значение скорости остается неизменным и остановку проследить нельзя.

Гриша
Offline
Зарегистрирован: 27.04.2014

Clampo пишет:

Скорость надо замерять и при определенной скорости делать определенное действие(н\р включать или выключать двигатель) Это все работает. Но при резкой остановке нет обнуления значения скорости. Поэтому, при резкой остановке значение скорости остается неизменным и остановку проследить нельзя.

Как измеряется скорость? Вычисляется по времени между импульсами?

1) Проверять условие, что импульс не пришел в нужный момент (интервал превышен ).

2) проверять условие, что импульс не пришел в первый интервал (с момента старта) – понизить скорость, во второй интервал -  снова понизить. Проверять условие по скорости, если скорость ниже порога, то…

может кто другие варианты решения имеет

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

Скорость измеряю так: 

attachInterrupt(0, speedometr, CHANGE);

void speedometr(){                 

  speed = (500000.0 / (micros() - micros_speed)); 
  micros_speed = micros(); 
  
  }

speed - переменная скорости. Физически - датчик скорости с 5-ю импульсами на метр. Тип сигнала - меандр. Вот по превышению интервала самое верное, я думаю. Но как этот интервал задать?

Гриша
Offline
Зарегистрирован: 27.04.2014

Вообще-то я формулу скорости знаю, вопрос не в этом был, так и совет там - же.  Интервал определения скорости и счетчик этих интервалов с момента последнего прерывания. Если прерывание случилось - счетчик обнулить. Если нет – установить скорость пропорциональную кол-ву интервалов. А вообще, кроме формулы скорости,  инфы маловато – процу скорости бы хватило это обрабатывать… К слову о скорости, она вообще нужна? Может будет проще ее не считать, а работать с интервалами времени?

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

по измерению скорости это все. и других формул не знаю.

Гриша
Offline
Зарегистрирован: 27.04.2014

Clampo пишет:

по измерению скорости это все. и других формул не знаю.


Друг-друга не понимаем, формула скорости одна и нечего мудрить – она такая и есть (формула). А вот способы определения времени между импульсами для расчета скорости – разные. У вас возникла проблема с тем, что происходит прямое определение скорости по факту прихода следующего импульса, а условия, что этого импульса можно не получить нет (я так понял).
 

//это только алгоритм, а не готовый код… 
//Есть время предыдущего импульса 

T1=  (micros() - micros_speed);
speed = (500000.0 / T1);  // - а это вообще необходимо? Может не делать вычисление скорости, а просто использовать T1 во всех расчетах? 
  micros_speed = micros();
T2=T1+100; // добавим время запаздывания импульса (здесь 100 для примера)

if (micros() > micros_speed + T2)
{
speed = (500000.0 / T2);
T2=T2+100;  // снова добавляем интервал запаздывания импульса т.е. уменьшаем скорость т.к. импульс мы не получили.   
}
//И так будем добавлять пока не придет следующий импульс. Как только импульс пришел – начинаем работать с T1, если этого не случилось, постоянно наращиваем T2 и скорость постоянно понижаем. 

примерно так.

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

Да, все верно понимаете. Этого условия(что импульс можно не получить нет). Попробовал ваш код - Теоретически работает, но при не приходе импульса отсчет идет некоторое время. т.е. на практике, после резкой остановки датчика скорости ардуино продолжает плавно уменьшать скорость до 0.1м\с. длистя это уменьшение больше 1-й секунды, что не допустимо, т.к. одна секунда минимальное время между импульсами.

Гриша
Offline
Зарегистрирован: 27.04.2014

Clampo пишет:

Да, все верно понимаете. Этого условия(что импульс можно не получить нет). Попробовал ваш код - Теоретически работает, но при не приходе импульса отсчет идет некоторое время. т.е. на практике, после резкой остановки датчика скорости ардуино продолжает плавно уменьшать скорость до 0.1м\с. длистя это уменьшение больше 1-й секунды, что не допустимо, т.к. одна секунда минимальное время между импульсами.

ну, так установить Т2 таким образом, чтоб соответствовало минимальной скорости и выполнять команду по условию или наращивать число импульсов (датчиков импульса), брать контроллер мощнее (быстрее), установить датчик более подходящий (зависит от всей системы). Может даже подумать о компьютерной мышке, которая передает код перемещения, фотографируя поверхность (не встречал такого, но идея дает направление).

Еще раз спрашиваю вам вообще, зачем скорость в явном виде? Путь (между импульсами) всегда один, меняется только время – зачем на таких быстрых вычислениях (micros) такая трудная математика для контроллера? unsigned long вычисления тяжелые для мк.