Київський клуб аматорів астрономії "Астрополіс"

astromagazin.net
* *
Ласкаво просимо, Гість. Будь ласка, увійдіть або зареєструйтеся.
29 Вересня 2024, 05:29:08

Увійти

google


Автор Тема: «Тикалка» для шаговика (или как моторизовать монтировку-2)  (Прочитано 40154 раз)

0 Користувачів і 3 Гостей дивляться цю тему.

exez

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 1886
  • Подяк: 708
  • Астроманьяк

в первой экспериментальной модели Капеллы так и сделал. Был разъем на >6V и второй разъем взял обычный от наушников на 6V.
Записаний
чистого всем неба и длинных безлунных ночей...

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

Частота у Вас получилась очень большая. Вы правильно рассчитали?

Мне нужен 1 об/мин для вала движка. Для этого мотора это 4075.77 тактов в минуту в режиме полушага. Тогда задержку между тактами получаем: 4075,77 тактов / 60 сек = 14,7 мс.

Цитувати
Для повышения скорости, убирать задержку совсем не получится. Хорошо, если этот дешёвый двигатель будет работать с задержкой 5 мс. Едва ли он сможет работать быстрее.

А что будет, если я в коде вообще уберу задержку между тактами при обратном вращении движка? Он вообще не будет крутиться или будет крутиться с максимально возможной для него скоростью?

Цитувати
И зачем Вам полушаг при такой высокой частоте?

В этом я не силен. ) На сайте, где продают такие моторы, пример кода был как раз для полушага. Я решил его не менять. Мне в принципе, без разницы. Я так понимаю, полушаг для большей точности? Мне на амбарке она не очень важна... По потребляемому току и мощности на валу есть разница между шагом и полушагом?
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 256
  • Ищи на третьей планете.
    • Project EQDrive

я бы таймер задействовал и по прерыванию тикал бы (шагал шаговиком)

Код: [Select]
#include <TimerOne.h>


void setup()
{
Timer1.initialize(14700);
Timer1.attachInterrupt(EventTimer); // run every 14,7 ms
}

void EventTimer()
{
   //................................
}
Смотрю это всем новичкам свойственно

Объясните, чем плох таймер, а то буду дураком всю жизнь его применять  ;D
Записаний



alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295

А что будет, если я в коде вообще уберу задержку между тактами при обратном вращении движка? Он вообще не будет крутиться или будет крутиться с максимально возможной для него скоростью?
Без задержки между шагами ШД совсем не закрутится.
Можете подбирать (уменьшать) задержку, при которой ШД еще будет "сносно стартовать с места".
Но если сделать плавный разгон (плавное уменьшение задержки), то можно достичь гораздо большей скорости вращения.
Записаний
Подякували

Berg

  • Offline Offline
  • Повідомлень: 90
  • Подяк: 23
  • верхогляд-любитель

На сайте, где продают такие моторы, пример кода был как раз для полушага.
На сайте? странно. На мой взгляд, можно было написать короче. Хотя, возможно, для наглядности...
Цитувати
Я решил его не менять. Мне в принципе, без разницы. Я так понимаю, полушаг для большей точности? Мне на амбарке она не очень важна...
Да, полушаг для большей точности и плавности. Но у Вас и так высокая плавность из-за большой частоты. Например, в EQ1 частота в 10 раз меньше.
Цитувати
По потребляемому току и мощности на валу есть разница между шагом и полушагом?
Полушаг расходует электричества в 1,5 раза больше, а про мощность на валу - не знаю. Её легко должно хватать при такой редукции.
« Останнє редагування: 25 Червня 2015, 22:55:12 від Berg »
Записаний
DeepSky 70400, DeepSky F70070,F30070M, ЗМ-5А, МАК-70, Sky-Watcher 705, Travel Scope 70, ТАЛ-120, DeepSky 90/700.

Berg

  • Offline Offline
  • Повідомлень: 90
  • Подяк: 23
  • верхогляд-любитель

Объясните, чем плох таймер, а то буду дураком всю жизнь его применять  ;D
Он не плох, продолжайте радоваться жизни. :) Но delay проще.
Записаний
DeepSky 70400, DeepSky F70070,F30070M, ЗМ-5А, МАК-70, Sky-Watcher 705, Travel Scope 70, ТАЛ-120, DeepSky 90/700.

wanowar

  • Offline Offline
  • Повідомлень: 184
  • Подяк: 36

Объясните, чем плох таймер, а то буду дураком всю жизнь его применять  ;D
Он не плох, продолжайте радоваться жизни. :) Но delay проще.

Да только на период этой функции delay(); - микроконтроллер больше ничего сделать не может. А если еще мигать светодиодом в основном цикле програмы без таймера, то о точности вобще нужно забыть
Записаний


M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

Полушаговый режим нужен отнюдь не только для повышения точности или плавности хода. Например, в случае обсуждаемого 28BYJ движка значительно возрастает его крутящий момент.

Timer vs Delay:

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

Delay не позволяет ничего делать пока идет ожидание.

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

Идея проста. Некая переменная T0 хранит время предыдущего "тика" мотора. DeltaT = период цикла. В простом варианте мы по коду, который делает что-то полезное, расставляем проверку текущего времени на предмет T-T0 > DeltaT и вызываем процедуру обработки очередного "тика" в которой (внимание!) T0 = T0+DeltaT. Распространенная ошибка: T0 = Текущее время.

В оптимизированном варианте порция полезного действия (например, однократный опрос кнопок и реакция на них) всегда меньше DeltaT и код выглядит примерно так:

T0 = ТекущееВремя();
while (1) // бесконечный цикл работы
{
  ЧтотоПолезное();
  while(ТекущееВремя()-T0 < DeltaT); // ждем пока наступит время очередного тика
  ОбработкаТика();
  T0+=DeltaT;
}


Чтобы не было проблемы с ошибкой переполнения, T0, ТекущееВремя(), DeltaT должны иметь тип беззнакового целого числа (unsigned int, unsigned long, UINT64 итд).


В процессе обработки кнопок мы легко можем менять значение DeltaT, "на лету" изменяя скорость вращения движка.
Записаний

wanowar

  • Offline Offline
  • Повідомлень: 184
  • Подяк: 36

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

Почему же. Можно использовать режим СТС. И по прерыванию выполнять нужное действие. Собственно для чего и нужный таймеры - что бы формировать или определить нужный временной интервал. Использовать 16-разрядный Таймер1 и программно управлять им. Единственный минус что таймеров не так много.

Цитувати
В оптимизированном варианте порция полезного действия (например, однократный опрос кнопок и реакция на них) всегда меньше DeltaT и код выглядит примерно так:

T0 = ТекущееВремя();
while (1) // бесконечный цикл работы
{
  ЧтотоПолезное();
  while(ТекущееВремя()-T0 < DeltaT); // ждем пока наступит время очередного тика
  ОбработкаТика();
  T0+=DeltaT;
}
"while(ТекущееВремя()-T0 < DeltaT);" - будет зациклен пока значение истинно, что по своей сути, напоминает функцию delay. Или я чего то не так понял? :hz:
Записаний

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 256
  • Ищи на третьей планете.
    • Project EQDrive

Я посоветовал применить таймер вот для этого, для точного трекинга, как понял параметр скорость в библе нам не важна будет, в теле обработчика
тупо шагаем  myStepper.step(1);
Цитувати
1) Мне нужна скорость 1 оборот в минуту (4075.77 тактов в минуту). Т.е. интервал между тактами 4075,77/60сек = 14,7мс. Поэтому параметр motorSpeed в коде ставлю равным 14.

а вот с этим сист.таймер были непонятками

Код: [Select]
T0 = ТекущееВремя();
while (1) // бесконечный цикл работы
{
  ЧтотоПолезное();
  while(ТекущееВремя()-T0 < DeltaT); // ждем пока наступит время очередного тика
  ОбработкаТика();
  T0+=DeltaT;
}

Был тайм аут на открывание крыши на астробудке (в кировограде) в итоге крыша иногда не открывалась, в итоге отказались от системного таймера и по
моему теперь все в порядке, надо спросить Astrotur
« Останнє редагування: 26 Червня 2015, 08:22:18 від MAKsutik »
Записаний



M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

Почему же. Можно использовать режим СТС.
 И по прерыванию выполнять нужное действие. Собственно для чего и нужный таймеры - что бы формировать или определить нужный временной интервал. Использовать 16-разрядный Таймер1 и программно управлять им. Единственный минус что таймеров не так много.

Минусов... хм... Помимо указанной сложности (программирование СТС вместо простого изменения DeltaT)
- Дискретность изменения цикла таймера явно ниже,
- Зависимость задержки от времени, требуемого на программирование того самого СТС, время таймера нужно рассчитывать с учетом тиков процессора на каждый чих алгоритма. А если в нем есть хотя бы один if... додумайте сами.
Код: [Select]
- все подводные камни, связанные с программированием в теле обработки прерывания. Простейшее из них - необходимость блокировки одновременного использования общих переменных для прерывания и остальной программы.
В принципе, если квалификации хватает, то можно и с СТС решить указанную задачу. Но как в известном анекдоте:
- Могут ли йоги пить водку носом?
- Могут. Но зачем?

Цитувати
"while(ТекущееВремя()-T0 < DeltaT);" - будет зациклен пока значение истинно, что по своей сути, напоминает функцию delay. Или я чего то не так понял? :hz:
Да, будет зациклен, но перед ним выполняется полезная работа. Тут по сути не delay() а waitfortime(), что сильно разные вещи. Период не зависит от времени выполнения ЧтотоПолезное(), пока оно менее DeltaT. Мало того, алгоритм устойчив к однократным небольшим выпадениям времени ЧтотоПолезное() за рамки DeltaT.
Но не буду настаивать. Решение не единственное, но IMHO самое простое и во многих случаях (в особенности простых, как в нашей задаче) весьма надежное и точное.

Проблемы в могут возникнуть в некоторых случаях при сложной реализации системного таймера (если он не только тики считает, но и корректирует свой ход, или сбраывается по каким-то законам, или...). В этом случае T-T0 оказывается сильно большим надолго. На всякий случай можно предусмотреть подобный сбой, добавив проверку, например так:
Код: [Select]
if (T-T0 > 2*DeltaT)
  T0 = T;
Если мы встретились с этой проблемой (не в простейших Ардуино), то  оправдано программирование своего таймера для тех же целей, т.е. таймер просто считает тики, а мы используем счетчик тиков как ТекущееВремя().

Проблема может также возникнуть в случае сильного выпадения ЧтотоПолезное() за рамки DeltaT. Пока алгоритм будет догонять упущенное, на движок такты будут приходить ускоренно, со всеми вытекающими.

Решение с таймером оправдано в случае сложных и длинных реализаций ЧтотоПолезное(). Тут деваться некуда, осваиваем и обходим подводные камни. Но главный фокус в том, что для сохранения интегральной точности первоначального алгоритма таймер придется использовать не столько для управления движком, сколько для реализации RTC, т.е. организации работы двух или более независимых процессов. В одном из которых все равно останется пресловутая проверка
Код: [Select]
ТекущееВремя()-T0 < DeltaT
Записаний
Подякували

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

Что-то я засомневался...  :hz: Правильно ли я считаю?

Мне нужен 1 об/мин на выходном валу редуктора, а не движка.

Как уже писали, этот мотор делает 4075.77 тактов на один оборот в режиме полушага. Тогда задержка между тактами будет: 4075,77 тактов / 60 сек = 14,7 мс.

Это я уже с учетом редуктора считаю?  ???
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

alex~

  • Offline Offline
  • Повідомлень: 6026
  • Подяк: 295

поставьте на вал стрелочку, запустите шаговик - через минуту всё станет ясно
Записаний

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

поставьте на вал стрелочку, запустите шаговик - через минуту всё станет ясно

Да я так и думал, но интересно же рассчитать заранее! )))
Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

Вообще-то не 4075,77 тактов / 60 сек, а 60 сек/4075,77 тактов, но результат написан верный :)

Стандартная пропорция

Код: [Select]
1 оборот            : 4075.77 тактов : 60 c
поворот на такт ?   :  1 такт        : время такта?
время такта = 60с/4075.77 = 0,01472114
поворот на такт = 1/4075.77 = 2,45352e-4 оборота = 0.088 градуса = 5.3 минуты

Записаний
Подякували

wanowar

  • Offline Offline
  • Повідомлень: 184
  • Подяк: 36

Как уже писали, этот мотор делает 4075.77 тактов на один оборот в режиме полушага. Тогда задержка между тактами будет: 4075,77 тактов / 60 сек = 14,7 мс.
Я только не пойму, почему "4075.77 тактов на один оборот в режиме полушага"? Шаг двигателя 5,625°, т.е 64 шага на оборот, редуктор ≈1:64. (1:63,68395)
64/(1/64)=64×64=4096, это в полношаговом режиме, но никак не в полушаговом.
Записаний

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094

Для этого движка (28BYJ-48) 64 классических полушага на оборот. Производитель полушаги шагами обозвал.
Записаний

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 256
  • Ищи на третьей планете.
    • Project EQDrive

Как уже писали, этот мотор делает 4075.77 тактов на один оборот в режиме полушага. Тогда задержка между тактами будет: 4075,77 тактов / 60 сек = 14,7 мс.
Я только не пойму, почему "4075.77 тактов на один оборот в режиме полушага"? Шаг двигателя 5,625°, т.е 64 шага на оборот, редуктор ≈1:64. (1:63,68395)
64/(1/64)=64×64=4096, это в полношаговом режиме, но никак не в полушаговом.

Phase : 4
Current : 160 mA per winding (320 mA in 4-step mode) Measured: 250mA stopped, 200 mA running fast
Resistance : 31 Ω per coil winding (from Red wire to any coil)
Voltage : 5V DC
Step Angle (8-Step sequence: Internal Motor alone): 5.625° (64 steps per revolution)
Step Angle (4-Step sequence: Internal Motor alone): 11.25° (32 steps per revolution)
Gear Reduction ratio: 1 / 64 (Not really exact: probably 63.68395.:1 )
SO: it takes (64*64 = 4096 steps per output shaft revolution.. In 8-step sequence.
SO: it takes (32*64 = 2048 steps per output shaft revolution.. In 4-step sequence.
Записаний


Подякували

vakulenko

  • Offline Offline
  • Повідомлень: 1076
  • Подяк: 120
  • Антон Вакуленко

Итак, привод для амбарки (спасибо огромное всем неравнодушным!) собран и работает как и планировалось.

Единственное "НО". Согласно рекомендаций, я делал 4075.7728395061728395061728395052 тактов на оборот, чтобы получить на валу 1 об/мин. (Движок 28BYJ-48).

По результатам нескольких измерений реальная скорость вращения вала получилась 1 оборот за 60,7 сек. У меня вопрос:

Эта небольшая погрешность вызвана:
1) Тем, что реально движку надо не 4075.77 тактов, а чуть больше?
2) Тем, что кварц не точен из-за того, что питание ардуины отлично от 5В (сейчас, пока батареи свежие, 5,1В)
3) Что-то еще?

И еще один вопрос: ток потребления мотора 370мА при напряжении 5,9В. Мотор при этом весьма прилично греется. Стоит лепить к нему радиатор или достаточно его корпуса для тепловыделения?


Записаний
sw dob 10", sw ed80 + heq-5, canon 1000d(a), delta optical 10x56

MAKsutik

  • Offline Offline
  • Повідомлень: 4715
  • Подяк: 256
  • Ищи на третьей планете.
    • Project EQDrive

период тактов чем задается? мне кажется что проблема тут зарыта.
Я уже говорил что по событию таймера бы делал, если бы хотел стабильности.
Радиатор не поможет, вы охладите корпус мотора но обмотка так и останется горячей, я бы уменьшил протекающий ток через обмотки.
Записаний