Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterowanie silnikiem bezszczotkowym trójfazowym-Attiny2313

20 Kwi 2006 17:57 8040 6
  • Poziom 10  
    Witam!
    Chciałbym wysterować silnki z HDD (Spindle Motor). Sterowanie ma polegać na zmianie kierunku obrotu i prędkości obrotowej.
    Moje pytanie brzmi:
    Czy da się to zrobić z pomocą układu Attiny2313?
    Tam jest tylko jeden kanał PWM, a z tego co się orientuję to trzeba tych kanałów 6.
    Silnik jest trójfazowy i wymaga sterowania BLDC.
    Mam nadzieję ze nic nie namieszałem.
    Nie mam sprzężenia zwrotnego, chociaz przydało by się ale nie mogę uzyć enkoderów.
    Znalazłem taki schemat ale czy to będzie działać? Pozatym nie ma podanych wszystkich wartości elementów!
    Pozdrawiam
  • Poziom 35  
    Będzie działać.
    Na necie jest więcej schematów, niektóre mogą wyjść dużo tańsze w przygotowaniu (brak drogich driverów)

    PWM na każdym kanale nie jest Tobie potrzebny. Można to rozwiązać na dwa sposoby:

    Jeden PWM sterującymi wszystkimi wyjściami (a przynajmniej jedną stroną - górną lub dolną tranzystorów) - zużywasz dodatkowe wyjście i masz dodatkowo jeden/kilka tranzystorów (zależnie od konstrkcji)

    Drugie wyjście to stworzyć "programowy PWM", który będzie działał na dowolnej liczbie pinów.. dla Ciebie np. na sześciu.

    Jeżeli twój procesor ma zajmować się tylko sterowaniem silnika to rozwiązanie sprzętowe jest jak najbardziej ok.

    PS.Tutaj jako sprężenie zwrotne używasz tzw. "Back-EMF". Jest też możwliość zastosowania czujników halla przy silniku. Zaleta to duża niezawodność takiego rozwiązania i pewne działanie przy każdej prędkości obrotowej... wada to potrzeba przystosowania silnika - zamontowania czujników. Niektóre silniki mają czujniki halla, tylko musiałbys zobaczyć jakie to są czujniki i jak się do nich podpiąć...
  • Poziom 10  
    Dzięki za odpowiedź!
    Czujników hala mój silniczek nie ma, a motowanie w nim tych że czujników było by zbyt trudne no i znów dodatkowe koszta.

    Te sprężenie zwrotne tzw. "Back-EMF" to jest to od indukowania się w niezasilanym uzwojeniu napiecia tak? Dobrze myśle?

    1. Napisałem (a właściwie przepisałem) program który generuje PWM na jedną nóżkę, a teraz jak zrobić żeby pojawiło to się na 6ścciu pinach?

    A własciwie które rozwiązanie jest najprostrze dla takiego sterowania?
    Poniżej przedstawiam program napisany w C

    #include<avr/io.h>
    void czekaj (unsigned long zt)
    {
    #define tau 10.38
    unsigned char zt1;
    for (;zt>0;zt--)
    {
    for (zt1=255; zt1!=0;zt1--);
    }
    }
    int main (void)
    {
    unsigned char licznikkl=0; //zmienna wykorzystywana do pomiaru
    //czasu naciśnięcia przycisków
    char przyrost=20; //przyrost zmiany współczynnika
    //wypełnienia sygnału PWM
    union
    {
    unsigned int pwm;
    unsigned char pwmc[2];
    }volatile upwm; //aktualny współczynnik wypełnienia
    //sygn. PWM

    DDRB=0x08; //PB3 - wy (OC1 - wyjście PWM)
    //pozostałe we
    PORTB=0; //bez podciągania
    DDRD=0xfc; //PD1 i PD0 - we (obsługa klawiszy SW1
    //i SW4), pozostałe wy
    PORTD=0x03; //wejścia z podciąganiem (potrzebne dla
    //klawiatury)
    TCCR1A=0x83; //PWM 10 bitowy
    //zerowanie OC1 po spełnieniu warunku
    //równości podczas liczenia w górę,
    //ustawianie podczas liczenia w dół
    TCCR1B=0x03; //preskaler=3, co przy 10-bit PWM daje
    //Fwy=ok. 61Hz @8MHz
    TCNT1L=0x00; //wstępne ustawianie licznika1

    TCNT1H=0x00;
    upwm.pwm=0x3ff; //początkowo silnik włączony, wartość TOP
    //odpowiada wysokiemu poziomowi na
    //wyjściu OC1 (PB3)
    while(1) //główna pętla programu
    {
    if(bit_is_clear(PIND,1)) //czy wciśnięto SW4
    {
    upwm.pwm+=przyrost; //zwiększ pwm
    if(upwm.pwm>0x3ff)
    {
    upwm.pwm=0x3ff; //jeśli przekroczono wartość TOP, to
    //ustaw TOP
    }
    czekaj(15*tau); //eliminacja drgań i powtórnej
    //interpretacji naciśnięcia przycisku
    licznikkl++; //mierz długość naciśnięcia przycisku
    }
    else
    {
    if(bit_is_clear(PIND,0)) //czy wciśnieto SW1
    {
    upwm.pwm-=przyrost; //zmniejsz pwm
    if(upwm.pwm>0x3ff) //odpowiada to upwm.pwm<0
    {
    upwm.pwm=0; //jesli przekroczono wartość zero, to
    //ustaw zero
    }
    czekaj(15*tau); //eliminacja drgań i powtórnej
    //interpretacji naciśniecia przycisku
    licznikkl++; //mierz długość naciśnięcia przycisku
    }
    else
    {
    licznikkl=0; //zeruj licznik pomiaru czasu naciśnięcia
    //klawisza ponieważ wszystkie przyciski
    //są zwolnione
    przyrost=20; //ustaw początkową wartość przyrostu
    //dla pwm
    }
    }
    if(licznikkl>6)
    {
    przyrost=160; //wykryto długie naciśnięcie przycisków,
    //zwiększ krok regulacji
    licznikkl=60;
    }
    OCR1H=upwm.pwmc[1]; //wpisz aktualnie ustawiony współczynnik
    //do rejestrów
    OCR1L=upwm.pwmc[0]; //OCR1 timera1
    }
    }
  • Poziom 10  
    A coś do 2 A? Bo jeśli dobrze wyczytałem to jest tylko do 1A.
    Moje zastosowanie tych silników jest dośc nietypowe - mianowicie samochód zdalnie sterowany. Odrazu mówię że innych silników stosawać nie moge:) takie założenie pracy dyplomowej.

    Z pomiarow wynika że silnik ten pobiera do 1.5 A.
  • Poziom 20  
    etz257 napisał:
    Tam jest tylko jeden kanał PWM...
    ATtiny 2313 ma trzy kanały PWM. rtfm
  • Poziom 30  
    Mogę się mylić ale z tego co wiem to w silnikach BLDC prędkość obrotowa zeleży od częstotliwości...
    A w takim razie pwm nie jest konieczny...
    Natomiast ma prośbę do kolegów którzy mieli "do czynienia" z "Back-EMF" o informację jak się do rzeczy zabrać...
    Tak czytałem pdf ze strony atmela na ten temat ale interesuje mnie ja to ugryźć nie mając uC z dedykowanymi do tego peryferiami...