Установить шаговик в исходное состояние

IgorU
Offline
Зарегистрирован: 03.12.2014

Задача: при старте устройства необходимо вернуть в исходное состояние вал шагового двигателя, я имею ввиду угловое положение, например 0 градусов, а уже в режиме исполнения программы считать импульсы поворота вала.

Как инициализировать исходное состояние, если вал двигателя находится в прозвольном положении? Есть ли способ, поделитесь версиями.

Araris
Offline
Зарегистрирован: 09.11.2012

Есть банальный способ - оснастить двигатель датчиком исходного состояния и руководствоваться его срабатыванием. У меня так настенные часы ловят положение "12" для минутной стрелки. Датчик оптический щелевой. На шестерёнке флажок, перекрывающий датчик.

frankyjohn2014
Offline
Зарегистрирован: 23.05.2016

вот посмотрите у меня в теме.  http://arduino.ru/forum/programmirovanie/arduino-mega-2560-servo-ik

Впринципе понятно что должны стоять датчики начального положения. Но в программировании я ноль и не могу понять как написать код с датчиками.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

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

Araris
Offline
Зарегистрирован: 09.11.2012

frankyjohn2014 пишет:

Впринципе понятно что должны стоять датчики начального положения.

Для сервопривода - не должны. Для шагового двигателя - весьма уместны.

KADAVR
Offline
Зарегистрирован: 21.10.2016

Araris пишет:

Для сервопривода - не должны. Для шагового двигателя - весьма уместны.

тогда как длся шаговых двигетелей выставить "точку отсчета" чтобы в дальнейшем эту точку считать за "ноль" и от нее уже поворачивать двигатель на заданное кол-во шагов? тут и нужен дачик нуля (геркон, или концевик... или прочие).

Araris
Offline
Зарегистрирован: 09.11.2012

KADAVR пишет:

тогда как длся шаговых двигетелей выставить "точку отсчета" чтобы в дальнейшем эту точку считать за "ноль" и от нее уже поворачивать двигатель на заданное кол-во шагов? тут и нужен дачик нуля (геркон, или концевик... или прочие).

Да, конечно, безусловно, очевидно - для шагового двигателя желателен датчик "нуля" и я выше об этом писал. Тут главное - не путать шаговик с сервой, см. http://arduino.ru/forum/programmirovanie/arduino-mega-2560-servo-ik#new

Ещё раз : у сервы уже есть датчик положения, ей достаточно дать команду "повернись в 0".

KADAVR
Offline
Зарегистрирован: 21.10.2016

Araris пишет:

Да, конечно, безусловно, очевидно - для шагового двигателя желателен датчик "нуля" и я выше об этом писал. Тут главное - не путать шаговик с сервой, см. http://arduino.ru/forum/programmirovanie/arduino-mega-2560-servo-ik#new

Ещё раз : у сервы уже есть датчик положения, ей достаточно дать команду "повернись в 0".

может ткнете носом в код, где реализована "паркова в ноль" шагового двигателя? без разницы на каком дачтике (оптический, контакт, геркон...)

Araris
Offline
Зарегистрирован: 09.11.2012

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

Итак, пусть у нас будет функция IsZeroReached(), возвращающая true - датчик "нуля" замкнут, false - не замкнут. Ещё пусть будет функция DoStep(), выполняющая поворот двигателя на один (или несколько) шаг. Теперь набрасываем код :

while ( !IsZeroReached() ) // пока не сработает датчик - крутим, если вал уже стоял в нулевом положении - даже не заходим 
{
DoStep();
}

Вот как бы и всё )) Но есть пара нюансов. 1-й - не проскочить "нуль", решается уменьшением скорости/шага вращения вала. 2-й - если датчик "нуля" не в порядке, то вал будет поворачиваться вечно. Решается проверкой истечения таймаута.

unsigned long curMillis = millis();
#define maxDuration   10000UL  // пусть будет 10 секунд.
while ( !IsZeroReached() && (millis() - curMillis) <= maxDuration ) // пока не сработает датчик и не пройдет определённое время - крутим.
{
DoStep();
}
// проверяем, вышли ли мы по таймауту.
if ( !IsZeroReached() ) 
 {
 Serial.print("ОЙ, ЧТО-ТО С ДАТЧИКОМ НАВЕРНОЕ"); 
 while (1) {} // даже можем остановить выполнение скетча.
 }

Дальше спрашивайте, если что..

KADAVR
Offline
Зарегистрирован: 21.10.2016

Araris

Спасибо, то что мне нужно.... я к своему стыду и не учел такой момент, что датчик может быть поврежден и мотор уйдет в бесконечный цикл. Можете мне дать свою эл. почту,  (моя uvars собака маил ру). Спасибо

Araris
Offline
Зарегистрирован: 09.11.2012

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