Witam - próbując napisać program do sterownika rotora zatrzymałem się w momencie sterowania silnikiem krokowym - sam sterownik zrobiony na A3977 który do sterowania potrzebuje sygnały enable, dir, step.
step - i tu mam problem jak napisać procedurę aby silnik się obracał - dobrze by było aby miał tak zwaną rampę przy starcie i zatrzymaniu.
Kod:
$regfile = "m644pdef.dat" 'informuje kompilator o typie mikrokontrolera
'$sim
$crystal = 16000000 'informuje kompilator
'o częstotliwości oscylatora 'taktującego mikrokontroler
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7 'porty mikrokontrolera, do których dołączono wyświetlacz LCD
Config Portd = &B00000111 : Portd = &B11111111
Config Portb = &B11111111 : Portb = &B11110111
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego przetwornika A/C
Deflcdchar 1 , 31 , 31 , 4 , 4 , 4 , 4 , 4 , 4 ' replace ? with number (0-7)
Deflcdchar 2 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32 ' replace ? with number (0-7)
Deflcdchar 3 , 31 , 31 , 4 , 4 , 4 , 32 , 32 , 32 ' replace ? with number (0-7)
Deflcdchar 4 , 4 , 4 , 4 , 4 , 14 , 14 , 31 , 31 ' replace ? with number (0-7)
Deflcdchar 5 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32 ' replace ? with number (0-7)
Deflcdchar 6 , 1 , 1 , 3 , 3 , 7 , 7 , 15 , 15 ' replace [x] with number (0-7)
Deflcdchar 7 , 16 , 16 , 24 , 24 , 28 , 28 , 30 , 30 ' replace [x] with number (0-7)
'Deflcdchar 6 , 2 , 6 , 15 , 31 , 15 , 6 , 2 , 32 ' replace ? with number (0-7)
'Deflcdchar 7 , 8 , 12 , 30 , 31 , 30 , 12 , 8 , 32 ' replace ? with number (0-7)
'Deflcdchar 8 , 32 , 32 , 31 , 31 , 31 , 32 , 32 , 32 ' replace ? with number (0-7)
Up Alias Pind.7 'góra
Down Alias Pind.6 'dół
Setup Alias Pind.5 'wejście/zatwierdzenie
Azym0 Alias Pind.4
Azym360 Alias Pind.3
Step_ Alias Pinb.0 'Step
Dir_ Alias Pinb.1 'Dir
Enab_ Alias Pinb.2 'Enable
Buzer Alias Portb.3
Dim Ekran As Byte
Dim Pozycja As Byte
Dim Pozycja1 As Byte
Dim Pomoc1 As Byte
Dim Pomoc_pam As Byte
Dim Wart_ac1 As Word 'zmienna na wartość odczytaną z przetwornika
'Dim Wart_ac2 As Word
Dim Stopnie As Single 'zmienna stopni odczyt z przetwornika 'Dim V1 As Single 'podzielony przez 2.841
Dim Azym_odcz As Word 'zmienna odczytanego azymutu'Dim V2 As Word
Dim Azym_zad As Word
Dim Azym_0 As Word
'Dim Azym_360 As Word
Dim Azym0_eprom As Eram Word
Dim Azym0_odczyt As Word
'Dim Azym360_eprom As Eram Word
'Dim Azym360_odczyt As Word
Dim Pamiec(5) As Word
Start Adc 'uruchamia wbudowany przetwornik
'Readeeprom Wart_ac_0_e
'Readeeprom Wart_ac_360
''Waitms 100
Azym0_odczyt = Azym0_eprom
'Azym360_odczyt = Azym360_eprom
''Waitms 100
'Wart_ac1 = Getadc(0) 'odczytanie wartości z wejści ADC0 mikrokontrolera i przypisanie do zmiennej Wart_ac1
'Stopnie = Wart_ac1 / 2.841 'zamiana wartości odczytanej z przetwornika'stopnie = Wart_ac1 / 2.841
'Azym_odcz = Int(stopnie) 'zamiana odczytanej wartości z A/C na stopnie azymutu
Wart_ac1 = Getadc(0) - Azym0_eprom 'Wart_ac_0_od
Stopnie = Wart_ac1 * 3.6
Azym_odcz = Int(stopnie) 'na stopnie zaymutu
Ekran = 1
Pozycja = 1
Pomoc1 = 1
Cursor Off
Cls
Wait 1
Locate 1 , 4 : Lcd "STEROWNIK"
Waitms 500
Locate 2 , 6 : Lcd "ROTORA"
Waitms 500
Locate 3 , 4 : Lcd "By SQ2EER"
Waitms 500
Locate 4 , 5 : Lcd "Wer. 1.0"
Wait 1
Cls
Azym_zad = Azym_odcz
Do
Select Case Ekran
Case 1:
Cls
Do
Wart_ac1 = Getadc(0) - Azym0_eprom 'Wart_ac_0_od
'Wart_ac2 = Azym360_eprom - Azym0_eprom
Stopnie = Wart_ac1 * 3.6
Azym_odcz = Int(stopnie)
'Wart_ac1 = Getadc(0) 'odczytanie wartości z wejści ADC0 mikrokontrolera i przypisanie do zmiennej Wart_ac1
'Stopnie = Wart_ac1 / 2.841 'zamiana wartości odczytanej z przetwornika'stopnie = Wart_ac1 / 2.841 'zamiana odczytanej wartości z A/C na stopnie azymutu
'na stopnie zaymutu
'Azym_odcz = Int(stopnie)
Locate 1 , 6 : Lcd "Azymut"
Locate 2 , 1 : Lcd Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) ; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2) '; Chr(1) ; Chr(2) ; Chr(3) ; Chr(2); Chr(1) ; Chr(2) ; Chr(3) ; Chr(2); Chr(1) ; Chr(2) ; Chr(3) ; Chr(2); Chr(1) ; Chr(2) ; Chr(3) ; Chr(2); Chr(1) ; Chr(2) ; Chr(3) ; Chr(2); Chr(1) ; Chr(2) ; Chr(3) ; Chr(2)
Locate 3 , 2 : Lcd Azym_odcz ; Chr(5) ; " "
Locate 3 , 8 : Lcd Chr(6) ; Chr(7) 'Chr(4)
Locate 3 , 12 : Lcd Azym_zad ; Chr(5) ; " "
Locate 4 , 1 : Lcd Azym0_odczyt ; " " 'Wart_ac_0_od
'Locate 4 , 14 : Lcd Azym360_odczyt ; " "
If Up = 0 Then
Waitms 25
If Up = 0 Then
'Bitwait Up , Set
Azym_zad = Azym_zad + 1
If Azym_zad => 360 Then Azym_zad = 360
End If
End If
If Down = 0 Then
Waitms 25
If Down = 0 Then
'Bitwait Down , Set
Azym_zad = Azym_zad - 1
If Azym_zad = 0 Or Azym_zad => 360 Then Azym_zad = 0
End If
End If
If Setup = 0 Then
Wait 2
'If Setup = 0 Then
Bitwait Setup , Set
Pomoc1 = Pomoc1 + 1
If Pomoc1 => 3 Then Pomoc1 = 2
'End If
End If
Loop Until Pomoc1 = 2 : Ekran = 2
Case 2:
Cls
Do
If Up = 0 Then
Waitms 25
If Up = 0 Then
Locate 4 , 1 : Lcd " --> "
End If
End If
If Down = 0 Then
Waitms 25
If Down = 0 Then
Locate 4 , 1 : Lcd " <-- "
End If
End If
If Up = 1 And Down = 1 Then
Locate 4 , 1 : Lcd " STOP "
End If
Locate 1 , 4 : Lcd "Kalibracja"
Locate 2 , 6 : Lcd "Rotora"
Locate 3 , 1 : Lcd "ADC Azym.0 "
'Locate 4 , 1 : Lcd "ADC Azym.360 "
If Azym0 = 0 Then
Waitms 100
Wart_ac1 = Getadc(0)
Waitms 100
Azym_0 = Wart_ac1
Locate 3 , 12 : Lcd Azym_0
End If
Waitms 100
Azym0_eprom = Azym_0
'If Azym360 = 0 Then
'Waitms 100
'Wart_ac1 = Getadc(0)
'Waitms 100
'Azym_360 = Wart_ac1
'Locate 4 , 14 : Lcd Azym_360
'End If
'Waitms 100
'Azym360_eprom = Azym_360
If Setup = 0 Then
'Waitms 25
'If Setup = 0 Then
Bitwait Setup , Set
Pomoc1 = Pomoc1 + 1
If Pomoc1 => 4 Then Pomoc1 = 3
'End If
End If
Loop Until Pomoc1 = 3 : Ekran = 3
Case 3:
Cls
Do
Locate 1 , 3 : Lcd "Programowanie"
Locate 2 , 1 : Lcd "Pamieci azymutu"
If Up = 0 Then
Bitwait Up , Set
Pozycja = Pozycja + 1
If Pozycja => 9 Then Pozycja = 9
End If
If Down = 0 Then
Bitwait Down , Set
Pozycja = Pozycja - 1
If Pozycja = 0 Or Pozycja => 10 Then Pozycja = 0
End If
If Setup = 0 Then
'Waitms 25
'If Setup = 0 Then
Bitwait Setup , Set
Pomoc1 = Pomoc1 + 1
If Pomoc1 => 5 Then Pomoc1 = 4
'End If
End If
Loop Until Pomoc1 = 4 : Ekran = 1
End Select
Loop
End
Czy może koledzy mają jakieś pomysły - podpowiedzi.