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

astromagazin.net
* *
Ласкаво просимо, Гість. Будь ласка, увійдіть або зареєструйтеся.
18 Лютого 2025, 08:44:03

Увійти

google


Автор Тема: Фокусер для ленивых  (Прочитано 4176 раз)

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

GAW

  • Offline Offline
  • Повідомлень: 337
  • Подяк: 80
  • All Life is a Dream
Re: Фокусер для ленивых
« Відповідь #20 : 22 Червня 2016, 17:52:59 »
. - .

попробуйте использовать таймер:
#include <TimerOne.h>

Вместо делеев? Спасибо, попробую.

Таймер тут ни при чем. Для начала число 4096 попробуйте на 4076 поменять. Потом можно и увеличить точность, если захочется.

Ошибка в 20.227 микрошагов на оборот за 100 оборотов приводит к смещению вала на пол-оборота.
Самое логичное решение. надо раскривушку пересчитаь)
Записаний
All Life is A Dream

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094
Re: Фокусер для ленивых
« Відповідь #21 : 23 Червня 2016, 00:39:26 »
. - .

Возможно, что есть более чем одна модификация 28BYJ-48.
Подключил движок из новой партии, обнаружил, что у него таки 4096 микрошагов на оборот, как в документации.

Поскольку для точной скорости нужно еще и точное время, измерил отклонение частоты резонатора. Получил коэффициент 1.000925. Скорректировал. Погонял несколько минут. IMHO точно.

Скетч на 1 оборот в минуту прилагается.

Код: [Select]
union mylong { //  for fixed 64-bit point math
  unsigned long long ll;
  unsigned long l[2];
};

mylong t0, dt;

bool forward = false; // direction
char phase[8] = {0x1, 0x3, 0x2, 0x6, 0x4, 0xC, 0x8, 0x9};


float ft = (60000.        // 60 seconds
             / 4096.)     // steps per revolution, 4075.7728) for old 28BYJ-48)
           * 1.000925;    // x-tal correction;

char portval = 0;

void setup() {
  t0.l[1] = millis();
  dt.ll = ft * 4294967296.0 + 0.5;

  // motor is 28BYJ-48 motor is connected to port B0, B1, B2, B3 i.e. digital 8,9,10,11
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop()
{
  unsigned long t1 = millis();
  long delta = long(t1 - t0.l[1]);
  if (delta >= 0)
  {
    t0.ll += dt.ll;
    PORTB = phase [ forward ? (portval++) : (portval--) & 7];
  }
}
Записаний

M_M

  • Клуб Астрополіс
  • Offline Offline
  • Повідомлень: 5068
  • Подяк: 1094
Re: Фокусер для ленивых
« Відповідь #22 : 23 Червня 2016, 10:33:13 »
. - .

Записаний

GAW

  • Offline Offline
  • Повідомлень: 337
  • Подяк: 80
  • All Life is a Dream
Re: Фокусер для ленивых
« Відповідь #23 : 23 Червня 2016, 17:44:06 »
. - .

Нашел ошибку в предыдушем скетче, делал 8 лишних шагов. Поправил и запустил тестирование заново. 4096 шагов за оборот, прошло более 600 оборотов, визуально отклонения не видно.
Старый пост тоже поправил
Записаний
All Life is A Dream