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

Silnik krokowy-jak wykonać zadaną ilość kroków.

28 Wrz 2009 21:57 3382 17
  • Poziom 17  
    Panowie chce zrobić sterownik silnika krokowego który przesuwał by się o daną ilość kroków w zależności od ilości impulsów T0 czyli T0=100 nierób nic , T0 = 120 wykonaj 20kroków w prawo , T0 = 150 wykonaj 30 kroków w prawo , T0 = 110 wykonaj 40 kroków w lewo sterowanie odbywa się p0.0-p0.3 chodzi mi w jaki sposób to wykonać bo myślałem to wykonać na pętli for-next ale za każdym cyklem zegarowym będzie obracał wał silnika o zapisaną wartość a mi chodzi oto by wykonał to raz i czekał na zmianę T0 pracując w pętli DO-LOOP i wykonywał inne zadane funkcje z góry dziękuję .

    Poprawiłem tytuł.
    [zumek]
  • Sklep HeluKabel
  • Poziom 43  
    No to daj zmienną pomocniczą.
    Coś takiego:
    Code:

    Do
      If T0 > T0_pomocnicze Then
          T0_pomocnicze = T0_pomocnicze + 1
          Jeden_krok_w_prawo
      End If

      If T0 < T0_pomocnicze Then
          T0_pomocnicze = T0_pomocnicze - 1
          Jeden_krok_w_lewo
      End If
    Loop

  • Poziom 17  
    atomm dzięki w moim programiku jest tak ze obroty w prawo lub w lewo to dwa oddzielne pod programy które wywołuje je poleceniem gosub
    myślisz ze jak zamknę je w pętlach FOR NEXT i zamiast cyfry po TO zastosuje zmienną i będę dodawał lub odejmował to zadziała czy źle rozumuje
  • Sklep HeluKabel
  • Poziom 43  
    Ale tutaj nie ma pętli For Next.
    Te Twoje procedury zawsze kręcą o jeden krok czy można ustawić o ile kroków maja obkręcić?

    Dodano po 5 [minuty]:

    A, chyba rozumiem. Chcesz od razu załatwić obrót o kilka kroków w jednym obiegu pętli?

    PS. Ten mój przykład nie zadziała dla przypadku gdy zmienne będą przekręcały się.
    Żeby to działało dla takich przypadków trzeba zamiast:
    Code:

    If T0 > T0_pomocnicze Then
    ...


    zastosować:
    Code:

    i = T0 - T0_pomocnicze
    If (i > 0) And (i < 127) Then
    ...

    Mniej więcej.
  • Poziom 17  
    kręcą o cztery kroki a dokładnie tak:
    PRAWE:
    L1=1 : L2=0 : L3=0 : L4=0
    L1=0 : L2=1 : L3=0 : L4=0
    L1=0 : L2=0 : L3=1 : L4=0
    L1=0 : L2=0 : L3=0 : L4=1
    RETURN
    względnie mogę użyć L297 i wtedy na jednym pinie portu 0 lub 1 zależy od prawe czy lewe na drugim ilość kroków bo zegar bym mógł zrealizować na 555

    Dodano po 2 [minuty]:

    PRAWE:
    L1=1 : L2=0 : L3=0 : L4=0
    waitms 10
    L1=0 : L2=1 : L3=0 : L4=0
    waitms 10
    L1=0 : L2=0 : L3=1 : L4=0
    waitms 10
    L1=0 : L2=0 : L3=0 : L4=1
    waitms 10
    RETURN
  • Poziom 43  
    Czyli jedno wywołanie to taki jeden mały krok (w zasadzie 4 ale już tego nie rozbijesz na mniejsze przy takiej wersji programu)?
    Czyli ten mój pierwszy przykład będzie najlepszy.
    A to "T0" to jakaś zmienna jest?
    Mi to się kojarzy z Timerem, ale nie wiem. Z opisu wynika że to coś jak zmienna.
    Jak masz wartość 250 i zwiększysz do 254 to ma wykonać 4 kroki, no nie.
    A jak z 254 przekręci się do 3, to też mają być 4 kroki? Czy jak?
    A może to jakaś dłuższa zmienna (więc przewijanie będzie np. przy 65535)?
  • Poziom 17  
    T0 to jak dobrze się domyśliłeś to TIMER 0 który liczy impulsy skonfigurowany tak:
    Config Timer0 = Counter , Gate = Interial , Mode = 2
    chętnie przyjmę sugestie co do ustawienia a ma tylko liczyć impulsy zmienna
    Dim wynik As Word
    Wynik = Counter0
  • Poziom 43  
    Czyli jak częstotliwość będzie stała to silnik ma stać w miejscu?
    Jak zwiększysz częstotliwość to ma pokręcić się trochę w prawo i zatrzymać?
    A jak zmniejszysz to w lewo i po chwili tez zatrzymać?
    Przeszło mi tp przez myśl, ale ie sądziłem że o to Ci właśnie chodzi.

    Wynik = Counter0 musisz umieścić w jakimś miejscu gdzie program zagląda regularnie. Np. w przerwaniu od T1.
  • Poziom 17  
    a co do projektu to ma być to sterownik do lpg 2 generacji w samochodzie obecnie mam taki co reaguje tylko na sonde zbyt długi czas reakcji na skład mieszanki i chce by sterownik reagował na to czy został naciśnięty pedał gazu i na obroty i nie umiem poradzić sobie z tym by uzależnić przesunięcia się krokowca względem obrotów da się te moje podprogramy zamknąć w jakiej zmiennej ???

    Dodano po 4 [minuty]:

    Wynik = Counter0 to mam w pętli programu DO -LOOP tuz przed :
    Cls
    Lcd "rpm:" ; Wynik ; " obr/min "
  • Poziom 43  
    To niedobrze. Zależnie od zawartości zmiennej Wynik, czas konwersji tej zmiennej na text będzie różny a tym samym pobieranie zawartości Timera0 będzie następowało w różnych odstępach czasu.
    Czyli nawet dla stałej częstotliwości będziesz miał różną zawartość T0.

    Poza tym: jeżeli to ma się ustawiać w różnych pozycjach w zależności od częstotliwości sygnału na T0, to przydało by się też jakieś sprzężenie zwrotne od silnika.
    A przynajmniej jakieś zerowanie (kręcenie silnikiem w jedną stronę aż do osiągnięcia pozycji skrajnej).
  • Poziom 17  
    taki zerowanie mam na pętlach FOR-NEXT przed pętla programową ustawia silnik na żądaną pozycje po czym zaczyna się pętla programu a z tego polecenia LCD mogę zrezygnować
  • Poziom 43  
    Ale reszta programu mająca jakieś przełączniki (IF-y) też będzie się wykonywała w nierównych odstępach czasu. I jeszcze obracanie silnikiem wpłynie na pomiary.
    Nie obejdzie się bez dodatkowego Timera.
    Nie możesz wykorzystać T1? A w sumie skoro piszesz w BASCOMie, to może jakiś AVR? Będzie łatwiej.
  • Poziom 17  
    L1 Alias P0.0
    L2 Alias P0.1
    L3 Alias P0.2
    L4 Alias P0.3

    Dim Wynik As Word
    Dim Z As Byte
    Dim O As Byte
    Config Timer0 = Counter , Gate = Interial , Mode = 2


    Cls
    Cursor Off
    Lcd " zasilanie LPG "

    For O = 1 To 64

    Waitms 20
    L1 = 0 : L2 = 0 : L3 = 1 : L4 = 0
    Waitms 20
    L1 = 0 : L2 = 1 : L3 = 0 : L4 = 0
    Waitms 20
    L1 = 0 : L2 = 0 : L3 = 0 : L4 = 1
    Waitms 20

    Next
    For Z = 1 To 50
    Waitms 20
    L1 = 0 : L2 = 1 : L3 = 0 : L4 = 0
    Waitms 20
    L1 = 0 : L2 = 0 : L3 = 1 : L4 = 0
    Waitms 20
    L1 = 1 : L2 = 0 : L3 = 0 : L4 = 0
    Waitms 20

    Next

    Do
    ...........
    Loop
    End

    coś takiego

    Dodano po 16 [minuty]:

    mogę na razie nie myślę o rs 232 bo jak widzisz niski poziom wiedzy narazie chcę wykonać to sterowanie i silnik niema się obracać co impuls tylko przy określonych obrotach o daną liczbę kroków myślałem o sprawdzaniu warunku IF ale to nie wypali bo przy nastempnym cyklu zegarowym procesor przesunie silnik o zapisaną ilość kroków a on ma to zrobić raz i wykonywać inne zadania
  • Poziom 43  
    Chodziło mi o inne IF-y. No bo jak sam piszesz procesor ma wykonywać też inne zadania.
    Jeżeli to klasyczne '51 to masz problem, bo RS232 zajmie Ci Timer0 (chyba Timer0).
    AVR załatwił by sprawę. Ale nie będę dyskutował o wyższości AVR nad '51 ;p, bo zaraz ktoś mnie skarci.
    Po prostu tutaj AVR był by lepszy, bo najczęściej ma więcej Timerów i do tego z preskalerami. A na przykład taki ADC też można wykorzystać jako Timer ;p (porównuję do klasycznego ‘51)
  • Poziom 17  
    wiem mam ATmega 8 ale start kit zrobiłem na 89s51 i jak na razie przy nim zostanę ADC bardzo fajna sprawa ale na razie skupiam się nad swym problemem i wiem ze AVR są nowocześniejsze a transmisje danych to może za parę tygodni obadam po testuję
  • Poziom 43  
    Z tym ADC to chodziło mi o to że można z niego zrobić Timer, bo też generuje przerwania w stałych odstępach czasu.
    89S51 to już lepiej. Ma chyba 3 Timery, tak?
    No to jeden niech zlicza impulsy z zewnątrz (T0) a jakiś inny (powiedzmy T1) niech liczy takty zegara. Tylko że jakiś preskaler by się przydał. A w 51 to chyba tylko programowy. Czyli co kilka przerwań od T1 przepisujesz zawartość T0 do zmiennej Wynik.
    A program główny będzie robił obracanie.
    Obracanie można by zrobić i na T2, a nawet na T1 (tym co odlicza stałe odstępy czasu), ale trochę z tym zabawy szczególnie że to 51 i mocy obliczeniowej trochę zabraknie. Jeszcze assembler by podratował, ale skoro jesteś początkujący i do tego piszesz w BASCOMie to będzie ciężko. Trochę bym mógł napisać, ale pewnie jeszcze chciałbyś rozumieć jak to działa, a to będzie ciężko połączyć (żebym ja napisał, a potem Ty to zrozumiał ;p).
  • Poziom 17  
    kolego dzięki do assembler mam książkę więc o nim zapomnijmy to ma być prosty kod w BASCOMie może sterowanie L297 będzie latwiej

    P3.2 INT0 (external interrupt 0)
    P3.3 INT1 (external interrupt 1)
    P3.4 T0 (timer 0 external input)
    P3.5 T1 (timer 1 external input)
    jak widzisz ma cztery timery tylko co mi daje większa ilość ja potrzebuję zaliczać impulsy w odpowiednim odstępie czasu i przełożyć to na odpowiednią pozycje silnika jak zmusić procesor by pamiętał pozycje silnika ile wykonał ruchów w jedna czy drugą strone
  • Poziom 43  
    To nie są Timery tylko przerwania.
    Timery wymieniłeś 2, ale mi się zdaje że ten procesor ma 3, tylko nie wyprowadzone na piny (co akurat nic nie przeszkadza).