оптический датчик оборотов под Arduino
- Войдите на сайт для отправки комментариев
Всем привет! Появился вопрос, реально ли создать датчик оборототов для снятия показаний с вала, на примерно 60000 (шестидесяти тясячах) оборотов в минуту. Нужен фоточувствительный элемент, вывод от него уже скорее всего будет цифровой. Цель этого датчика снимать обороты в двух точках на валу, с одной стороны муфты и с дрйгой, для определния угла отставания, если он появится при скручивании муфты.
Я понимаю схему и общий вид, но вот подробней бы это изучить. Понятно, что нужно использовать светучувствительные дачтики, но оброты очень высокие, поэтому возникает вопрос, какие? Потом, я не очень хорошо знаю саму сситему Ардуино, поэтому решил спросить на форуме, может кто-то подскажет, что почитать, чтобы было понятнее как это все исполнить уже более детально - какие дачики, какие платы, какой код и т.д.
Любой оптический датчик на 60кГц запросто работает. Я не сильно спец ещё в Андруинах, но на скетчах, как мне кажется, такое не получится. Тут на асме несколько строк всего будет. Необходимо настроить таймер на 60000*360 Гц. Оба датчика повесить на входы прерываний. По прерыванию первого перезапускать таймер, по прерыванию второго считывать и записывать в переменную получившееся скручивание в градусах. Успеет таймер тактовать 21.6Мгц я точно не знаю...
Идея с прерываниями страдает некой переусложненностью. Проще таймером в режиме захвата считать.
Стоит подумать над вариантом выделения биения частот между двумя датчиками, и обработкой уже этого сигнала.
Очевидно, что он будет иметь куда меньшую частоту, чем 60кГц. Если частоты оборотов равные, так и вовсе нулевую.
Успеет таймер тактовать 21.6Мгц я точно не знаю...
Нет, не успеет. У ардуино частота тактирования 16Мгц.
Не совсем понятна задача. Если муфта скручивается, то они либо порвется либо скрутится на некоторый градус ( при первом обороте) и будет продолжать передавать вращение на такой же частоте. А если она скручивается на первом обороте, тогда нет частоты 60000, и это скручивание на выловишь. Либо ставить на вал датчик как в компьютерной мышке который за 1 оборот вала дает 40-50 прерываний. Но опять таки практическое применение задачи не ясно.
Лично я считал обороты через асинхроноое тактирование таймера за единицу времени (отмеряемую другим таймером)
Стоит подумать над вариантом выделения биения частот между двумя датчиками, и обработкой уже этого сигнала.
поддерживаю, решать силами МК без дополнительных мер, будет очень низкая точность. Если подать 2 сигнала на смеситель, при отставании (изменении) одного получим разницу. Типа вариант в какую сторону думать. Или диф. цепь организовывать (кусок из ПИД регулятоа)
Успеет таймер тактовать 21.6Мгц я точно не знаю...
Нет, не успеет. У ардуино частота тактирования 16Мгц.
ардуино - это не только 168 и 368 контроллеры, есть и побыстрее.
А откуда взяли 60 кГц? 60000 обор/мин -это 1 кГц.
А откуда взяли 60 кГц? 60000 обор/мин -это 1 кГц.
подскажи, плиз, сколько мкс можно отловить двумя прерываниями на меге? если не сложно, минимальный угол поворота примерно определить. Если не сложно, ассемблерным кодом :) (мне сам код не нужен, только время)
чисто в копилку знаний положить...
В #1 посте правильно алгоритм описали. Первый датчик который на валу двигателя будет вести счет частоты и запускать таймер для счета. Второй датчик который на приводном валу будет останавливать таймер со съемом прошедшего времени. На основании полученной частоты вращения определяется угловое смещение. Зная характеристики муфты получим момент на приводимом валу, усилия и т.д.
Насколько точно даст МК ардуины результат сказать не могу. Прерывания на дуне работают через ж. Сам убедился когда считал обороты на своем шпинделе.
Немного неправильно написал. Первый датчик должен обнулять таймер со съемом показания времени - для определения частоты вращения. А второй датчик должен только снять время с таймера.
60000rpm = 1000hz. Энкодер на 18 провсетов выдаст 36 прерываний на оборот (фронт + спад), итого 36кгц частота прерываний и точность угла поворота в 1 градус. За время между прерываниями МК на 16мгц успеет выполнить примерно 300 команд. Подсчет в прерывании - существенно меньше. Соответственно, примерно 80% времени он будет способен ещё исполнять основной цикл loop(). В чем пгоблема? :)
Для примера, у меня есть 4 двигла с энкодерами по 32 окна и обработчик на PCINT2 по фронту И спаду (64шт/оборот). Двиглы крутятся с типовой скоростью 12000rpm .. то есть "пиковая" частота прерываний около 50кгц .. потеря производительности Меги не превышает 25%.
Датчик TSC3200 (цвета) достаточно уверенно считает частоту на прерываниях (типовой скетч) вплоть до частот в 150кгц.
Не понимаю, "в чем пгоблема"? :)
подскажи, плиз, сколько мкс можно отловить двумя прерываниями на меге? если не сложно, минимальный угол поворота примерно определить. Если не сложно, ассемблерным кодом :) (мне сам код не нужен, только время)
Тут не всё просто, отловить-то можно довольно мелкий отрезок, например 1µs , но обработать эти данные в потоке не уже хватит скорости. Так что как уже упомнянул Arhat109-2 реально на прерываниях можно работать с частотами максимум в сотню килогерц. А в ассемблере я не силён :)
я бы применил исключающее или не XNOR. CD4077 или CD4070 например. по сути одно и тоже, просто сигнал на выходе 1 или 0
но потребуется одинаковые датчики и точное позиционирование. а уже выходной сигнал обрабатывать ардуиной. если не понятно на выходе сигнал поменяется если на входе они будут разные
но это для определения скручивания, а не измерения скорости
Тут еще один момент если вы будете ловить один сигнал на оборот, да и в других случаях тоже: Установка нулевой позиции когда первый датчик и второй датчик при нулевом движении и моменте должны совпасть желательно идеально.
Еще один момент касается нескольких отсчетов на оборот: угол деформации не должен быть больше одного отсчета. Тут предложили 36 отсчетный датчик, так вот для него максимальный угол скручивания будет около 10 градусов.
С экодером, особенно многошаговым, задача будет проще! Превый энкодер на счётный вход защёлки/регистра аппаратного, второй - на сброс. На выходе получаем скручивание в шагах энкодера. Если нет аппаратной защёлки. Тоже самое либо на таймере, что правильно, либо просто на переменной по прерываниям.
volatile unsigned int Curling, MaxCurling = 0; void int0() { Curling++; }; void int1() { if (Curling>MaxCurling) { MaxCurling=Curling; }; Curling=0; }; void mail() { /* тут делаем чего хотим, не думая о энкодере, и в любой момент имеет мгновенное и максимальное значения шагов энкодера на скручивание */ };А в каких пределах преполагается изменение угла скручивания?
Вам нужен для этого не датчик оборотов, а датчик запаздывания одного сигнала относительно другого.
Один датчик до муфты , другой после (например оптический, или при требованиях по грязи/смазке индуктивный-холл-вихретоковый) .Первый запускает счетчик-делитель, второй останавливает. После прихода второго сигнала формируем с задержкой импульс на перезапись в выходной буфер -защелку и сигнал прерывания для процессора, который читает буфер и обрабатывает его содержимое. После чтения не забываем отресетить счетчик.
Буфера может и не быть, формируемые задержки могут быть программными, чтение возможно как многоразрядным портом, так и через сдвиговый регистр типа 555ир9.
Разрядность счетчика зависит от ожидаемого угла и частоты считаемых импульсов, которая зависит от желаемой точности и ожидаемого угла.
К вопросу о том, надо ли идти на поводу у заказчика, исполняя его хочучки, или решать конечную задачу (которая ОЧУДО была озвучена).
Извиняйте за некошерность, но я предпочитаю аппаратно-программные решения.
А вообще, пострадав сегодня всю ночь с выяснение "какого х", я окончательно убедился: бибилиотеки Андруины и её софт (собственно, ничего никогда толкового написанного на яве вообще не видел - всё корявое и глючное, это такой даже стиль: пишешь на яве, значит, сторонник кривописания и глюков) хлам полнейший! Использовать платы как платформу можно, особенно Уно с перешитым кристаломпорта порта в программатор. Софт для макетирования примитивных частей -"пощупать" можно, но не надеясь на его работу в полной мере. А о программировании скетчей надо сразу забывать и брать в руки АВРСтудио или МикроПаскаль. Так будет порачено время с пользой - изучение нормальной среды разработки, а не понимание чужих глюков.
от невнимательности, не часто приходится оперировать оборотами, так что на автомате прописал.
А вообще, пострадав сегодня всю ночь с выяснение......хлам полнейший! Использовать платы как платформу .... но не надеясь на его работу в полной мере. А о программировании скетчей надо сразу забывать......
вопрос старый как останки мамонта, кто мешает выполнить вышеописанное в полной версии поста?