оптический датчик оборотов под Arduino

jopoleon
Offline
Зарегистрирован: 21.03.2016

Всем привет! Появился вопрос, реально ли создать датчик оборототов для снятия показаний с вала, на примерно 60000 (шестидесяти тясячах) оборотов в минуту. Нужен фоточувствительный элемент, вывод от него уже скорее всего будет цифровой. Цель этого датчика снимать обороты в двух точках на валу, с одной стороны муфты и с дрйгой, для определния угла отставания, если он появится при скручивании муфты. 

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

 

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

Любой оптический датчик на 60кГц запросто работает. Я не сильно спец ещё в Андруинах, но на скетчах, как мне кажется, такое не получится. Тут на асме несколько строк всего будет. Необходимо настроить таймер на 60000*360 Гц. Оба датчика повесить на входы прерываний. По прерыванию первого перезапускать таймер, по прерыванию второго считывать и записывать в переменную получившееся скручивание в градусах. Успеет таймер тактовать 21.6Мгц я точно не знаю...

a5021
Offline
Зарегистрирован: 07.07.2013

Идея с прерываниями страдает некой переусложненностью. Проще таймером в режиме захвата считать.

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

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

Очевидно, что он будет иметь куда меньшую частоту, чем 60кГц. Если частоты оборотов равные, так и вовсе нулевую.   

pton
Offline
Зарегистрирован: 21.03.2016

faeton пишет:

Успеет таймер тактовать 21.6Мгц я точно не знаю...

Нет, не успеет. У ардуино частота тактирования 16Мгц. 

Не совсем понятна задача. Если муфта скручивается, то они либо порвется либо скрутится на некоторый градус ( при первом обороте) и будет продолжать передавать вращение на такой же частоте. А если она скручивается на первом обороте, тогда нет частоты 60000, и это скручивание на выловишь. Либо ставить на вал датчик как в компьютерной мышке который за 1 оборот вала дает 40-50 прерываний. Но опять таки практическое применение задачи не ясно.

Лично я считал обороты через асинхроноое тактирование таймера за единицу времени (отмеряемую другим таймером)

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

ВН пишет:

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

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

pton пишет:

faeton пишет:

Успеет таймер тактовать 21.6Мгц я точно не знаю...

Нет, не успеет. У ардуино частота тактирования 16Мгц. 

ардуино - это не только 168 и 368 контроллеры, есть и побыстрее.

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

А откуда взяли 60 кГц? 60000 обор/мин -это 1 кГц.

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

dimax пишет:

А откуда взяли 60 кГц? 60000 обор/мин -это 1 кГц.

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

чисто в копилку знаний положить...

nevkon
Offline
Зарегистрирован: 20.01.2015

В #1 посте правильно алгоритм описали. Первый датчик который на валу двигателя будет вести счет частоты и запускать таймер для счета. Второй датчик который на приводном валу будет останавливать таймер со съемом прошедшего времени. На основании полученной частоты вращения определяется угловое смещение. Зная характеристики муфты получим момент на приводимом валу, усилия и т.д.

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

nevkon
Offline
Зарегистрирован: 20.01.2015

Немного неправильно написал. Первый датчик должен обнулять таймер со съемом показания времени - для определения частоты вращения. А второй датчик должен только снять время с таймера.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

60000rpm = 1000hz. Энкодер на 18 провсетов выдаст 36 прерываний на оборот (фронт + спад), итого 36кгц частота прерываний и точность угла поворота в 1 градус. За время между прерываниями МК на 16мгц успеет выполнить примерно 300 команд. Подсчет в прерывании - существенно меньше. Соответственно, примерно 80% времени он будет способен ещё исполнять основной цикл loop(). В чем пгоблема? :)

Для примера, у меня есть 4 двигла с энкодерами по 32 окна и обработчик на PCINT2 по фронту И спаду (64шт/оборот). Двиглы крутятся с типовой скоростью 12000rpm .. то есть "пиковая" частота прерываний около 50кгц .. потеря производительности Меги не превышает 25%.

Датчик TSC3200 (цвета) достаточно уверенно считает частоту на прерываниях (типовой скетч) вплоть до частот в 150кгц.

Не понимаю, "в чем пгоблема"? :)

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

Гриша пишет:

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

Тут не всё просто, отловить-то можно довольно мелкий  отрезок, например 1µs , но обработать эти данные в потоке не уже хватит скорости. Так что как уже упомнянул Arhat109-2 реально на прерываниях можно работать с частотами максимум в сотню килогерц. А в ассемблере я не силён :)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я бы применил исключающее или не XNOR. CD4077 или CD4070 например. по сути одно и тоже, просто сигнал на выходе 1 или 0

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

но это для определения скручивания, а не измерения скорости

nevkon
Offline
Зарегистрирован: 20.01.2015

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

Еще один момент касается нескольких отсчетов на оборот: угол деформации не должен быть больше одного отсчета. Тут предложили 36 отсчетный датчик, так вот для него максимальный угол скручивания будет около 10 градусов.

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016
Таймер надо настраивать на 60000/60*360=360000Гц=360кГц чтобы на каждый градус поворота таймер давал +1. Но для столь скоростного вала скручивание на 1 градус, я думаю, уже катастрофа, если этот не какой либо гидро/воздушно/магнитный/мягкий трансформатор. 

С экодером, особенно многошаговым, задача будет проще! Превый энкодер на счётный вход защёлки/регистра аппаратного, второй - на сброс. На выходе получаем скручивание в шагах энкодера. Если нет аппаратной защёлки. Тоже самое либо на таймере, что правильно, либо просто на переменной по прерываниям.

volatile unsigned int Curling, MaxCurling = 0;

void int0() {
    Curling++;
};

void int1() {
   if (Curling>MaxCurling) {
      MaxCurling=Curling;
   };
   Curling=0;
};

void mail() {
/*
   тут делаем чего хотим, не думая о энкодере, 
   и в любой момент имеет мгновенное и максимальное
   значения шагов энкодера на скручивание
*/
};
   
  

 

 

 

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

А в каких пределах преполагается изменение угла скручивания?

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

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

Буфера может и не быть, формируемые задержки могут быть программными, чтение возможно как многоразрядным портом, так и через сдвиговый регистр типа 555ир9.

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

К вопросу о том, надо ли идти на поводу у заказчика, исполняя его хочучки, или решать конечную задачу (которая ОЧУДО была озвучена).

Извиняйте за некошерность, но я предпочитаю аппаратно-программные решения. 

faeton
faeton аватар
Offline
Зарегистрирован: 21.03.2016

А вообще, пострадав сегодня всю ночь с выяснение "какого х", я окончательно убедился: бибилиотеки Андруины и её софт (собственно, ничего никогда толкового написанного на яве вообще не видел - всё корявое и глючное, это такой даже стиль: пишешь на яве, значит, сторонник кривописания и глюков) хлам полнейший! Использовать платы как платформу можно, особенно Уно с перешитым кристаломпорта порта в программатор. Софт для макетирования примитивных частей -"пощупать" можно, но не надеясь на его работу в полной мере. А о программировании скетчей надо сразу забывать и брать в руки АВРСтудио или МикроПаскаль. Так будет порачено время с пользой - изучение нормальной среды разработки, а не понимание чужих глюков.

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

dimax пишет:
А откуда взяли 60 кГц? 60000 обор/мин -это 1 кГц.

от невнимательности, не часто приходится оперировать оборотами, так что на автомате прописал.

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

faeton пишет:

А вообще, пострадав сегодня всю ночь с выяснение......хлам полнейший! Использовать платы как платформу .... но не надеясь на его работу в полной мере. А о программировании скетчей надо сразу забывать......

вопрос старый как останки мамонта, кто мешает выполнить вышеописанное в полной версии поста?