Начало » Практика » Электропривод » Шаговый двигатель в доработке новогоднего диско-фонаря (ATtiny2313A, ULN2003)

 
 

Шаговый двигатель в доработке новогоднего диско-фонаря (ATtiny2313A, ULN2003)

01.02.21   Yamazaki   1 002   2  

Привет читателям и писателям Датагор.ру! Попала мне в руки такая вот красивая новогодняя игрушка. Внутри три светодиода, над ними вращается прозрачный шар из пластика. Конструкция формирует линзы, которые проецируют красоту во все стороны. Шар медленно крутится, разноцветные узоры бегают по стенам и потолку.

Всё бы ничего, но вот моторчик почти сразу начал достаточно громко и противно шуметь щётками. Такой маленький, и такая зараза! Мне ничего не оставалось, как решить проблему самым радикальным образом: избавиться от щеток совсем. С моим гигантским запасом шаговых двигателей сделать это казалось не сложно 😂

Схема первая

Выбираю подходящий шаговик под 5V питание, собираю простейшую схему на тиньке Attiny2313A и ULN2003:
Рис.2 Схема первого макета


Код пишем в Mikropascal. Программа просто переключает выходы поочередно в нужном для шаговика порядке, таким образом моторчик работает в режиме полушага.
program stepper;
 Var
 counter: byte;
 Const
 states: array [0..7] of byte = (%00010000,
                                 %01010000,
                                 %01000000,
                                 %01100000,
                                 %00100000,
                                 %10100000,
                                 %10000000,
                                 %10010000);

begin
 //config
 DDRB:=%11110000;

 { Main program }
 While true do
 begin
 inc (counter);
 if (counter>7) then counter:=0;

 portB:= states[counter];
 delay_ms (50);
 end;
end.


Первый запуск с шаром, первые проблемы

Собираем макет, напыживаем шар на вал и испытываем.




Вот те раз! Шаговик в полном соответствии со своей шаговой природой … шагает! Крутится тоесть, но рывками, неравномерно. Да ещё издает характерные стучащие звуки, подпрыгивая на столе. Гораздо тише, чем было, но всё же… К сожалению видео слабо передало эффект.

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

Решение

Решение пришло само собой, когда я вспомнил о своей предыдущей статье про шаговики: «Как покрутить шаговый двигатель с помощью аудиоусилителя».

Смысл такой: если крутить моторчик двумя синусоидами, он вращается гораздо равномернее, и практически бесшумно!
В чистом виде такое решение едва ли будет применимо, но вот сделать синусоиду ШИМом можно, и для этого даже не понадобится более мощный микроконтроллер. У Attiny2313A есть четыре канала ШИМ, что как раз нам подходит.

Как мы помним, шаговый двигатель имеет сдвоенные обмотки. В паре две полуобмотки намотаны в разные стороны, благодаря чему одна электрическая полярность дает два возможных направления магнитного поля. Задача сформулирована: одну полуволну синусоиды надо выдать в одну полуобмотку, вторую полуволну — в парную ей полуобмотку. Для двух оставшихся полуобмоток делается то же самое, но со сдвигом фазы на 90 градусов.

Расчёт синуса

Я не стал заморачиваться с вычислением значений синуса в микроконтроллере и просто подготовил их заранее в Excel.
Поскольку используется восьмибитный ШИМ, для каждого шага значение синуса (оно не может быть больше единицы) нужно умножить на 255, чтобы получить итоговые значения от 0 до 255

Получился такой ряд цифр:


Новый код

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

Получился такой код:

 program stepper;

 Var
 counter: byte;
 counter_shift: byte;
 Const
 sinus: array [0..179] of byte = (0,9,18,27,35,44,53,62,70,79,87,96,104,112,120,128,
                                  135,143,150,157,164,171,177,183,190,195,201,206,211,
                                  216,221,225,229,233,236,240,243,245,247,249,251,253,
                                  254,254,255,255,255,254,254,253,251,249,247,245,243,
                                  240,236,233,229,225,221,216,211,206,201,195,190,183,
                                  177,171,164,157,150,143,135,128,120,112,104,96,87,79,
                                  70,62,53,44,35,27,18,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);

begin
 //конфиг портов
 DDRB:=%00011100;
 DDRD:=%00100000;
 //конфиг таймерa 0
 //TCCR0A:=%10100011; //оба выхода включены, выбран быстрый ШИМ
 //TCCR0B:=%00000010; //делитель 8
 TCCR0A:=%10100011; //оба выхода включены, выбран медленный ШИМ
 TCCR0B:=%00000001; //делитель 1

 //конфиг таймерa 1
 //TCCR1A:=%10100001; //оба выхода включены, выбран быстрый ШИМ 8 бит
 //TCCR1B:=%00001010; //делитель 8
 TCCR1A:=%10100001; //оба выхода включены, выбран медленный ШИМ 8 бит
 TCCR1B:=%00000001; //делитель 1

 counter:=0;
 counter_shift:=45;

 { Main program }
 While true do
 begin
 inc (counter);
 if (counter>179) then begin counter:=0; counter_shift:=45 end;
 inc (counter_shift);
 if (counter_shift>179) then counter_shift:=0;

 OCR0A:= sinus[counter];
 OCR0B:= sinus[179-counter];
 OCR1AL:= sinus[counter_shift];
 OCR1BL:= sinus[179-counter_shift];
 delay_us (1000);
 end;
end.


Схема вторая

Макет придется немного поправить. Когда мы просто выводили нули и единицы, можно было использовать любые GPIO ноги, но аппаратный ШИМ привязан к конкретным четырем ногам:


Собираем, запускаем… О чудо, работает, даже как бы и неплохо, но тоненько свистит в такт шагам.
Уменьшаем предделитель таймера с 8 до 1, но сам таймер переставляем режим фазо-корректного ШИМ, он в два раза медленнее «быстрого» ШИМ. Итоговая частота получилась около 16 кГц, что уже не слышно.
Включаем… Писк пропал! Тишина просто пугающая! Крутится плавно!
Осталось всё собрать, чтобы выглядело не хуже, чем было.




Итоги тестирования, правки, выводы

Тестовая эксплуатация показала, что нужна некоторая доработка. Маленькая китайская платка 5В питания от пульсирующей нагрузки сходила с ума, пришлось сгладить потребление с помощью четырех конденсаторов по 1500 μF 6.3V из материнок.

Что ещё хуже, плавное вращение оказалось неустойчивым. Может несколько минут крутиться плавно, потом, начинает дергаться, потом опять вращаться плавно… Кроме того, были проблемы с запуском. При старте раскачка начиналась обязательно, и её приходилось успокаивать пальцем.

Для начала я решил приделать плавный старт, хотя это и было неудобно, ведь оба таймера заняты ШИМом. Это не помогло, всё стало хуже. Очевидно, что дело не в программе, а в физических основах работы устройства.

Проанализируем:
1) Каждое устойчивое положение мотора не фиксируется жестко, оно обладает определенной упругостью.
2) Шар это достаточно массивный кусок пластика, обладающий моментом инерции
3) Упругость и масса образуют колебательную систему!
4) Мы сами её раскачиваем пинками (хотя и сглаженными) через повторяющиеся промежутки времени!

В итоге оказалось достаточно в приведенном выше коде изменить период следования тактов.
Вместо delay_us (1000); делаем delay_us (1150);




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

Хочу заметить, что если вы решите сделать что-то подобное, эти конкретные цифры периода, вероятно, не подойдут под ваш моторчик и под ваш вращающийся объект. Их придётся подбирать самому.

Теперь всё прекрасно работает, всем спасибо за внимание!

Файлы

Файловый сервис недоступен. Зарегистрируйтесь или авторизуйтесь на сайте.

В архиве проект в Proteus 8, проект-исходник в mikroPascal, готовый stepper.hex, файл синус.xlsx.

Фьюзы

Воспользуемся онлайн калькулятором фьюзов. Выбираем нашу тиньку. Больше ничего не трогаем, снимаем только галку на Divide clock by 8 internally; [CKDIV8=0]. Жмем внизу «apply feature settings».


Нужные фьюзы программа выдаст ниже в виде галок и в виде 16-ричных значений. В нашем случае поменяется только одна галка — CKDIV.


Дополнение о моторах

Родной мотор во точно такой:

Редуктора не слышно, он демпферной смазкой залит по уши. А вот сам моторчик противно скрежещет.

Если не торопиться, на его место можно воткнуть такой:

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

Камрад, рассмотри датагорские рекомендации

🌻 Купон до 1000₽ для новичка на Aliexpress

Никогда не затаривался у китайцев? Пришло время начать!
Камрад, регистрируйся на Али по нашей ссылке. Ты получишь скидочный купон на первый заказ. Не тяни, условия акции меняются.

🌼 Полезные и проверенные железяки, можно брать

Куплено и опробовано читателями или в лаборатории редакции.



 

Читательское голосование

Нравится

Статью одобрили 18 читателей.

Для участия в голосовании зарегистрируйтесь и войдите на сайт с вашими логином и паролем.
 

Поделись с друзьями!

 

 

Связанные материалы

 

Схема на Датагоре. Новая статья Электролобзик Dnipro-M JS110-SF: перегрев щёток КШМ, вонь пластиком... Доброго времени суток, уважаемые датагорцы! Подскажите, пожалуйста, нормальную рабочую температуру...
Схема на Датагоре. Новая статья Вечный энкодер (валкодер) с устойчивыми положениями из шагового двигателя... Механический энкодер — вещь удобная в использовании, но он имеет некоторые досадные недостатки. В...
Схема на Датагоре. Новая статья Китайская игрушка «Проектор для рисования» и слово о правильном питании светодиода... Купила бабушка внучке подарок – развивающую игру проектор для рисования. По замыслу создателей эта...
Схема на Датагоре. Новая статья Фанерный робот. Мой первый в жизни ЧПУ-станок из подножных материалов... Приветствую всех земляков Датагорцев! Планировал написать очередную статью конечно же о новом...
Схема на Датагоре. Новая статья Программа Galva v.1.85. Рисуем шкалы и шильдики... Недавно посчастливилось приобрести несколько измерительных головок магнитоэлектрической системы,...
Схема на Датагоре. Новая статья Детская музыкальная игрушка (2+) на PIC16F628A из компьютерной клавиатуры (Обновлено)... Автор идеи этой игрушки Игорь «Datagor» о сынишке в марте 2009 г.: «Тестирование прошло на ура!...
Схема на Датагоре. Новая статья Программируемые роботы. Дж. Вильямс... Программируемые роботы. Дж. Вильямс Год: 2006 Страниц: 240 Формат: DjVu Размер: 6.39 mb Качество:...
Схема на Датагоре. Новая статья Управление шаговым двигателем с ПК... Драйвер для шагового двигателя, который управляется с персонального компьютера. Привет всем! Решил...
Схема на Датагоре. Новая статья Простейший кодовый замок на реле, для начинающих... Начну с того, что на работе у меня стоял какой-то древний самодельный кодовый замок, который уже не...
Схема на Датагоре. Новая статья Простой станочек для намотки + счетчик витков из калькулятора... Понадобилось мне в один прекрасный день намотать катушки, и сразу же возник вопрос как считать...
Схема на Датагоре. Новая статья Реставрация гитары Diamant. Делаем флажок и крышку анкера... Первая статья: Реставрация гитары Diamant. Ожившая легенда! Наконец дошли руки до крышечки анкера и...
Схема на Датагоре. Новая статья Обратная связь по току или "Почти ламповый усилитель..."... Большинство граждан этого виртуального города пришли сюда вместе с желанием сделать хороший...
 

Общаемся по статье 💬

Шаговый двигатель в доработке новогоднего диско-фонаря (ATtiny2313A, ULN2003)

Комментарии, вопросы, ответы, дополнения, отзывы

 

<
Читатель Датагора

игорь джан

Комментарий # 1 от 01-02-21, 19:25.
  • С нами с 7.02.2012
  • 168 комментариев
  • 4 публикации
 
С ума сойти 👍

<
Читатель Датагора

Datagor

Комментарий # 2 от 07-02-21, 15:51.
  • С нами с 26.02.2006
  • 2 391 комментарий
  • 279 публикаций
 
Не то слово 😉
И чистый, строгий, лёгкий для понимания код на Паскале.
Серёга, наше почтенье!

Информация
Вы не можете участвовать в комментировании. Вероятные причины:
— Администратор остановил комментирование этой статьи.
— Вы не авторизовались на сайте. Войдите с паролем.
— Вы не зарегистрированы у нас. Зарегистрируйтесь.
— Вы зарегистрированы, но имеете низкий уровень доступа. Получите полный доступ.