logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Sterowanie silnikiem BLDC z dysku twardego 5400 obr/min - Atmega8, BS170, kod ASM

chszanek 12 Lut 2006 16:34 8581 15
  • #1 2293718
    chszanek
    Poziom 13  
    Posty: 122
    Pomógł: 5
    Ocena: 9
    Witam.
    Chciałbym zrobić sterownik do takiego silnika , wydaje mi się że jest to silnik BLDC (prądu stałego z magnesami trwałymi) jednak można go sterować jak zwykły krokowy(bo już próbowałem). Jednak mam problem układ który poniżej przedstawiam nie chce ziałać poprawnie tzn silnik się nie kręci bez wyraźnego powodu. Czy mógłby ktoś wyjaśnić mi dlaczego nie.

    Zdaję sobie sprawę że podobne posty były więc w razie czego zamknę temat.

    Składa się z:
    - Atmega8
    - BS170
    - rezystorki
    Moim zdaniem (czyli wątpliwe;) ) to powinno działać.
    Pobniżej przedstawiam kod programu . Może coś robie źle Sad , już sam nie wiem(napisaem 2 programy w C i w ASM).


    ASM

    
    INCLUDE "m8def.inc"
    
    .EQU SYS_FREQ = 1 ;CZESTOTLIWOSC ZEGARA PROCKA [ MHZ ]
    .EQU xx = 1
    
    
    Set_Port_B_As_Output:
    
          ldi R16 ,0xFF
          out DDRB , R16
    
    rjmp FORWARD
    
    walkDelay:
       ldi R18, 1         ;T1 used as delay 2nd count
       ldi R19, 1         ;T2 used as delay 3nd count
    delay_1:
       dec R18
       brne delay_1
       dec R19
       brne delay_1
       dec R20          ;temp must be preset as
       brne delay_1          ; delay master count
       ret
             
    
    FORWARD:                     ; OBROT DO PRZODU
       
          ldi R16 , 0b10000011
          out PORTB , R16
          ldi   R20, xx
          rcall walkDelay
    
          ldi R16 , 0b01000101
          out PORTB , R16
          ldi   R20, xx   
          rcall walkDelay
    
          ldi R16 , 0b00101001
          out PORTB , R16
          ldi   R20, xx
          rcall walkDelay
    
    
          RJMP PETLA
    
    BACKWARD:                     ; OBROT DO TYLU
       
          ldi R16 , 0b00111111
          out PORTB , R16
    
       
          ldi R16 , 0b01011111
          out PORTB , R16
    
          ldi R16 , 0b10010111
          out PORTB , R16
          
          RJMP PETLA
    
    STOP:                        ;ZATRZYMANIE SILNIKA
          ldi R16 , 0b00001111
          out PORTB , R16   
    
    
          LDI R16 , 0b00000001
          out PORTB , R16
                   
          
    PETLA:
       
          rjmp FORWARD
       
       rjmp PETLA
    
    
    ;Set_Port_B_Output
    ;Put_On_PORTB 
    


    C

    
    
    #include <avr/io.h>
    #define F_CPU 1000000                        //do określenia częstotliwości procka dla "delay"
    #include <avr/delay.h>
    #include <math.h>
    
    #define LED_ON PORTB|=(1<<PB0)                  //PORTB|=1<<PB1 - wysyła "1" na wyjście portu
    #define LED_OFF PORTB&=(~1<<PB0)
    #define CONTROL_LED_ON PORTD|=(1<PD0)
    #define CONTROL_LED_OFF PORTD&=(~1<PD0)
    
    void init_port(void)
       {
       DDRB = 0xff;
       PORTB = 0x00;
       }
       
    void FORWARD(int czas)
       {
    //   PORTB&=0b10000001;
    //   _delay_ms(czas);
    //   PORTB&=0b01000010;
    //   _delay_ms(czas);
    //   PORTB&=0b00100100;
    //   _delay_ms(czas);
       PORTB|=(1<<PB7);
       PORTB&=(0<<PB6);
       PORTB&=(0<<PB5);
       _delay_ms(czas);
       
       PORTB&=(0<<PB7);
       PORTB|=(1<<PB6);
       PORTB&=(0<<PB5);
       _delay_ms(czas);
       
       PORTB&=(0<<PB7);
       PORTB&=(0<<PB6);
       PORTB|=(1<<PB5);
       _delay_ms(czas);
       
       }
    
    void STOP(int czas)
       {
       if (czas <= 20)
          {
          PORTB&=0b11100111;
          _delay_ms(czas);
          }
       }
    
    int main(void)
    {
       init_port();
       for(;;)
          {
          FORWARD(10);
          }
       return 0;
    }
    
    
    Załączniki:
    • Sterowanie silnikiem BLDC z dysku twardego 5400 obr/min - Atmega8, BS170, kod ASM 1.jpg (55.12 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #2 2293740
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    A skad wiesz czy to jest na 100% silnik 3fazowy? Czy jak uruchomisz program to chociaż czuć przy obracaniu ręką miejsca w których trzyma "mocniej"?
  • #3 2293777
    Coyote~
    Poziom 20  
    Posty: 345
    Pomógł: 24
    Ocena: 3
    elektryku, sugerujesz, że to krokowy? Również posiadam silnik z HDD o takiej samej prędkości obrotowej. Chodzi lekko i gładko - nigdzie nie trzyma 'mocniej'. Ma 4 wyprowadzenia (A, B, C, Com) i daje się wysterować na prostym sterowniczku 3f...
  • #4 2293904
    bogdan_p
    Poziom 39  
    Posty: 3849
    Pomógł: 525
    Ocena: 120
    jeżeli silnik pochodzi z dysku twardego to napewno jest to BLDC
    sterownie takim silnikiem wymaga sygnału 3fazowego o pełnym kształcie w Twoim przypadku jest to niemożliwe , zobacz sobie stopień mocy i sposób sterownia na przykładzie specjalistycznego układu TDA 5140A
    http://www.elenota.pl/search.php?szuk=tda5140a&man=--wszyscy--&ile=50&start=0
    zobacz również to http://alexrc.com/ipw-web/bulletin/bb/viewforum.php?f=8&sid=d55623d7a43936251b3c578a2e3d3006
  • #5 2295082
    chszanek
    Poziom 13  
    Posty: 122
    Pomógł: 5
    Ocena: 9
    Witam.
    Masz rację co do tego silnika BLDC jednak można go wysterować jak krokowy (zrobiłem wcześniej układ na tranzustorach Bc107 ale niestety były za słabe i się strasznie grzały , szybko przepalały , jednak sinik się obracał) oczywiście zdaję sobie sprawę że nie osiągnie on pełnych obrotów oraz momentu. Bardziej intryguje mnie to : czemu podany układ nie chce działać , nie ma najmniejszego drgania silnika (jakby napięcie nie pojawiało się na silniku) .

    poniżej narysowałem jak ja to widze (rys 1):
    - jak włącze "W" popłynie prąd który odepchnie S a przyciągnie N (dla jakiejś z faz ) , to czy N czy S to już bez różnicy(czyste zalożenie) .
    Oczywiście żeby uzyskać większy moment musiałbym na fazę (przy pbiegunie S) dać przeciwne napięcie ale wtedy się robi skomplikowany układ

    więc na tej zasadzie chciałbym kręcić silnikiem. Tylko te Tranzystoru mos nie działają :( .

    poniżej parę info jak powinno wyglądać wszystko w sterowaniu silnikiem BLDC:
    ( rys 2 3 4 )
    Załączniki:
    • Sterowanie silnikiem BLDC z dysku twardego 5400 obr/min - Atmega8, BS170, kod ASM 5.JPG (51.21 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Sterowanie silnikiem BLDC z dysku twardego 5400 obr/min - Atmega8, BS170, kod ASM 4.JPG (21.87 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Sterowanie silnikiem BLDC z dysku twardego 5400 obr/min - Atmega8, BS170, kod ASM 3.JPG (39.47 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • Sterowanie silnikiem BLDC z dysku twardego 5400 obr/min - Atmega8, BS170, kod ASM 2.JPG (16.85 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 2295158
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Jaki dajesz opóźnienie przy pomiędzy przełączeniem i czy robisz wogule rozbieg...?.?.?
    Silnik BLDC, 3f bez rozbiegu nie ruszy...
    Ważna jest też sekwencja przełączania...
    Przy błędnej też będzie silnik działał ale będzie szybko się gubił i miał słaby moment...
    Przebieg prostokątny, oczywiście zmienny przesunięty o 1/3 (180st) powinien wystarczyć...
    Ale musi byc rozbieg...
    Scalone sterowniki do BLDC mają wbudowany układ startu...
    Np. podany wyżej TDA5140A...
  • #7 2295882
    chszanek
    Poziom 13  
    Posty: 122
    Pomógł: 5
    Ocena: 9
    Witam.

    No niestety nie zrobiłem rozbiegu (kod napisałem w poprzednim poście) :( , spróbuję .

    Najpier jednak muszę rozwiązać "banalny"* problem (jak już pisałem w poprzednim poście) :

    -- czemu nie mogę wysterować TYCH TRANZYSTORÓW BS170

    pdf do nich jest na :
    http://www.datasheetcatalog.com/datasheets_pdf/B/S/1/7/BS170.shtml

    pozdrawiam.


    * - nie dla mnie :(
  • #8 2296436
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Witam...

    Schemat z rys.4 jest ok...
    Jeśli jest jeszcze środek wyprowadzony to można go wykożystać w kontroli obrotów...
    Przyglądnij się wykresowi zależności prądu od napięcia bramki...
    Z tego co widziałem to piwinieneś wysterować te mosy wyższym napięciem niż zasilanie...
    Nie wiem przy jakim prądzie pracuje ten silnik...
    Na schemacie masz wszystkie mosy z kanałem N więc napewno górne muszą być sterowane wyższym...
    Może się okazać, że dolne nie koniecznie...
    Jak by coś to mam prosty programik na atmega16 do sterowania silnikiem 3f...
    Obejmuje rozbieg i sterowanie częstotliwością (obrotami) na dwóch przyciskach...
    Przy silniku ze zwykłymi magnesami i orginalnym uzwojeniem może być konieczne dobranie organoleptycznie opóźnienia dla rozbiegu...
  • #9 2297985
    bogdan_p
    Poziom 39  
    Posty: 3849
    Pomógł: 525
    Ocena: 120
    podałem Ci wczesniej stonę Alexa , zobacz dokładnie wszystko o co pytasz jest , masz temat w którym jest wszystko o regulatorze od pomysłu po realizację , ponadto na forum znajdziesz linki do innych projektów http://alexrc.com/ipw-web/bulletin/bb/viewtopic.php?t=972&start=0
    stopień mocy z jednym tranzystorem nic Ci nie da musisz mieć pare , przy jednym tranzystorze otrzymujesz tylko dodatnią połówkę a co z ujemną ?
  • #10 2299601
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Witam...

    To ja mam pytanie na które nie mogę znaleźć odpowiedzi ani na forum alexa ani na google...
    O co chodzi z tym kątem wyprzedzenia w silniku 3f...?.?.?
    Tzn. czym jest kąt wyprzedzenia w tym przypadku...?.?.?
    Chodzi może o to, że wykrywamy położenie wirnika (magnesów) i przęłacznie uzwojeń następuje o określony czas wcześniej (czyli kąt) zanim magnes pokryje się z biegunem stojana...?.?.?
  • #11 2299860
    Coyote~
    Poziom 20  
    Posty: 345
    Pomógł: 24
    Ocena: 3
    Chyba chodzi o to, jaki musi być kąt pomiędzy osią magnetyczną cewki statora a osią magnesu - przy odpowiednim kącie po załączeniu cewki powinno się uzyskać optymalną siłę działającą na optymalnej drodze (kącie obrotu) i w ten sposób uzyskać maksymalny przekaz mocy na rotor... Tak mi się przynajmniej wydaje...


    Poza tym sterownik kolegi chszanka wygląda poprawnie - kolega steruje 'unipolarnie', powinno się kręcić. Może faktycznie problem tkwi w wysterowaniu tranzystorów - powinny działać na pewno przy 3V na bramce, dostają 5V (albo nie dostają - radzę to zmierzyć)... Może są walnięte, może piny procka szlag trafił... Oporniki też można zmierzyć na wszelki wypadek ;)...
  • #12 2300125
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Zastanawiam się jak bez hallotronów wykryć położenie wirnika...
    Mam znaleziony na necie schemat...
    To właśnie ten http://www.pubus.neostrada.pl/2m%20cyclone%20mini%20-%20schematic.gif...
    Nie wstawiam jako obraz bo to spory arkusz...
    W tym przypadku sygnał brany jest z wyjść na uzwojenia i podawany na trzy wzm. operacyjne...
    Sprawa wygląda na pozór prosto ale nie moge dojść na jakiej zasadzie to działa...
    Jak bym wiedział czego tam szukać to już można wtedy kombinować...
    Niestety nie wiem kto jest autorem tego pomysłu...
  • #13 2300478
    MirekCz
    Poziom 35  
    Posty: 2220
    Pomógł: 330
    Ocena: 62
    Na uzwojeniu generuje się siła EMF, sledząc przebieg tej siły (a dokładnie miejsce jej przejścia przez "0") wiemy kiedy należy zmienić sterowanie uzwojeń.

    Rozwiązanie to ma jednak kilka problemów, najpoważniejszy z nich to brak informacji zwrotnej przy małych prędkościach, ponieważ wtedy generowany prąd jest zbyt mały.

    Częściowo problem się rozwiązuje poprzez rozpoczęcia od "procedury startującej", która rozkręca silnik i dopiero jak sygnał EMF jest silny przechodzi w "automatyczne" sterowanie uzwojeniami.
    Bardzo dobrze to działa w zastosowaniach typu sterowanie śmigłem samolotu.

    Zupełnie się nie sprawdza gdy potrzebujesz dokładnego pozycjonowania czy równomiernie rozłożonego momentu w szerokim zakresie obrotów.

    Na necie można znależć wiele dokładnych opisów tego zjawiska. Zdaje się, że na stronie microchipa (www.microchip.com) jest niezły artykuł o tym (zresztą kilka, wejdź i poszukaj dokumentacji o brushless motor control)
  • #15 2300786
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Witam...

    Wielkie dzięki Panowie za info...
    Faktycznie chodzi o wykrywanie EMF...
    Postaram się zgłębić tą tajemną wiedzę... ;)

    Pozdrawiam Rafał...
  • #16 2891843
    chszanek
    Poziom 13  
    Posty: 122
    Pomógł: 5
    Ocena: 9
    witam.
    problem rozwiązany wielkie dzieki za pomoc.
    pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy sterowania silnikiem BLDC pochodzącym z dysku twardego o prędkości 5400 obr/min za pomocą mikrokontrolera Atmega8 i tranzystorów BS170, z kodem w asemblerze. Silnik jest potwierdzony jako BLDC, jednak autor próbował sterować go jak silnik krokowy, co powodowało problemy z rozruchem i brakiem ruchu. Wskazano, że sterowanie silnikiem BLDC wymaga sygnału trójfazowego o odpowiedniej sekwencji i rozruchu (rozbiegu), którego brakowało w implementacji. Zwrócono uwagę, że pojedynczy tranzystor BS170 nie wystarczy do pełnego sterowania, gdyż potrzebne jest sterowanie zarówno dodatnią, jak i ujemną połówką sygnału. Dyskutowano również o konieczności wyższych napięć bramki MOSFET-ów oraz o problemach z wykrywaniem położenia wirnika bez czujników Halla, proponując wykorzystanie pomiaru siły elektromotorycznej (EMF) na uzwojeniach silnika. Podano linki do not aplikacyjnych i przykładów sterowników, m.in. układu TDA5140A oraz dokumentacji AVR444 od Atmela, zawierającej kod w C do sterowania silnikiem BLDC. Ostatecznie autor potwierdził rozwiązanie problemu po zastosowaniu wskazówek dotyczących rozruchu i sterowania tranzystorami.
Wygenerowane przez model językowy.
REKLAMA