HDD бесколлекторный мотор и L293d

etaon
Offline
Зарегистрирован: 16.12.2011

 Пробую запустить мотор от винчестера.

Всё подключил. Мотор запускается и крутится 2-3 оборота в секунду. Мне нужны обороты до 10000 об\мин.

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

Код выкладываю.

int h=100;
int ms=16383;
char c;

int i;

void setup() {
int sensorPin = A0;

pinMode(10, OUTPUT); //выводы устанавливаюся в режим выхода
digitalWrite(10, LOW); //на выходе низкий уровень
pinMode(9, OUTPUT);
digitalWrite(9, LOW);
pinMode(8, OUTPUT);
digitalWrite(10, LOW);
}

void loop() {
int sensorPin = A0;

if (analogRead(sensorPin)==1023) {
h=h*0,98;
ms=ms*0,99;
}

digitalWrite(8, LOW); //задаем активную обмотку
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
// delay(h);
delayMicroseconds(ms); //ждем h миллисекунд
digitalWrite(8, LOW); //задаем активной следующую обмотку
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
// delay(h);
delayMicroseconds(ms);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
// delay(h);
delayMicroseconds(ms);
}

leshak
Offline
Зарегистрирован: 29.09.2011

 На "вскидку", на что обратить внимание:

  1. Подумать "а возможно ли". Посчитать какие задержки должны быть для 10000 и даст-ли быстродействие ардуины такую частоту 
  2. Помнить что  разрешение ардуины при работе с микросекундами равняется 4-рем.
  3. Обычно всякие моторы не любят когда им дают сразу "полный газ". Нужно "разгонять постепенно". Вначале на малой скорости, а потом наращиваем обороты.
  4. Когда вы используете digitalWrite, то хоти-те вы или нет но между их выполнением тоже проходит какой-то время. То есть обмотки у вас "влючаются-выключаются" немного рассинхронизированно. Для борьбы с этим смотрим в http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry  . Таким образом можно включать-выключать выходы действительно ОДНОВРЕМЕННО несколько штук.
  5. Зачем вы в каждом loop присаваете sensorPin? на это тоже уходит время. Зачем вы вообще используете переменную (память+такты на чтение)? Сделайте вначале скетча что-то типа #define SENSOR_PIN A0
  6. Чтение сенсора тоже может занимать такты (и сбивать тайминги), возможно нужно управление обмотоками повестить на таймеры, что-бы "быть точнее"
  7. Можено попробовать поискать готовые либы, где это все уже учтено
  8. Обязательно почитать ветку прикрепленную ветку  http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

 

etaon
Offline
Зарегистрирован: 16.12.2011

Спасибо. Учту всё.

Только вот один нюанс. На выходах L293D всего лишь 0,7 вольта. А на транзисторах получил лишь 1,7 вольта. И это при постоянном +5В на управляющей ножке. Входное высокое напряжение 12В. Как так может быть? Присутствует просадка напряжения при работе? Кондер надо добавить да?

Попробовал подключить не через L293D, а прям через транзисторы. Подал на них 12В от системника, а управлял ими 5В с Ардуины. Итого 3 транзистора. Пока использую ручное пониже паузы, чтобы можно было находить оптимальную работу. Вывел на LCD дисплей текущую величину паузы. Мотор запускается ,а иногда дергается и требует толчка. ТАк вот, при снижении паузы с 13000 до 4900 мотор нормально работает. По звуку слышу срабатывание обмоток двигателя. Жужжат. Как тлько понижаю паузу еще на пару микросекунд как мотор останавливается. Словно мощности ему не хватает набрать дальнейших оборотов для соотвествия новым паузам между циклами.

Есть обороты на которых мотор идеально работает. Близкие к срыву мотора.

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

Есть ли смысл аналоговыми портами задавать нарастающий импульс и убывающий для каждой обмотки? Не HIGH подавать а от 50 и до 250 ступенями..

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


int ms=16383;
char c;

int i,r;

void setup() {
Serial.begin(115200); 
int sensorPin = A0;
lcd.begin(16, 4);


pinMode(10, OUTPUT); //выводы устанавливаюся в режим выхода
digitalWrite(10, LOW); //на выходе низкий уровень
pinMode(9, OUTPUT);
digitalWrite(9, LOW);
pinMode(8, OUTPUT); 
digitalWrite(10, LOW); 
}

void loop() {
int sensorPin = A0;

r=1;
while (r <= 5) {


// if (analogRead(sensorPin)==1023) {
// h=h*0,98;
//ms=ms*0,99;
// Serial.println(h); //выводим время задержки
Serial.println(ms); //выводим время задержки
// Serial.print(" ");
// Serial.print(analogRead(sensorPin));
//}



digitalWrite(8, LOW); //задаем активную обмотку
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
// delay(h);
delayMicroseconds(ms); //ждем h миллисекунд
digitalWrite(8, LOW); //задаем активной следующую обмотку
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
// delay(h);
delayMicroseconds(ms);
digitalWrite(8, HIGH);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
// delay(h);
delayMicroseconds(ms);
r=r+1;
}

if (analogRead(sensorPin)>1000) {
if (ms>5000) {
ms = ms-500;
}
else {
if (ms>10) {
ms=ms-1;
}
}
}
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(ms);

}

 

 

 

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Если это безколлекторник, то у него должны быть датчики положения ротора. Обычно 3. Двигатель разгоняется за счет "убегания" магнитного поля статора от датчиков. То есть тайминги задаются от датчиков. Почитайте о безколлекторниках - инфа есть в нете

etaon
Offline
Зарегистрирован: 16.12.2011

Конкретно эти моторы идут без датчиков. Там всего 4 провода. 3 на обмотку и один центральный. Народ писал ,что разгонял их до 30 000 оборотов. Начинаю его крутить с тайминга 9 000 микросекунд. delayMicroseconds(9000) т.е. 90 милисекунд. При уменьшении таймингов и достижении значения 4000 мотор затихает. При этом видно, что обороты не достигают тех, что развивались при запуске от родной платы HDD.

delayMicroseconds()

Description

Pauses the program for the amount of time (in microseconds) specified as parameter. There are a thousand microseconds in a millisecond, and a million microseconds in a second.


Currently, the largest value that will produce an accurate delay is 16383. This could change in future Arduino releases. For delays longer than a few thousand microseconds, you should use delay() instead.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

По моим прикидкам 30000 оборотов получится при 660 микросекундах. НО! Вы в основном цикле инициализируете LCD, потом шлете в него данные. Это ОЧЕНЬ медленные проседуры. Попробуйте инициализировать 1 раз (в ините) и выводить данные ну, хотя бы раз в секунду. Ну или при смене задержки чтоли...

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

Попробуйте так:

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


int ms=16383;
char c;

int i,r;
int sensorPin;
int sec;
int sec1;

void setup() {
Serial.begin(115200); 
int sensorPin = A0;
lcd.begin(16, 4);
lcd.clear();

pinMode(10, OUTPUT); //выводы устанавливаюся в режим выхода
digitalWrite(10, LOW); //на выходе низкий уровень
pinMode(9, OUTPUT);
digitalWrite(9, LOW);
pinMode(8, OUTPUT); 
digitalWrite(10, LOW); 
sensorPin = A0;
sec=0;
sec1=0;
}

void loop() {
  r=1;
  while (r <= 5) {


// if (analogRead(sensorPin)==1023) {
// h=h*0,98;
//ms=ms*0,99;
// Serial.println(h); //выводим время задержки
    sec1=micros()/1000000;
    if (sec1>sec)
    {
      sec=sec1;
      Serial.println(ms); //выводим время задержки
// Serial.print(" ");
// Serial.print(analogRead(sensorPin));
//}
      lcd.setCursor(0, 1);
      lcd.print(ms);
      lcd.print("   ");
    }


    digitalWrite(8, LOW); //задаем активную обмотку
    digitalWrite(9, HIGH);
    digitalWrite(10, LOW);
// delay(h);
    delayMicroseconds(ms); //ждем h миллисекунд
    digitalWrite(8, LOW); //задаем активной следующую обмотку
    digitalWrite(9, LOW);
    digitalWrite(10, HIGH);
// delay(h);
    delayMicroseconds(ms);
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    digitalWrite(10, LOW);
// delay(h);
    delayMicroseconds(ms);
    r=r+1;
  }

  if (analogRead(sensorPin)>1000) {
    if (ms>5000) {
      ms = ms-500;
    }
    else {
      if (ms>10) {
        ms=ms-1;
      }
    }
  }

}

 

garmoska89
Offline
Зарегистрирован: 20.12.2011

 даите пожалуста ктота skype!

нужна неболшая обеснения проста у меня есть мотор с 3 и 4 контактами 

буду признателен

мой skype: garmoska89

lexa217
Offline
Зарегистрирован: 08.12.2012

Используйте для этого специальный контроллер, например с хоббикинга. http://www.hobbyking.com/hobbyking/store/__61__182__ESC_UBEC_VR-All_Spee...

они стоят не очень дорого и управляются как сервопривод.

etaon
Offline
Зарегистрирован: 16.12.2011

Касательно этих контроллеров. Есть у меня мотор бесколлекторный, авиамодельный на 30А. И есть к нему ESC как раз таки.

Мотор крутит так, что табуретки поднимает с пола :)

Однако, когда подключил этот контроллер к мотору HDD, то получил лишь подергивания. Мотор крутится, но оооочень медленно и шагами. Обороты не набирает таки. Даю мощность сильнее и он начинает сильнее клинить себя же. греется ооочень сильно.

На моторе HDD 4 провода. Минусовой провод тот, у которого сопротивление по отношению к остальным 3-м контактам одинаковое. Вычислил его так. Да и методом тыка тоже самое показало. Мотор вращается лишь в одном случае подключения контактов. Минусовой подключил на минус аккумуляторов. Другие 3 на контакты с модуля управления.

На видео в инете видел как у людей они на ура крутятся. Однако у меня такое не получилось :( Вращается медленно с рывками.

 

Простите, опечатался, мотор не сидирума, а HDD.

lexa217
Offline
Зарегистрирован: 08.12.2012

у меня от самолетного регуля отлично крутятся и сиюдки, и хдд и другие бесколлекторные моторы.

правда в сидиромах мне чаще попадаются движки, у которых три провода на обмотки - треугольником обычно соединены и четыре провода для трех датчиков хола.

если провода от обмоток соединены звездой, как Вы описываете, то советую соединить их треугольником, так проще будет скорость на них набрать большую.

DDL
Offline
Зарегистрирован: 17.10.2015

Всем здрасти) Сидел и ломал голову с запуском через L298N. Перепробовал все возможные програмные варианты(( двигатель запускался, дергался и жжужал но нормальной работы так и не добился. Пришлось подключить осцелограф и вот что я там увидел:

Выход с пинов Ардуинки

Выход с пинов Ардуинки

Выход с L298N

Выход с L298N

Скетч один и тот же. Просто перекинул щупы.

Вывод что на L298N движочек не запустится т.к маленькая рабочая частота у L298N драйвера да и по току он не совсем подходит сопротивление между обмотками 3.3Ом напр 12В      12/3.3=3.6А   а она до 2А.

А у L293d максимальный ток 1.2А

P.s Если где то ошибся то прошу поправить.