Найти тему
Паяльник и код

Энкодер из бесколлекторного мотора BLDC от HDD на Arduino

Оглавление

Что такое бесколлекторные моторы?

Как следует из названия, эти моторы у которых отсутствует щёточно-коллекторный узел. На вращающейся части – роторе – расположены постоянные магниты. На неподвижной части – статоре – обмотки электромагнитов. В движение такой мотор приводится изменением тока на разных фазах. Одним из примеров являются HDD моторы. Изменение электрических фаз приводит к смещению ротора на строго предопределённый угол – один шаг. Отсутствие скользящих контактов щёток позволяет достигать большой мощности и долговечности

Вот такой у меня моторчик

-2

Мотор с 3 выходами. Внутри схема треугольника. Сопротивление между выводами одинаковое

-3

Нижняя сторона. Припаял коннектор

Что хочу сделать?

Из моторчика сделать энкодер. Крутим мотор в одну сторону изменяется значение в положительную сторону, в обратную – в отрицательную.

Сначала нужно из аналогового сигнала сделать цифровой. Для этого применим схему

-4

Один из входов моторчика цепляем на землю. А два остальных используем для замера, сравнивая. Использовать будем операционный усилитель LM358

-5

Собираем схему на макетной плате с подключением к Arduino Nano

-6

Питание берем с Arduino

Скетч

#include <PinChangeInterrupt.h> // библиотека для прерываний

// порты на которых можно обрабатывать прерывания
#define L1 2
#define L2 3

// инициализация
void setup() {
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(L1), isrRegisterPulseOnL1, RISING);
attachInterrupt(digitalPinToInterrupt(L2), isrRegisterPulseOnL2, RISING);
}

void loop() {} // не используем

bool pusk1 = false;
bool pusk2 = false;

// прерывание если есть сигнал от первой ножки мотора
void isrRegisterPulseOnL1() {
if(digitalRead(L2)){
if(pusk1){
Serial.println(‘+’);
pusk1 = false;
}
else pusk1 = true;
} else {
pusk1 = false;
}
}

// прерывание если есть сигнал от второй ножки мотора
void isrRegisterPulseOnL2() {
if(digitalRead(L1)){
if(pusk2){
Serial.println(‘-’);
pusk2 = false;
}
else pusk2 = true;
} else {
pusk2 = false;
}
}

Скетч работает следующем образом: если есть прерывание на первой ножке, проверяем состояние второй. Если оно положительное, то движется мотор влево. Так и в обратную сторону. Если есть прерывание на второй ножке, проверяем состояние первой. Если оно положительное, то движется мотор вправо. Так же используем разные условия, для ложных срабатываний. Приходится жертвовать, обрабатывать каждое второе срабатывание. Для более точного позиционирования нужно использовать мотор с другой конфигурацией, у которого 4 вывода.

Тест

Спаиваем плату

-7

Собираем тестовую площадку. Добавляем светодиод. Испытываем

-8

Всё работает. Ложных срабатываний нет

Ссылки

Скетч с библиотеками - https://disk.yandex.ru/d/vPUY-A6hi66ClA

LM358 - https://aliexpress.ru/item/32832610347.html

Набор резисторов - https://aliexpress.ru/item/32636020144.html