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

Bascom: Silnik krokowy obraca się o ten sam kąt na PinD.0 i PinD.1

siewnik 22 Paź 2006 14:47 1976 6
REKLAMA
  • #1 3141714
    siewnik
    Poziom 15  
    Posty: 206
    Ocena: 122
    Witam wszystkich!

    Mam taki problemik... chce aby silnik krokowy obracal sie o pewien kat, probuje napisac program abym mial do wyboru dwa katy o ktore moze obrocic sie silnik, niestety mimo ze napisalem dwa warianty silnik po nacisnieciu PinD.0 i PinD.1 obraca sie o ten sam kat... moze ktos wie co robie nie tak... probowalem z funkcja debounce ale tez mi nie wychodzilo

    Pozdrawiam i z gory dziekuje za pomoc
  • REKLAMA
  • REKLAMA
  • #3 3141815
    siewnik
    Poziom 15  
    Posty: 206
    Ocena: 122
    heh sorki zapomnialem o tym :-)


    Config Portb = &B11111111 'wszystkie piny jako wyjscia
    Portb = &B11111111 'stan spoczynkowy H
    Config Portd = &B1111100 'dwa ostatnie piny jako wejscia
    Portd = &B1111111 'stan spoczynkowy H

    Dim Pomoc1 As Byte , Obracaj As Byte , Cewki As Byte , Kat As Byte , 2obracaj As Byte 'wszystkie zmienne

    Do
    Waitms 10

    ' opoznienie o 10ms
    If Pind.0 = 0 Then

    Obracaj = 1
    End If

    If Obracaj = 1 Then
    Incr Pomoc1
    End If

    If Pomoc1 = 20 Then
    Pomoc1 = 0
    Incr Cewki
    If Cewki = 4 Then Cewki = 0
    Incr Kat
    End If

    If Kat = 5 Then
    Obracaj = 1
    End If

    If Kat = 7 Then


    End If

    '/////////////////////////////////////////////
    If Pind.1 = 0 Then

    Obracaj = 2
    End If


    If Obracaj = 2 Then
    Incr Pomoc1
    End If

    If Pomoc1 = 20 Then
    Pomoc1 = 0
    Incr Cewki
    If Cewki = 4 Then Cewki = 0
    Incr Kat
    End If

    If Kat = 20 Then
    Obracaj = 1
    End If

    If Kat = 21 Then
    Obracaj = 0
    Cewki = 0
    Kat = 0
    End If


    '////////////////////////////////////////////
    Portd.3 = 0

    Portb = Lookup(cewki , Tabela)


    Loop
    End


    Tabela:
    Data 1 , 2 , 4 , 8
  • REKLAMA
  • Pomocny post
    #4 3143879
    Soker
    Poziom 12  
    Posty: 38
    Pomógł: 1
    Ocena: 1
    może spróbuj inną metodą, może coś z tego rozbudujesz:

    Dim Mem_wiert As Byte
    Dim Powtorzenie As Integer
    Declare Sub Obrot1
    Declare Sub Obrot2
    Mem_wiert = 1 'wstepna wartosc numeru cewki

    '-------------------------------------------------

    Do
    Debounce Pind.0 , 0 , Obrot1 , Sub
    Debounce Pind.1 , 0 , Obrot2 , Sub

    Loop
    End

    '-------------------------------------------------

    Sub Obrot1
    For Powtorzenie = 1 To 20
    Select Case Mem_wiert
    Case 1 : Mem_wiert = 2
    Case 2 : Mem_wiert = 4
    Case 4 : Mem_wiert = 8
    Case 8 : Mem_wiert = 1
    End Select
    Portb = Mem_wiert
    Waitms 10
    Next Powtorzenie
    Portb = 0
    End Sub


    Sub Obrot2
    For Powtorzenie = 1 To 40
    Select Case Mem_wiert
    Case 1 : Mem_wiert = 2
    Case 2 : Mem_wiert = 4
    Case 4 : Mem_wiert = 8
    Case 8 : Mem_wiert = 1
    End Select
    Portb = Mem_wiert
    Waitms 10
    Next Powtorzenie
    Portb = 0
    End Sub
  • REKLAMA
  • #5 3146221
    siewnik
    Poziom 15  
    Posty: 206
    Ocena: 122
    soker dzieki, praktycznie rozwiazales moj problem tylko nie rozumiem dwoch rzeczy w Twoim programie:

    1) po co jest Portb = Mem_wiert
    2) i dlaczego portb=0

    pozdrawiam i dizekuje za pomoc
  • Pomocny post
    #6 3146339
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    Portb = Mem_wiert ustawia na porcie odpowiednią kombinację stanów

    Mem_wiert = 1 - Końcówka 0 stan wysoki; reszta niski
    Mem_wiert = 2 - Końcówka 1 stan wysoki; reszta niski
    Mem_wiert = 4 - Końcówka 2 stan wysoki; reszta niski
    Mem_wiert = 8 - Końcówka 3 stan wysoki; reszta niski

    portb=0 wyłącza zasilanie silnika.

    Łatwiej jest sterować portem za pomocą instrukcji ROTATE zmienna , LEFT | RIGHT [, liczba_przesunięć ].
    gdzie zmienna będzie zapisywana do portu (lub będzie rejestrem PORT) o wartości początkowej np B&00010001, a liczbę przesunięć lepiej pozostawić = 1 i odpowiednią liczbę razy wywołać instrukcję ROTATE aby silnik wykonał zadaną liczbę kroków.

    Parametr Left i Right odpowiada kierunkowi obrotów. Do sterowania silnika wykorzystujemy 4 bity a port ma 8, które są obracane. Zastanów się jak zaoszczędzić 4 nie wykorzystane bity portu.
    I jeszcze jedno. Nie wolno pozostawić układu w stanie kiedy ROTATE nie będzie wykonywane bez wyzerowania bitów portu, bo jedna z cewek silnika będzie podlączona na stałe do prądu!
    Powyższy tekst ma być co najwyżej inspiracją do napisania programu, warto pomysleć nad usprawnieniami.

Podsumowanie tematu

✨ Problem dotyczył sterowania silnikiem krokowym za pomocą mikrokontrolera w Bascom, gdzie silnik obracał się o ten sam kąt niezależnie od wciśnięcia przycisków podłączonych do PinD.0 i PinD.1. Autor próbował napisać program umożliwiający wybór dwóch różnych kątów obrotu, jednak efekt był taki sam dla obu pinów. W odpowiedzi zasugerowano przesłanie kodu, co umożliwiło diagnozę problemu. Zaproponowano alternatywne rozwiązanie z wykorzystaniem funkcji debounce i dwóch podprogramów (Sub Obrot1 i Sub Obrot2) realizujących różną liczbę kroków silnika, co pozwoliło na uzyskanie różnych kątów obrotu. Wyjaśniono, że instrukcja "Portb = Mem_wiert" ustawia odpowiednie stany na wyjściach portu sterującego cewkami silnika, a "Portb = 0" wyłącza zasilanie silnika, co jest ważne dla poprawnej pracy i ochrony układu. Dodatkowo zasugerowano użycie instrukcji ROTATE do efektywnego sterowania portem i kierunkiem obrotów silnika krokowego, z uwzględnieniem optymalizacji wykorzystania bitów portu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA