Witam wszystkich forumowiczów!
Na wstępie przyznaję się bez bicia że jestem zielony w programowaniu w bascomie.
Kupiłem sterownik na bazie kitu AVT2745 z myślą o sterowaniu silnikiem unipolarnym do sterowania mikroruchowego sterowanie bezdotykowe ostrością w teleskopie astronomicznym oraz z myślą o sterowaniu mechanizmem teleskopu za pozornym ruchem gwiazd wynikłym z ruchu obrotowego ziemi.
Mam takie silniki unipolarne:
1.SHINANO KENSHI STH-39D234-03,5,8V-0,3Nm
2.MINEBEA 23KM-K381-P3V,2,3V-0,8Nm
Oba silniki 1,8 DEG/STEP czyli 200 kroków na obrót,zasilane z akumulatorów żelowych 6 lub 12 V 12Ah.
Objawem przy podłaczeniu jest głównie drganie silników(kabelki dobrze podłączone).
US sterujący AT 90S2313 w tym Kicie myślę że jest tylko pełnokrokowy.
I może stąd te konwulsje silników.Chciałbym rozbudować program o mikrokroki tak 1/64 lub1/125max.
Może ktos pomoże z fachowców bo ja jestem zielony w te klocki.
Mam programator USB ASP ATMEL AVR ISP + Taśma Win7x64,program BASCOM 2.0.7.3 i wgrywałem tym sprzętem program źródłowy czyli mogę wgrać program zmodyfikowany.
Ale sam nie umiem go zmodyfikować.
Program źródłowy:
$regfile = "attiny2313.dat"
$crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Dim Praca As Bit , Przyciski As Byte , Licznik As Byte , Predkosc As Byte
Config Portb = &B0000111
Config Portd = &B1000000
Config Timer0 = Timer , Prescale = 64
Enable Interrupts : Enable Ovf0
Portb = &B11110000
Portd = 255
On Timer0 Podprogramik
Do : Loop : End
Podprogramik:
Przyciski = Pind And 3
Predkosc = Pind And &B0111100
Shift Predkosc , Left , 2
Predkosc = Predkosc Or 15
Timer0 = Predkosc
Select Case Przyciski
Case 0:
Praca = 0 : Reset Portd.6
Case 1:
Praca = 1 : Incr Licznik
Case 2:
Praca = 1 : Decr Licznik
Case 3:
Praca = 0 : Set Portd.6
End Select
Licznik = Licznik And 3
If Praca = 1 Then
Portb = Lookup(licznik , Tabela)
Else
Portb = 0
End If
Return
Tabela:
Data &B11111001 , &B11111100 , &B11110110 , &B11110011
Pomoże ktoś?I jak programowo zmieniać szybkość obrotu silnika w bardzo małej prędkości obrotowej?
Sterownik silnika krokowego na AT 90S2313
Sory że piszę post pod postem ale nikt się nie włączył do rozmowy.
W między czasie zmodyfikowałem lekko program bo silniki,które używałem mi tylko nerwowo drgały.Obecnie jest dobrze ale nie super bo zależy mi na podkrokach.
Oto programik działający:
Dim Praca As Bit , Przyciski As Byte , Licznik As Byte , Predkosc As Byte
Config Portb = &B00001111 'młodsze-wyjścia do silnika, starsze-wejscia DIP-switch S1
Config Portd = &B1000000 ' 2 najmłodsze bity - wejscie przycisków,
' 4 następne -predkosc z DIP-switch'a S2 ostatni bit - wyjście=brzęczyk piezo
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts : Enable Ovf0
Portb = &B11110000 'na początek wyłącza silnik i podciąga wejscia S1
Portd = 255 'włącza rezyst podciągajace na wejsciach PD.0, PD.5 i wyłacza brzęczyk
On Timer0 Podprogramik
Do : Loop : End 'pusta pętla
Podprogramik:
Przyciski = Pind And 3 'uzyskujemy stan przycisków - dwa najmłodsze bajty
Predkosc = Pind And &B0111100 'i stan czterech bitów DIP-switcha S2
Shift Predkosc , Left , 2 'przesuwamy to na najstarsze pozycje
Predkosc = Predkosc Or 15 'a do 4 młodszych wpisujemy jedynki
Timer0 = Predkosc 'ładujemy tę wartość do Timera0, zmieniając czas do najbliższego przepełnienia
Select Case Przyciski 'sprawdzamy stanu przycisków
Case 0: 'gdy naciśnięte oba przyciski włącza brzęczyk piezo
Praca = 0 : Reset Portd.6 'włączony między PD.6 a plus zasilania
Case 1:
Praca = 1 : Incr Licznik ' naciśnięty S3 - w górę
Case 2:
Praca = 1 : Decr Licznik ' naciśnięty S4 - w dół
Case 3:
Praca = 0 : Set Portd.6 ' w spoczynku wyłącz brzęczyk
End Select
Licznik = Licznik And 3 'zeruje 6 zbędnych bitów ośmiobitowego licznika
If Praca = 1 Then
Portb = Lookup(licznik , Tabela)
Else
Portb = 0
End If
Return
Tabela:
Data &B11111001 , &B11111100 , &B11110110 , &B11110011
Główne zmiany w Prescale na 1024.
Chciałbym zmienić sterowanie z pełnych kroków na przynajmniej jeden półkrok a wtedy miałbym podział 400/na obrót.Wiem że w tej tabelce Data & coś trzeba pokombinować bo tam są cykle włączania uzwojeń silnika.
W między czasie zmodyfikowałem lekko program bo silniki,które używałem mi tylko nerwowo drgały.Obecnie jest dobrze ale nie super bo zależy mi na podkrokach.
Oto programik działający:
Dim Praca As Bit , Przyciski As Byte , Licznik As Byte , Predkosc As Byte
Config Portb = &B00001111 'młodsze-wyjścia do silnika, starsze-wejscia DIP-switch S1
Config Portd = &B1000000 ' 2 najmłodsze bity - wejscie przycisków,
' 4 następne -predkosc z DIP-switch'a S2 ostatni bit - wyjście=brzęczyk piezo
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts : Enable Ovf0
Portb = &B11110000 'na początek wyłącza silnik i podciąga wejscia S1
Portd = 255 'włącza rezyst podciągajace na wejsciach PD.0, PD.5 i wyłacza brzęczyk
On Timer0 Podprogramik
Do : Loop : End 'pusta pętla
Podprogramik:
Przyciski = Pind And 3 'uzyskujemy stan przycisków - dwa najmłodsze bajty
Predkosc = Pind And &B0111100 'i stan czterech bitów DIP-switcha S2
Shift Predkosc , Left , 2 'przesuwamy to na najstarsze pozycje
Predkosc = Predkosc Or 15 'a do 4 młodszych wpisujemy jedynki
Timer0 = Predkosc 'ładujemy tę wartość do Timera0, zmieniając czas do najbliższego przepełnienia
Select Case Przyciski 'sprawdzamy stanu przycisków
Case 0: 'gdy naciśnięte oba przyciski włącza brzęczyk piezo
Praca = 0 : Reset Portd.6 'włączony między PD.6 a plus zasilania
Case 1:
Praca = 1 : Incr Licznik ' naciśnięty S3 - w górę
Case 2:
Praca = 1 : Decr Licznik ' naciśnięty S4 - w dół
Case 3:
Praca = 0 : Set Portd.6 ' w spoczynku wyłącz brzęczyk
End Select
Licznik = Licznik And 3 'zeruje 6 zbędnych bitów ośmiobitowego licznika
If Praca = 1 Then
Portb = Lookup(licznik , Tabela)
Else
Portb = 0
End If
Return
Tabela:
Data &B11111001 , &B11111100 , &B11110110 , &B11110011
Główne zmiany w Prescale na 1024.
Chciałbym zmienić sterowanie z pełnych kroków na przynajmniej jeden półkrok a wtedy miałbym podział 400/na obrót.Wiem że w tej tabelce Data & coś trzeba pokombinować bo tam są cykle włączania uzwojeń silnika.
Musisz pokombinować w tabelce, i zrobić licznik do 8 z niej odczytujący, bo półkroków będzie 8.
Nie wiem czemu przyjęto taki dziwny zapis, że wysterowane są dwie cewki naraz, bo to energetycznie nieekonomiczne, ale szczegół.
Ogólnie wyglądało by to tak, Jak się nigdzie nie pomyliłem i silnik masz podpiety jak trzeba powinno zadziałać.
Nie wiem czemu przyjęto taki dziwny zapis, że wysterowane są dwie cewki naraz, bo to energetycznie nieekonomiczne, ale szczegół.
Ogólnie wyglądało by to tak, Jak się nigdzie nie pomyliłem i silnik masz podpiety jak trzeba powinno zadziałać.
Kod: Zaznacz cały
Tabela:
Data &B11111000 , &B11111100 , &B11110100 , &B11110110, &b11110010, &b11110011, &b11110001, &b11111001
Oj niestety silnik tylko drga.Ale dzięki za pomoc.Może coś z fazami trzeba zmienić.Końcówki mocy mam na tranzystorach MOSFET BUZ10.
Zmieniłem fazy na takie i też zong-silnik tylko drga:
Tabela:
Data &B11111001 , &B11111101 , &B11111100 , &B11111110 , &B11110110 , &B11110111 , &B11110011 , &B11111011
Na tej sekwencji orginalnej wszystko działa:
Tabela:
Data &B11111001 , &B11111100 , &B11110110 , &B11110011
Może trzeba wprowadzić sekwencję lewo/prawo oddzielnie?
Czy jest szansa tak zmodyfikowac program aby poprzez długie lub krótkie naciśnięcie przycisku zmieniać prędkość silnika od zera do maksymalnych zadanych w programie prędkości?
Tu mam taki podprogramik ale sam nie potrafię go adaptować z głównym:
Dim S1a As Bit , Blokbit As Bit , Licz As Byte
Do
Waitms 25
If Przycisk = 0 Then
If Blokbit = 1 Then
S1a = 1
Incr Licz
If Licz = 80 Then
Gosub Dlugie
Blokbit = 0
S1a = 0
End If
End If
Else
Blokbit = 1
Licz = 0
If S1a = 1 Then
S1a = 0
Gosub Krotkie
End If
End If
Loop
Zmieniłem fazy na takie i też zong-silnik tylko drga:
Tabela:
Data &B11111001 , &B11111101 , &B11111100 , &B11111110 , &B11110110 , &B11110111 , &B11110011 , &B11111011
Na tej sekwencji orginalnej wszystko działa:
Tabela:
Data &B11111001 , &B11111100 , &B11110110 , &B11110011
Może trzeba wprowadzić sekwencję lewo/prawo oddzielnie?
Czy jest szansa tak zmodyfikowac program aby poprzez długie lub krótkie naciśnięcie przycisku zmieniać prędkość silnika od zera do maksymalnych zadanych w programie prędkości?
Tu mam taki podprogramik ale sam nie potrafię go adaptować z głównym:
Dim S1a As Bit , Blokbit As Bit , Licz As Byte
Do
Waitms 25
If Przycisk = 0 Then
If Blokbit = 1 Then
S1a = 1
Incr Licz
If Licz = 80 Then
Gosub Dlugie
Blokbit = 0
S1a = 0
End If
End If
Else
Blokbit = 1
Licz = 0
If S1a = 1 Then
S1a = 0
Gosub Krotkie
End If
End If
Loop
Kod: Zaznacz cały
Tabela:
Data &B11111001 , &B11111101 , &B11111100 , &B11111110 , &B11110110 , &B11110111 , &B11110011 , &B11111011
Niestety nie działa.Silnik tylko drga.Może któraś linia wyżej w programie jest niedostosowana do półkroku.
Znalazłem programik który ma podobny układ włączeń poprzez S1 i S2 jedynie dodana jest opcja sterowania podczerwieni.I ten program mi działa na podkrokach tam zawartych.Czy można to jakoś adoptowac do programiku pierwszego?
Ewentualnie jak zmienić szybkość obrotów jednym przyciskiem(osobno lewo/prawo) od zera do max zadanych przez program w zależności jak długo się go trzyma wciśniety?
Za jakieś podpowiedzi z góry dziekuję.
Schemacik na dole.
I sam programik:
'****KONFIGURACJA PORTÓW****
Config Portb = &B11111111
Portb = &B11111111
Config Portd = &B1111000
Portd = &B1111111
'****KONFIGURACJA ZMIENNYCH****
Dim I As Byte
Declare Sub Wprawo
Declare Sub Wlewo
'****KONFIGURACJA RC5 NA PRZERWANIACH****
Config Int0 = Low Level
Config Rc5 = Pind.2
On Int0 Przzew0
Dim Komenda As Byte , Adres As Byte
Dim Odebrano As Bit
Enable Interrupts
Enable Int0
'****GŁÓWNA PĘTLA PROGRAMU****
Do
If Odebrano = 1 Then
If Komenda = 129 Then
Call Wprawo
End If
If Komenda = 131 Then
Call Wlewo
End If
Odebrano = 0
Enable Int0
End If
'****OBSŁUGA PRZYCISKÓW MICROSWITSCH****
If Pind.0 = 0 And Pind.1 = 1 Then Wprawo
If Pind.1 = 0 And Pind.0 = 1 Then Wlewo
If Pind.0 = 1 And Pind.1 = 1 Then Portb = &B00000000
Loop
'****KONIEC GŁÓWNEJ PĘTLI PROGRAMU****
Przzew0:
Disable Int0
Enable Interrupts
Getrc5(adres , Komenda)
Komenda = Komenda And &B01111111
Odebrano = 1
Enable Int0
Return
'****SEKWENCJA OBROTÓW****
Sub Wprawo :
For I = 0 To 7
Portb = Lookup(i , Sekwencja_1)
Waitms 1
Next
End Sub
Sub Wlewo :
For I = 0 To 7
Portb = Lookup(i , Sekwencja_2)
Waitms 1
Next
End Sub
'****KONIEC SEKWENCJI OBROTÓW****
'****SEKWENCJA OBROTÓW DO TRANZYSTORA****
Sekwencja_1:
Data &B11111110 , &B11111100 , &B11111101 , &B111111001 , &B11111011 , &B11110011 , &B11110111 , &B11110110
Sekwencja_2:
Data &B11110110 , &B11110111 , &B11110011 , &B11111011 , &B11111001 , &B11111101 , &B11111100 , &B11111110
Znalazłem programik który ma podobny układ włączeń poprzez S1 i S2 jedynie dodana jest opcja sterowania podczerwieni.I ten program mi działa na podkrokach tam zawartych.Czy można to jakoś adoptowac do programiku pierwszego?
Ewentualnie jak zmienić szybkość obrotów jednym przyciskiem(osobno lewo/prawo) od zera do max zadanych przez program w zależności jak długo się go trzyma wciśniety?
Za jakieś podpowiedzi z góry dziekuję.
Schemacik na dole.
I sam programik:
'****KONFIGURACJA PORTÓW****
Config Portb = &B11111111
Portb = &B11111111
Config Portd = &B1111000
Portd = &B1111111
'****KONFIGURACJA ZMIENNYCH****
Dim I As Byte
Declare Sub Wprawo
Declare Sub Wlewo
'****KONFIGURACJA RC5 NA PRZERWANIACH****
Config Int0 = Low Level
Config Rc5 = Pind.2
On Int0 Przzew0
Dim Komenda As Byte , Adres As Byte
Dim Odebrano As Bit
Enable Interrupts
Enable Int0
'****GŁÓWNA PĘTLA PROGRAMU****
Do
If Odebrano = 1 Then
If Komenda = 129 Then
Call Wprawo
End If
If Komenda = 131 Then
Call Wlewo
End If
Odebrano = 0
Enable Int0
End If
'****OBSŁUGA PRZYCISKÓW MICROSWITSCH****
If Pind.0 = 0 And Pind.1 = 1 Then Wprawo
If Pind.1 = 0 And Pind.0 = 1 Then Wlewo
If Pind.0 = 1 And Pind.1 = 1 Then Portb = &B00000000
Loop
'****KONIEC GŁÓWNEJ PĘTLI PROGRAMU****
Przzew0:
Disable Int0
Enable Interrupts
Getrc5(adres , Komenda)
Komenda = Komenda And &B01111111
Odebrano = 1
Enable Int0
Return
'****SEKWENCJA OBROTÓW****
Sub Wprawo :
For I = 0 To 7
Portb = Lookup(i , Sekwencja_1)
Waitms 1
Next
End Sub
Sub Wlewo :
For I = 0 To 7
Portb = Lookup(i , Sekwencja_2)
Waitms 1
Next
End Sub
'****KONIEC SEKWENCJI OBROTÓW****
'****SEKWENCJA OBROTÓW DO TRANZYSTORA****
Sekwencja_1:
Data &B11111110 , &B11111100 , &B11111101 , &B111111001 , &B11111011 , &B11110011 , &B11110111 , &B11110110
Sekwencja_2:
Data &B11110110 , &B11110111 , &B11110011 , &B11111011 , &B11111001 , &B11111101 , &B11111100 , &B11111110