'Program do sterowania małych silników krokowych za pomocą ATMega8 i układu L6219 lub LB1845
'sterowanie ćwierćkrokowe, zasilanie 30V
$regfile "m168def.dat"
$crystal = 4915200
'********* Konfiguracja wyświetlacza *********
$lib "Lcd4busy.lib"
Const _lcdport = Portd
Const _lcdddr = Ddrd
Const _lcdin = Pind
Const _lcd_e = 1
Const _lcd_rw = 2
Const _lcd_rs = 3
Config Lcd = 20 * 4
'*********** Konfiguracja wyjść do sterowania L6219 ************
Config Portc = Output
Ph1 Alias Portc.0 'kierunek przepływu prądu w uzwojeniu Ph1
Ph2 Alias Portc.1 'kierunek przepływu prądu w uzwojeniu Ph2
I01 Alias Portc.2 'napięcie dostarczane do uzwojeń- 1 , 2/3 lub 1/3 Imax
I11 Alias Portc.3
I02 Alias Portc.4
I12 Alias Portc.5
Reset Ph1 ' na początek ustawiamy krok 0
Reset I01
Reset I11
Set I02
Set I12
Reset Ph2
'********** PortB jako wejście z podciąganiem ***************
Config Portb = Input
Set Portb
'********** ustawienie przerwań ****************
sei
Config Timer0 = Timer , Prescale = 8 ' teraz da ok. 0.417us- ale może skrócić
'Config Timer2 = Timer , Prescale = 1024
Enable Ovf0
On Ovf0 Step_delay
Dim Kier As Byte
Dim Temp0 As Byte
Dim Opoznienie_odczytu As Byte
Dim Stan As Byte
Dim Kroki As Word
Dim Liczba_powtorzen As Byte
Dim Kat As Single
Dim Liczniczek As Byte
Liczniczek = 100
Dim U1 As Byte
U1 = 4
Dim Up As Byte
Dim Ul As Byte
Dim Us As Byte
Up = 255
Ul = 255
Ul = 255
Dim Rampa As Word
Rampa = 65000
Dim Koniec As Word
Koniec = 1000
Dim Next_step As Byte
Next_step = 0
Dim Flaga As Byte
Flaga = 0
Dim Liczba_krokow As Word
Liczba_krokow = 0 'Tu mogę wpisać 1000- i tak nie reaguje
Kier = 0
Cls
Cursor Off
Locate 1 , 1
Lcd "ustal kierunek "
Do
If Flaga = 1 Then 'gdy jest przerwanie od Timer0- co 237us
If Pinb.0 = 0 Then 'i jest wciśnięty przycisk PIND.2- ustawianie kierunku jednym przyciskiem
Incr Opoznienie_odczytu 'no bo przycisk ma drgania dłużej niż 237us- niech zwiększy
'to sprawdzanie powtórne do 17ms
If Opoznienie_odczytu >= 70 Then 'dajmy mu na wygaszenie drgań 17ms
If Temp0 = 0 Then ' i jest zezwolenie na zmianę stanu
Gosub Ustawianie
Temp0 = 1 ' zablokuj zezwolenie na zmianę stanu
End If
Opoznienie_odczytu = 0 'Jak już ustawił kierunek to pozwolimy mu liczyć od początku-
'po powtórnym naciśnięciu PIND.2
End If
Else
Temp0 = 0 'zezwalaj na zmiany
Opoznienie_odczytu = 0
End If
If Kier = 1 Then
Gosub Kier_prawo
End If
If Kier = 2 Or Kier = 0 Then
Gosub Kier_stop
End If
If Kier = 3 Then
Gosub Kier_lewo
End If
Flaga = 0
End If
Debounce Pinb.3 , 0 , Ustaw_liczba_krokow
Loop
End
Step_delay: 'ten timer określa szybkość z jaką szybkością kręci się silnik- teraz ok0.25ms/ impuls
Timer0 = 60 '110 'no to skracamy- ten silnik się jeszcze kręci- ale na jakimś innym moze to trzeba zmienić
'tu jest ok.237us obliczone a 248us zmierzone- procesor jednak coś wolno liczy
Flaga = 1
Incr Next_step 'sterowanie 1/8 kroku- 16 stanów
If Next_step >= 16 Then
Next_step = 0
End If
Return
Ustawianie:
Select Case Kier
Case 0
Locate 1 , 1
Lcd "kierunek- lewo " ; Kier
Case 1
Locate 1 , 1
Lcd "kierunek- stop " ; Kier
Case 2
Locate 1 , 1
Lcd "kierunek- praw " ; Kier
Case 3
Locate 1 , 1
Lcd "kierunek- stop " ; Kier
End Select
Incr Kier
If Kier >= 4 Then
Kier = 0
End If
Return
Kier_prawo: 'Sterowanie układu L6219 lub LB1845- w przypadku sterowania STEP, DIR ten fragment należy uprościć
For Kroki = 0 To Liczba_krokow
Select Case Next_step
Case 0
Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Set I02
Case 1
Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
Case 2
Reset Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
Case 3
Reset Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
Case 4
Set Ph1 : Set I11 : Set I01 : Reset Ph2 : Reset I12 : Reset I02
Case 5
Set Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
Case 6
Set Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
Case 7
Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
Case 8
Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Set I02
Case 9
Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
Case 10
Set Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
Case 11
Set Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
Case 12
Reset Ph1 : Set I11 : Set I01 : Set Ph2 : Reset I12 : Reset I02
Case 13
Reset Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
Case 14
Reset Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
Case 15
Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
End Select
Next
Return
Kier_lewo: ' j.w.
For Kroki = 0 To Liczba_krokow
Select Case Next_step
Case 0
Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Set I02
Case 1
Reset Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
Case 2
Reset Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
Case 3
Reset Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
Case 4
Set Ph1 : Set I11 : Set I01 : Set Ph2 : Reset I12 : Reset I02
Case 5
Set Ph1 : Set I11 : Reset I01 : Set Ph2 : Reset I12 : Reset I02
Case 6
Set Ph1 : Reset I11 : Set I01 : Set Ph2 : Reset I12 : Set I02
Case 7
Set Ph1 : Reset I11 : Reset I01 : Set Ph2 : Set I12 : Reset I02
Case 8
Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Set I02
Case 9
Set Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
Case 10
Set Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
Case 11
Set Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
Case 12
Reset Ph1 : Set I11 : Set I01 : Reset Ph2 : Reset I12 : Reset I02
Case 13
Reset Ph1 : Set I11 : Reset I01 : Reset Ph2 : Reset I12 : Reset I02
Case 14
Reset Ph1 : Reset I11 : Set I01 : Reset Ph2 : Reset I12 : Set I02
Case 15
Reset Ph1 : Reset I11 : Reset I01 : Reset Ph2 : Set I12 : Reset I02
End Select
Next
Return
Kier_stop: 'stop ma zachować aktualne położenie wirnika
Stan = Pinc
Return
Ustaw_liczba_krokow: 'Tu jest ustawianie- czas bez znaczenia i wszystkie paskudy typu wait czy debouce dozwolone
Cls
Lcd "liczba krokow"
Liczba_krokow = 1
Do
Waitus 500
Decr U1
If Pinb.1 = 1 Then
Liczniczek = 100
End If
If Pinb.1 = 0 Then
If U1 = 0 Then
U1 = Liczniczek
Decr Liczniczek
If Liczniczek < 2 Then Liczniczek = 2
If Liczba_krokow <= 16000 Then
Kat = Liczba_krokow * 0.029296875
End If
If Liczba_krokow >= 16000 Then
Liczba_krokow = 16000
End If
Incr Liczba_krokow
Lowerline
Lcd " -> " ; Liczba_krokow ; " "
Thirdline
Lcd "Kat " ; Kat ; " "
End If
End If
If Pinb.2 = 1 Then
Liczniczek = 100
End If
If Pinb.2 = 0 Then
If U1 = 0 Then
U1 = Liczniczek
Decr Liczniczek
If Liczniczek < 2 Then Liczniczek = 2
If Liczba_krokow <= 16000 Then
Kat = Liczba_krokow * 0.029296875
End If
If Liczba_krokow <= 1 Then
Liczba_krokow = 1
End If
Decr Liczba_krokow
Lowerline
Lcd " <- " ; Liczba_krokow ; " "
Thirdline
Lcd "Kat " ; Kat ; " "
End If
End If
If Pinb.4 = 0 Then Exit Do
Loop
Return
No i tak- jak przekazać liczba_kroków do kier_prawo/lewo aby program wykonał określoną liczbę kroków.
I jak zrobić żeby silnik startował od określonego położenia- 1/4 kroku-16 stanów po zatrzymaniu.