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.

PWM sterowane przez ADC w avr

21 Mar 2009 10:30 6007 20
  • Poziom 14  
    Witam mam pewien problem a mianowicie jak napisać program który będzie obsługiwał sygnał PWM (sterowanie silnikiem BLDC) więc nie więcej jak około 15 kHz sygnał PWM był by sterowany napięciem od 1.2 V do 4.2 V przy czym wypełnienie 0% było by przy napięciu <=1.1 V a 100% przy >= 4.2

    Sterowanie sygnałami BLDC to jest druga część programu dużo prostsza gdyż silnik ma czujniki hallotronowe i z tym sobie poradzę jednak wykorzystanie Wejścia ADC aby sterować PWM to ponad moje siły i dlatego proszę o pomoc.

    Czy zaprzęgnąć do tego 2 avr np atmega8 czy 1 wystarczy?

    schemat jak by to miało wyglądać rysowany na kartce w pośpiechu ale chyba idea jest zrozumiała.
    PWM sterowane przez ADC w avr
  • Pomocny post
    Poziom 19  
    W dokumentacji AVR znajdziesz jak skonfigurowac przetwornik AD, pozostaje wystartowac go i odczytac wartosc nastepnie przeliczyc ja na wartosc dla Timera(ktory zostal wczesniej skofigurowany jako PWM output.

    Przyklad dla atemag8 jak odczytac wartosc z ADC:
    ADMUX=0x67; //tu ustaw z ktorego wejscia itd..
    sbi(ADCSRA,ADSC);
    loop_until_bit_is_set(ADCSRA,ADSC);
    pomiar=ADCH;
  • Poziom 38  
    Wygląda na BLDC trójfazowy sterowany bipolarnie.
    Po co Ci 6 wyjść z procesora na bramki AND?
    Zamierzasz blokować poszczególne uzwojenia?
    To może nie być bezpieczne.
    15 kHz to nie za dużo?
    Po odczytaniu rejestru ADC będziesz musiał dokonać przeliczenia żeby dopasować do wartości wpisywanej do licznika.

    Dodano po 1 [minuty]:

    W czym piszesz?
  • Poziom 14  
    Póki co mam problem z pisaniem bo moja wiedza z prockami zatrzymała się na ustawianiu stanów logicznych na portach pisałem w c dawno temu a teraz potrzeba mi program co połączy PWM i ADC a z tego jestem zielony.

    Wybrałem avr bo taki mam programator a procek to raczej będzie Atmega8
    6 wyjść jak najbardziej jest potrzebne sterując silnikiem BLDC sterujesz zasilaniem i masą na różne uzwojenia poco mi bramka AND łączy PWM z procka z sygnałem z pinu jednocześnie program stanie się dużo mniej skomplikowany niż aby na każdym pinie był PWM programowo.

    Silnik na jeden obrót ma około 120 kroków czyli zakładając 10 obr. na s wyjdzie 1200 stanów więc 15 kHz moze faktycznie za dużo myślę żę 10kHz powinno wystarczyć co ty na to?
  • Poziom 38  
    A faktycznie, to przecież będzie ten sam PWM.
    Sam programator to trochę mało.
    Jaki programator?
    Jak pisałeś w C to pewnie masz WinAvr i AVRstudio.
    Ściągnij dokumentację do ATMega8 z Atmela.
  • Poziom 38  
    Jak już to proponuję ATMega88 gdyż jego maks. taktowanie to 20MHz. Mega8 z taktowaniem 16MHz może nie wystarczyć.
  • Pomocny post
    Poziom 38  
    "silnik bldc sterowanie"-wpisz w google.
    Pierwszy pdf A. Domoracki.
    Bo już się o swoją sklerozę zacząłem niepokoić.
    Jakie 120 kroki na obrót-to nie silnik krokowy.
    3x120 lub 6x60stopni na obrót-zależy od wybory metody sterowania.
    A PWM jako czoper.
    Przy 10obr/s dla 120 stopni i dla 10kHz PWM masz 3000 impulsów PWM na fazę.
    To aż za dużo.
    I zależy od indukcyjności uzwojeń.
  • Poziom 14  
    Tak to nie silnik krokowy chodziło mi o to że przy pełnym obrocie mam 120 sygnałów z hallotronów.

    Silnik ma 3 cewki żeby każda pracowało jak należy potrzebuje 6 tranzystorów przy czym na raz może pracować tylko 2.

    6 sygnałów z halotronów to jest jeden cykl działania cewek np raz jedna potem druga i trzecia takich powtórzeń mam na obrót 20 czyli na jeden obrót jedna cewka załączy się 20 razy. 20 razy 10 obrotów na sekundę mam 200 załączeń cewki na sekundę czyli 200 Hz masz rację pwm może być na poziomie 3-4kHz wtedy na jedną fazę będzie 20 impulsów pwm dobrze liczę?
  • Poziom 16  
    gmp napisał:

    ADMUX=0x67; //tu ustaw z ktorego wejscia itd..
    sbi(ADCSRA,ADSC);
    loop_until_bit_is_set(ADCSRA,ADSC);
    pomiar=ADCH;

    Cz aby na pewno loop_until_bit_is_set(ADCSRA,ADSC)? Chyba nie jeden się już przejechał na tych loop'ach.
  • Poziom 38  
    Zaczyna mi się to podobać.
    Przy pełnym obrocie masz 120 sygnałów z hallotronów.
    Co 3 stopnie.
    Cewki są 3.
    Czyli 360/9stopni=cewka dzielona na 40 sekcji.(?)
    Daj dane silnika, chyba sobie kupię coś takiego.
    Ale jakie obroty max?
    Może być więcej niż 1000.
    Jest takie coś jak AT90PWM-specjalnie do bldc.

    Dodano po 17 [minuty]:

    A z tym ADC to można sobie poradzić.
  • Poziom 14  
    Myślę że obroty max około 600 przy małym obciążeniu ale mam nadzieję że będzie minimum 500 Silnik do skutera 500W 48 V (1.44m obwód koła) zamierzam sterować nim poprzez IRF3710 i TLP250.
    a z tym ADC to chyba zacznę kombinować jak zlutuję układ ale nic nie stoi na przeszkodzie aby się tutaj rozpisywać i podawać propozycję jak to zrobić.

    mam pytanie jeszcze czy lepiej sterować silnik sygnałem pwm wszystkie tranzystory czy tylko dodatnie albo ujemne bo dużo by mi ułatwiło układ sterowanie tylko jednej parti. Płytka dużo mniejsza i mniej skomplikowana bo odpadnie jeden układ i plątanina ścieżek a miejsca mało mam.
    kolego janbernat widzę że w tych silnikach jesteś obeznany więc jak mi radzisz jakie mogą być skutki sterowania pwm. tylko na tranzystorach masy?

    Pozdrawiam.
  • Poziom 38  
    Nie jestem aż tak obeznany.
    Ale jakbym musiał to bym zrobił.
    Mogą być sterowane tylko na tranzystorach masy.
    Wtedy górne przez ten czas muszą być włączone.
    Albo odwrotnie.
    Albo oba(górne i dolne przez PWM)
    To zależy co chcesz uzyskać.
    W zasadzie sterowanie tylko na tranzystorach masy
    jest prostsze i jeśli dasz PWM o większej częstotliwości
    to da ten sam efekt.
    po co Ci transoptory TLP250?
    Chyba że wygodniej.

    Dodano po 1 [minuty]:

    A, już wiem.
    TLP250 daje dużo prądu na mosfeta.

    Dodano po 4 [minuty]:

    No i odpadają problemy z poziomem napięcia.

    Dodano po 5 [minuty]:

    A w czym będziesz pisał program?
    Ja to tylko Bascom, rejestry, zera i jedynki.
  • Poziom 14  
    Program najprawdopodobniej będzie w C ale nic pewnego zobaczymy jak pójdzie. Z tym TLP to akurat o poziomy napięć mi chodziło bo MOSFET-a i tak napięciowo się steruje a nie prądowo. Odnośnie PWM chciałbym sterować tylko tranzystorami masy tranzystory zasilania normalna faza bez PWM ale co rozumiesz poprzez zwiększenie częstotliwości PWM jeżeli PWM ma być tylko na tranzystorach masy?
  • Poziom 38  
    A przeczytałeś:
    "silnik bldc sterowanie"-wpisz w google.
    Pierwszy pdf A. Domoracki.
    Czas T-on i T-off przy sterowaniu tylko masowymi tranzystorami lub dolnym i górnym są różne.
    Z tą częstotliwością PWM jest tak że zależy ona od indukcyjności uzwojeń i napięcia zasilania.
    Wobit w sterowniku który sprzedaje ma aż 49kHz.
    To daje gwarancję że będzie chodził nawet z silnikami
    o małej indukcyjności uzwojeń.
    A ja o Twoim silniku nie wiem prawie nic.
  • Poziom 14  
    O moim silniku sam nie wiem prawie Nic bo rozebrać się nie da to znaczy da tylko 3 imbusy ujechałem na 5 śrubek zostało jeszcze 3 i niczym ich nie da rady ruszyć były czymś klejone jeszcze :( tylko tyle co na mim pisze na początku spróbuję PWM na poziomie 5K będę sterował tranzystorami tylko masy czytałem ten artykuł który przytoczyłeś ale chyba muszę go zgłębić bardziej. Jeżeli chodzi o sterowanie silnikiem polecacie zrobić pwm zależne także od prędkości silnika czy zależne od pobieranego prądu tak aby niebyło przeciążenia i nie popaliło czegoś razem z silnikiem?
  • Poziom 38  
    Ratunku...
    Rozkręcając silnik niczego się o nim nie dowiesz.
    Dobrze że ci się nie udało, bo byś szukał następnego.
    Może na obudowie ma coś napisane?
    Jakiś symbol- można poszukać w internecie.
    Zrób regulowany ogranicznik prądu.
    Prąd należy mierzyć szczytowy a nie średni.
    Tak robią sterowniki do bldc.
    Dlatego kosztują tyle ile kosztują.
    Ale czy ATMega zmierzy to tak szybko?
    Prędkość należy zmierzyć i ograniczyć do dopuszczalnej.
    Pisząc o silniku miałem na myśli orientacyjny pomiar indukcyjności uzwojenia za pomocą przyzwoitego oscyloskopu.
  • Poziom 14  
    Na silniku jest napisane 48V 500 W i tyle o nim wiem nie mam oscyloskopu i nie mam jak zmierzyć jego indukcyjności prąd jaki może pobierać maksymalny to od 25 A do 36 A bo takie mam 2 bezpieczniki ten 36 zaraz przy akumulatorze a 25 przed całą przyszłą elektroniką to jest maksymalny prąd jaki może popłynąć dla silnika o mocy 500 W przy 48V chyba nie bardzo zdrowy. z tym że procesor nie obliczy tego szubko to myślałem aby zwiększał swoje PWM biorąc pod uwagę manetkę i prędkość silnika gdyż wiadomo że jak silnik ma mniejsze obroty niż swoje nominalne przy danym napięciu to pobiera więcej prądu czyli przy starcie taki impuls o prądzie 26A może się pojawić gdyż rezystancja silnika podczas postoju wynosi około 0.5 Ohm zwiększa się wraz z obrotami silnika. Czyli bez regulacji PWM na pierwsze załączenie tranzystorów mogło by pójść jakieś 96 A a to o wiele za dużo niż jest potrzebne a najprostszy mechanizm będzie chyba jak układ będzie obliczał obroty prędkość koła i na tej podstawie zwiększał PWM. A do pomiaru prądu chyba zastosuję gdzieś zwykły amperomierz.
  • Poziom 38  
    Nie znam się na skuterach.
    Tylko na silnikach.
    Ale do bldc MUSIAŁ być jakiś sterownik.
  • Poziom 14  
    układ zlutowany już po małych przejściach 2 razy padły mi tranzystory ale mam nadzieję że to już się nie powtórzy.

    Mam natomiast problem z procesorem ATtiny26 dziwna sprawa bo na porcie A stan Zerowy czyli logiczne 0 wynosi około 2.5 V napięcie to jest niestety na pograniczu wykrywalności bramek NOR i układ wariuje na wyjściu podaje różne sygnały lub załącza 3 lub więcej tranzystorów itp.
    Port B zachowuje się prawidłowo.

    układ jest podłączony tak ....
    PWM sterowane przez ADC w avr

    wszystkie kondensatory obok procesora 100nF
    AVCC podłączone do VCC rezystorem 100 Ω
    rezystory które wychodzą na bramki NOR są po 1kΩ
    Aref podłączone do masy poprzez kondensator 100nF
    te różowe układy to PC817 zwierają porty do masy.
    Początkowo myślałem że może bramki NOR coś szwankują wyjąłem je został sam procek problem dalej pozostał na płytce nie ma żadnych zwarć sprawdzałem kilkakrotnie po wymianie procesora na inny problem dalej jest ten sam.

    Kod źródłowy to....

    Code:
    #include <avr/io.h>
    

    #define STAN_1 PORTA = 0x5E
    #define STAN_2 PORTA = 0x3E
    #define STAN_3 PORTA = 0x3D
    #define STAN_4 PORTA = 0x6D
    #define STAN_5 PORTA = 0x6B
    #define STAN_6 PORTA = 0x5B
    #define STAN_0 PORTA = 0xFF

    // Program główny
    int main(void)
    {
    // konfiguracja portów I/O
    DDRB = 0x08;
    DDRA = 0xFF;
    PORTB = 0x47;
    PORTA = 0x00;

    // Pętla nieskoczona
    while(1)
    {
      if( bit_is_set(PINB, PB0) && bit_is_clear(PINB, PB1) && bit_is_clear(PINB, PB2))        //011
      STAN_1;
      if( bit_is_set(PINB, PB0) && bit_is_clear(PINB, PB1) && bit_is_set(PINB, PB2))      //010
      STAN_2;
      if( bit_is_clear(PINB, PB0) && bit_is_clear(PINB, PB1) && bit_is_set(PINB, PB2))        //110
      STAN_3;
      if( bit_is_clear(PINB, PB0) && bit_is_set(PINB, PB1) && bit_is_set(PINB, PB2))      //100
      STAN_4;
      if( bit_is_clear(PINB, PB0) && bit_is_set(PINB, PB1) && bit_is_clear(PINB, PB2))        //101
      STAN_5;
      if( bit_is_set(PINB, PB0) && bit_is_set(PINB, PB1) && bit_is_clear(PINB, PB2))        //001
      STAN_6;
           else
           STAN_0;

    }// koniec pętli nieskończonej
    return 0;
    }


    Fusebity są oryginalnie ustawione nie zmieniałem ich.
    czy możliwe żeby źle skompilowało lub źle programował programator?

    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • Poziom 38  
    C nie znam, ale po każdym if daj opóźnienie np. 1s(musisz dołączyć jakąś bibliotekę) i wtedy zmierz napięcie na wyjściach procesora.
    Chyba że napięcia sprawdziłeś oscyloskopem.
    A druga sprawa to jakie mosfety.
    Takich zwykłych nie da się wysterować przy Ugs=5V -nawet jeśli zaczną przewodzić będą się grzać i palić.
    Za bramkami można dać sterowniki do mosfetów zasilane z 12V
  • Poziom 14  
    Wczoraj w nocy jeszcze sprawdzałem ale niemiałem sił pisać układ który zwiera piny procka do masy poprzez PC817 ma drgania dałem kondensatory 220 nF ale niewiele pomogło więc tą pętlę będę musiał zrobić ale opóźnienie rzędu 6 ms wejście zmieniać się będzie z max częstotliwością 530 Hz więcej nie przewiduję ( MOSFET-y są izolowane optycznie i sterowane 12 V) spróbuję napisać program z pętlą i napisze jak wyszło.

    Dodano po 2 [godziny] 43 [minuty]:

    pętla pomogla :) dzięki