Запускаем трехфазный двигатель от HDD (контроллер бесколлекторного двигателя)

То о чем много спрашивают и никто толком не говорит. Разобрал жесткий диск, нарыл там двигатель интересной конструкции. Разобрать не получилось, да и особо не старался. Оказалось что есть такие двигатели, у которых три обмотки и которых необходимо как-то по особому питать чтобы они крутится начали.
В чем прелесть спросите?
Ответ: столько оборотов в минуту из известных мне двигателей дает только движок от формулы 1 :-)
Не зря трехфазные бесколлекторные двигатели нашли широкое применение в авиамоделизме.
Стандартный бесколлекторный двигатель выглядит примерно так:
бесколлекторный двигатель
Двигатели из CD-ROM/DVD-ROM приводов выглядят так:
бесколлекторный двигатель из CD-ROM
В интернете есть даже статьи по переделке бесколлеторного двигателя от CD-ROM для дальнейшего его применения в авиамоделизме.
В переделку обычно входят:
- перемотка другим проводом(тоньше или толще диаметром),
- изменение схемы намотки (звезда или треугольник),
- замена обычных магнитов на ниодимовые.
После чего трехфазный двигатель приобретает дополнительные обороты и мощность.

Я в эксперименте использовал обычный бесколлекторный двигатель от HDD привода, виглядит он так:
двигатель от HDD
Предварительно конечно лучше закрепить его на чем-то, я использовал корпус от того самого HDD привода.

Сам двигатель, который я использовал имеет четыре вывода, что говорит о том, что схема намотки у него в виде звезды с отводом от центра, то есть что-то примерно такое:
схема обмоток бексоллекторного двигателя

Схема управления простая, и состоит из не большого числа элементов. В виде управляющего устройства использован микроконтроллер ATmega8. Схема устройства показана на рисунке:
схема включения трехфазного бексоллекторного двигателя

В схеме использованы драйверы полевых транзисторов IR4427 и сами полевые транзисторы IRFZ44.
Управляющая программа была написана не мною, автор Дмитрий(Maktep) за что ему отдельное спасибо.
Как исключение программа написана на Си для CV-AVR.
ПРограмма транслирована под компилятор WIN GCC.
Частота кварца 8МГц, для устройств с связью по UART рекомендую использовать внешний кварц, так как при тактировании от внутреннего генератора могут появляться ошибки в виду его нестабильной работы при изменении температуры окружающей среды.

  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <stdio.h>
  4.  
  5. void USART_Init( unsigned int ubrr);
  6. void USART_Transmit( unsigned char data );
  7.  
  8. char status,data;
  9. char state;
  10. unsigned int lvl=65530/4;
  11.  
  12. // USART Receiver interrupt service routine
  13. ISR(USART_RXC_vect)
  14. {
  15. status=UCSRA;
  16. data=UDR;
  17. if (lvl<3000)
  18. { if (data=='+')
  19. lvl--;
  20. else
  21. if (data=='-')
  22. lvl++;}
  23. else
  24. {if (data=='+')
  25. lvl-=lvl/500;
  26. else
  27. if(data=='-')
  28. //if (lvl,/)
  29. lvl+=lvl/500;
  30. }
  31. }
  32.  
  33. // Timer1 output compare A interrupt service routine
  34. ISR(TIMER1_COMPA_vect)
  35. {
  36. switch (state)
  37. {
  38. case 0: PORTC=1; break;
  39. case 1: PORTC=3; break;
  40. case 2: PORTC=2; break;
  41. case 3: PORTC=6; break;
  42. case 4: PORTC=4; break;
  43. case 5: PORTC=5; break;
  44. }
  45.  
  46. if (state<5)
  47. state++;
  48. else
  49. state=0;
  50. }
  51.  
  52.  
  53. void USART_Init( unsigned int ubrr)
  54. {
  55. /* Set baud rate */
  56. UBRRH = (unsigned char)(ubrr>>8);
  57. UBRRL = (unsigned char)ubrr;
  58. /* Enable receiver and transmitter */
  59. UCSRB=(1<<RXEN)|(1<<TXEN);
  60. UCSRB |= (1<< RXCIE);
  61.  
  62. /* Set frame format: 8data, 2stop bit */
  63. UCSRC=0x86;//
  64. UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
  65. }
  66.  
  67. void USART_Transmit( unsigned char data ) //Ôóíêöèÿ îòïðàâêè äàííûõ
  68. {
  69. while ( !(UCSRA & (1<<UDRE)) ); //Îæèäàíèå îïóñòîøåíèÿ áóôåðà ïðèåìà
  70. UDR = data; //Íà÷àëî ïåðåäà÷è äàííûõ
  71. }
  72.  
  73.  
  74. int main(void)
  75. {
  76. PORTC=0x00;
  77. DDRC=0x07;
  78.  
  79. // Timer/Counter 1 initialization
  80. // Clock source: System Clock
  81. // Clock value: 8000,000 kHz
  82. // Mode: CTC top=OCR1A
  83. // OC1A output: Discon.
  84. // OC1B output: Discon.
  85. // Noise Canceler: Off
  86. // Input Capture on Falling Edge
  87. // Timer1 Overflow Interrupt: Off
  88. // Input Capture Interrupt: Off
  89. // Compare A Match Interrupt: On
  90. // Compare B Match Interrupt: Off
  91. TCCR1A=0x00;
  92. TCCR1B=0x09;
  93. TCNT1H=0x00;
  94. TCNT1L=0x00;
  95. ICR1H=0x00;
  96. ICR1L=0x00;
  97. OCR1AH=0xFF;
  98. OCR1AL=0xFF;
  99. OCR1BH=0x00;
  100. OCR1BL=0x00;
  101.  
  102. // Timer(s)/Counter(s) Interrupt(s) initialization
  103. TIMSK=0x10;
  104.  
  105. USART_Init (8);//28800 4MHz
  106. USART_Transmit('O');
  107. USART_Transmit('k');
  108. USART_Transmit('!');
  109.  
  110. USART_Transmit(0x0d);
  111. USART_Transmit(0x0a);
  112.  
  113. // Global enable interrupts
  114. sei();
  115.  
  116. while (1)
  117. {
  118. OCR1A=lvl;
  119. };
  120. }

Скачать проект Win AVR

Алгоритм работы построен так, что при нажатии на клавиатуре кнопки "+" передается по UART в микроконтроллер, который увеличивает скорость коммутации обмоток. И при нажатии на кнопку "-" все выполняется наоборот, то есть обороты двигателя уменьшаются. Для работы устройства дополнительно понадобится UART-RS232 конвертер.

Эксперимент показал что при данной программе и данной схеме включения можно разогнать двигатель до приличных оборотов, точное число не известно, думаю в пределах 30 000 оборотов в минуту. Но к сожалению сила двигателя недостаточная для раскручивания пластикового пропеллера, верней с пропеллером двигатель набирает обороты, но при нагрузке происходит сбой и остановка двигателя.
Для избежания данного недостатка применяются датчики Холла, устройства контролирующие положение ротора бесколлекторного двигателя. Это сделано для того, чтобы импульс на обмотку двигателя подавать именно в тот момент когда ротор проходит конец обмотки, то есть для смещения момента силы ближе к концу прохождения сектора обмотки. Это даст прирост мощности двигателя и он не будет глохнуть при нагрузках.

Видео работы устройства:

В видеоролике показано как я закрепил два кусочка пластика вырезанных из телефонной карточки в виде лепестка и прикрученных к ротору двигателя.

В планах попробовать применить ШИМ для коммутации обмоток. Рассчитываю на повышение мощности, улучшение характеристик разгона двигателя (в частности скорости разгона), повышение КПД.

---

Плз скажите какое сопротивление обмотки вашего двигателя и какой мощности БП?

Я так и не скажу точно, БП у

Я так и не скажу точно, БП у меня был 1,2 Ампера выдавал ток максимум.
Мосфеты на радиаторе грелись хорошо :-)

Открыть дисковод

А как с помощью ассемблера открыть дисковод? Уже несколько месяцев роюсь в интернете, но никак не могу найти дескриптор дисковода и сигналы, которые им надо отсылать для открытия. Ассемлбер знаю немного, но знаний устройства дисковода не хватает. smiledforyou@gmail.com

Мощные бесколлекторники (в

Мощные бесколлекторники (в моделизме )включаются без датчика Холла, кроме того двиг подключен без средней точки (наверное треугольник ) Управление, видимо, через измерение ЭДС на индуктивностях.
Есть ли у вас мысли об особенностях такого проекта на меге?
Встречалось что-то подобное в сети??

По идее обмотки подключаются 3-мя полумостами полевиков, 3 АЦП по входам движка, а вот как этим добром управлять - большая головная боль.

Ага, в интернете много таких

Ага, в интернете много таких схем. Только проблема, сами схемы сложноватые и программы все с закрытым кодом. Все коммерческое.

Почему не использовали L293

Почему не использовали L293 вместо контроллеров полевиков и самих полевых транзисторов? Ведь лучше две микросхемы вместо четырёх

Драйвер - устройство

Драйвер - устройство повышающее ток для уменьшения потерь переключения полевого транзистора.
Потери при переключении это все мощность толчка при раскручивании двигателя, а мощность толчка это обороты, тяга и тд. тп. Микросхема L293 с её сумасшедшим нагревом просто не сможет отдать такую мощность в нагрузку как полевик. Верней сможет но ток надо будет дать 10Ампер)))

Микросхем не 4-ре, про IR4427 читаем внимательней в следующий раз.

Комментарии к статье

"Эксперимент показал что при данной программе и данной схеме включения можно разогнать двигатель до приличных оборотов, точное число не известно, думаю в пределах 30 000 оборотов в минуту."

Обороты можно замерить обычным оптическим датчиком или тем же холлом, если хочется наворотов.

Подпрограмма изменения скорости использует какие то хитрые цифры, которые никак не прокомментированы.

Есть бесколлекторник от пятидюймового дисковода.
К нему, кстати, еще прилагается контроллер и там 3 датчика холла стоят.
Разобрать мне его не удалось, видимо за более чем 10 лет там произошла диффузия металлов и все болты приросли к корпусу, а ломать и сверлить не охота. На вид он почти на порядок больше обычных движков от оптических приводов.
Можно как то определить, до каких пределов его можно разогнать и какую нагрузку он потянет? Или только опытным путём?

Разобрать мне его не удалось

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

Что именно ты раскручивал?

Что именно ты раскручивал? Сам двигатель?

Какие именно цифры

Какие именно цифры смущают?

По поводу дисковода 5,25 дюйма хочу сказать что разбирал такой. В моем стояла микросхема Mitsubishi большая такая выводов на 40. Нашел так же датчики Холла, они были под металлическим диском, который тебе не удалось открутить. Обмоток там 9 было, запустить не пробовал, зато запускал почти такой же но от дисковода 3,5 дюйма. Скорости большой не получилось, так как масса шпинделя который пришлось раскручивать оказалось слишком большой. Так сыграло то, что сам двигатель не имеет как такового корпуса, только сердечник, который крепится к плате через металлические шайбы и диск который раскручивается и приводит в в движение магнитный диск в дискете.

например

например 65530, 4, 3000, 500

Мотор от дисковода удалось запустить реверс-инжинирингом платы и поиском даташита на микросхему. Да, скорость небольшая, но тяга у него приличная. Двумя пальцами надо хвататься, что б затормозить, одним не получается или нужно приложить значительное усилие. Буду думать, куда такой применить.

А где логика работы и

А где логика работы и диаграммы для запуска двигателя?

Не все сразу, про сам

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

А с такой схемой, двигатель

А с такой схемой, двигатель входит в синхронность? А то читал, что нужно использовать либо датчик холла, либо снимать эдс, с соседних обмоток.

Я так понял вопрос если

Я так понял вопрос если перефразировать должен звучать так: "Датчики Холла для чего, и почему их нет в данной схеме?"

Датчики Холла ставят для отслеживания момента, когда необходимо подать коммутирующий сигнал для получения максимума приложенной силы, по сути для того, чтобы при разгоне двигателя да и при штатной работе он не остановился из-за повышения нагрузки. Например устройство по данной схеме если разогнать хорошо потом взять сам корпус и покрутить в разные стороны относительно горизонта, то двигатель просто остановится. Так же датчики Холла помогут разогнать двигатель до большего числа оборотов чем без них. Как видно в конце видео происходит срыв генерации и остановка двигателя, если бы были датчики думаю что можно было бы еще на пару тысяч оборотов больше получить.

Что-то все на Си да на Си...

Что-то все на Си да на Си... я тут на Асм перевёл сию прошивку. Должен сказать ,
что выигрыш в половине кода, уже не 470 байт, а 240 ))))

.include"m16def.inc" ; подключили мега 16
;========================== определения ===========
.def Temp = r16
.def Temp2 = r17
.def count = r18
.def XL_HIGH = r19
.def XH_HIGH = r20
.include"macro.inc"
.dseg
data: .byte 2
;=========================== сегмент программы ====
.cseg
; ************************ INTERRUPT VECTORS *********
.org 0x0000
jmp reset
.org OC1Aaddr ; Timer/Counter1 Compare Match A
jmp OC1A_INT
.org URXCaddr ; USART, Rx Complete
jmp URXC_INT
;==================================================
reset:
mega_stack ; stack pointer set
outi ACSR,(1< ;=========================== иницилизация =========
ldi XH,$ff
ldi XL,$fb
ldi count,$00
ldi Temp, $01
sts data,XL
sts data+1,XH
;=========================== Usart INIT ==================
USART_init 9600,10000000 ; baudrate 9600, Xtal 10 MHz
OUTI UCSRB, (1< ;=========================== 16bit_timer init ============
outi TCCR1A,0b00000000
outi TIMSK, 0b00010000 ; output compare_A match interrupt enable
outi TIFR,$FF ; стираем флаги единицами !
/*
outi ddrd, 0b00000111
outi portd, 0b00000001
*/
outi ddra,$ff
outi porta,$00

outi ddrb,$ff
outi portb,$00

outi ddrc, 0b00000111
outi portc,0b00000000

outi OCR1AH,$ff
outi OCR1AL,$fb
// запускаем таймер
outi TCCR1B,0b00001001 ; normal mode, OC1A,OC1B disconected
sei
;=========================== программа ======================
main:
brtc main
lds Temp,data+1
out OCR1AH,Temp
lds Temp,data
out OCR1AL,Temp
clt
jmp main
;========================== подпрограммы ===============
;============================= прерывания ==============
OC1A_INT:
set
in Temp,portc
cpi Temp,0b00000001
breq a
cpi Temp,0b00000011
breq b
cpi Temp,0b00000010
breq c
cpi Temp,0b00000110
breq d
cpi Temp,0b00000100
breq e
cpi Temp,0b00000101
breq f
a:
outi portc,0b00000011
rjmp getout
b:
outi portc,0b00000010
rjmp getout
c:
outi portc,0b00000110
rjmp getout
d:
outi portc,0b00000100
rjmp getout
e:
outi portc,0b00000101
rjmp getout
f:
outi portc,0b00000001
getout:
reti

URXC_INT:

in Temp,UDR
cpi Temp,'+' ; если плюс , добавляем времени
breq add_tcnt
cpi Temp,'-' ; если минусб убираем время
breq sub_tcnt
jmp exit ; ничего нет - выходим

sub_tcnt:

ADIW X,30 ; увеличиваем таймер на один и пишем в переменную
sts data,XL
sts data+1,XH

jmp exit

add_tcnt:

SBIW X,30 ; уменьшаем таймер на один и пишем в переменную
sts data,XL
sts data+1,XH
jmp exit

exit: ; выходим
reti