Sterownik rotora - Bascom - SQ2EER - 27-03-2011 21:42
Witam czytających - posiadając minimalną wiedzę o pisaniu programów w Bascom'ie - postanowiłem że spróbuje napisać taki program i przetestować go na mojej płytce uruchomieniowej EvB 4.3.
Na tą chwile mam taki oto napisany program.
Kod:
'zwiększanie ADC zapala PB1-LED,gasi PB0-LED
'zmiejszanie ADC zapala PB0-LED,gasi PB1-LED
'wyrównanie wartości gasi LED'y
'czyszczenie znaku stopnia działa
'przy zmiejszaniu zadanej - poniżej wartości
'odczytanej zapalaja się na przemian obie LED'y
'nie wiem czemu?
$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 Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego przetwornika A/C
Config Portd = &B11111100 : Portd = &B11111111
Config Portb = &B11111111 : Portb = &B11111111
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)
'Zmienne
Dim Wart_ac1 As Word 'zmienna na wartość odczytaną z przetwornika
Dim V1 As Single
Dim V2 As Integer
Dim V3 As String * 3
Dim V4 As Integer
Dim V5 As Single
Dim V6 As String * 3 'zmienna przechowująca obliczon
Declare Sub Lewo
Declare Sub Prawo
Declare Sub Zatrz
Start Adc 'uruchamia wbudowany przetwornik
Wart_ac1 = Getadc(0) 'odczytanie wartości z wejści ADC0 mikrokontrolera
V1 = Wart_ac1 / 2.841 'zamiana odczytanej wartości z A/C na stopnie azymutu
V2 = Int(v1)
V3 = Str(v2)
Cursor Off
Cls
Wait 1
Locate 1 , 4 : Lcd "STEROWNIK"
Waitms 500
Locate 2 , 6 : Lcd "ROTORA"
Wait 1
Cls
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)
Locate 3 , 2 : Lcd V3 ; Chr(5)
Locate 3 , 9 : Lcd Chr(4)
Locate 3 , 12 : Lcd V2 ; Chr(5)
V4 = V2
Cls
Do
'początek pętli programu
Wart_ac1 = Getadc(0) 'odczytanie wartości z wejści ADC0 mikrokontrolera
V1 = Wart_ac1 / 2.841 'zamiana odczytanej wartości z A/C na stopnie azymutu
V2 = Int(v1)
V3 = Str(v2)
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)
Locate 3 , 2 : Lcd V3 ; Chr(5) ; " "
Locate 3 , 9 : Lcd Chr(4)
Locate 3 , 12 : Lcd V4 ; Chr(5) ; " "
If Pind.0 = 0 Then 'zwiększanie zadanego azymutu
Waitms 25
If Pind.0 = 0 Then
Incr V4
If V4 => 360 Then
V4 = 360
End If
End If
End If
If Pind.1 = 0 Then 'zmiejszanie zadanego azymutu
Waitms 25
If Pind.1 = 0 Then
Decr V4
If V4 <= 0 Then
V4 = 0
End If
End If
End If
Locate 3 , 12 : Lcd V4 ; Chr(5)
V5 = Val(v3)
V6 = Str(v4)
If V3 < V6 Then
Gosub Lewo
End If
If V3 > V6 Then
Gosub Prawo
End If
If V3 = V6 Then
Gosub Zatrz
End If
Loop 'koniec pętli Do...Loop
End 'koniec programu
Sub Lewo
Portb = &B11111111 : Portb = &B11111110
End Sub Lewo
Sub Prawo
Portb = &B11111111 : Portb = &B11111101
End Sub Prawo
Sub Zatrz
Portb = &B11111111 : Portb = &B11111111
End Sub Zatrz
podczas zmieszania przyciskiem wartości zadanej ( tej po prawej stronie)
podczas przechodzenia z setek na dziesiątki oraz z dziesiątek na jedności zapala mi się LED podłączona do PB0 - czy może ktoś podpowiedzieć co robie źle - pozdrawiam Jacek.
P.S. załączam obrazek poglądowy sterownika
RE: Sterownik rotora - Bascom - SQ5NBG - 28-03-2011 10:49
Witaj Jacku,
Z tego co widzę, to zapalanie diód jest w procedurach (sub) na dole programu. Wywołanie procedury "lewo" zapala diodę na PB0, a wywołanie procedury "prawo" zapala diodę na PB1. Wywołanie procedury "lewo" następuję w momencie porównania: if v3<v6. v3 i v6 są zadeklarowane jako string. Czy nie powinieneś porównywać wartości liczbowych: v2 i v4? Podobnie porównania niżej v3>v6, v3=v6, powinny być na wartościach liczbowych: v2>v4, v2=v4. Generalnie rzecz biorąc warto zmienne nazywać tak, aby odzwierciedlały to co przechowują np. azymut_aktualny, azymut_ustawiony, azymut_aktualny_tekst, azymut_ustawiony_tekst - to pomaga czytać kod.
Pozdrawiam,
Darek
RE: Sterownik rotora - Bascom - SQ6OXK - 28-03-2011 13:51
Chciałbym jednak zaproponować zmianę koncepcji. - Zresztą sam mam zamiar wykonać właśnie taki rotor wg poniżywszy pomysłów.
1) Proponuje zrobić odczyt pozycji, za pomocą scalak z czujnikami hal-a (Taki jak w enkoderze, do sterowania syntezą Piligrima). Mamy dokadny i pozbawioną elementów mechanicznych odczyt pozycji. Potencjometr wielo-obrotowy to tani pomysł, ale wykorzystujemy jego tylko 10%, czyli około 0,5V zmiany napięcia na jego wyjściu, Przy przetworniku 10-bitowy, wydaje mi się to trudne do uzyskania stabilnego odczytu.
2) Chciałbym jako napęd zaproponować zwykłe silniki indukcyjne (elektryczne), ale wyposażona w odpowiednia przekładnie i falownik lub przy mniejszych mocach tylko regulator fazowy. Falownik można nawet sterować transmisją szeregową RS485, co dało by nam możliwość zmiany prędkości obrotu anteną w zależności od odległości od wprowadzanego azymutu.
3) Wprowadzanie azymutu z klawiatury + z programów sterujących rotorami
RE: Sterownik rotora - Bascom - SQ9MDD - 28-03-2011 14:11
Myślę że sterowanie ręczne jest wystarczające do niektórych zastosowań i nie należy z niego rezygnować, aczkolwiek zgodzę się że sterowanie z komputera to raczej niezbędny "fjuczer". Obsługa bezpośrednio z programów typu Ham Radio Deluxe, ewentualnie mała aplikacja może napisana w Delphi
Do kalibracji przydałby się jeszcze sygnał z krańcówki.
RE: Sterownik rotora - Bascom - SQ2EER - 28-03-2011 19:02
Witam i dziękuje za odpowiedzi - zmieniłem nieco program, zmieniłem typ zmiennych teraz zapalanie i gaszenie LED'ów jest ok.
Wiem że program powinien być pisany na przerwaniach - ale narazie nie umiem tego.
Ja wybrałem silnik krokowy ponieważ taki mam (3 sztuki) oraz jeden gotowy sterownik na AD3977.
Może koledzy podpowiedzą ( przykłady ) jak zrobić menu.
Wyłącznik krańcowy to dobry pomysł - będzie wstawiony (może 2 sztuki 0 stopni i 360).
Tymczasem wstawiam poprawiony kod w Bascom'ie.
Kod:
'zwiększanie ADC zapala PB1-LED,gasi PB0-LED
'zmiejszanie ADC zapala PB0-LED,gasi PB1-LED
'wyrównanie wartości gasi LED'y
'czyszczenie znaku stopnia działa
'zapalanie LED'ów w niewłąściwym momencie
'usunięte
$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 Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego przetwornika A/C
Config Portd = &B11111100 : Portd = &B11111111
Config Portb = &B11111111 : Portb = &B11111111
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)
'Zmienne
Dim Wart_ac1 As Word 'zmienna na wartość odczytaną z przetwornika
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 'zmienna zadanego azymutu'Dim V3 As Word
Declare Sub Lewo
Declare Sub Prawo
Declare Sub Zatrz
Start Adc 'uruchamia wbudowany przetwornik
Wart_ac1 = Getadc(0) 'odczytanie wartości z wejści ADC0 mikrokontrolera
Stopnie = Wart_ac1 / 2.841 'zamiana wartości odczytane z przetwornika'V1 = Wart_ac1 / 2.841 'zamiana odczytanej wartości z A/C na stopnie azymutu
'na stopnie zaymutu
Azym_odcz = Int(stopnie) 'wyciągnięcie części całkowitej ze zmienne "stopnie"'V2 = Int(v1)
Cursor Off
Cls
Wait 1
Locate 1 , 4 : Lcd "STEROWNIK"
Waitms 500
Locate 2 , 6 : Lcd "ROTORA"
Wait 1
Cls
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)
Locate 3 , 2 : Lcd Azym_odcz ; Chr(5) ; " "
Locate 3 , 9 : Lcd Chr(4)
Locate 3 , 12 : Lcd Azym_odcz ; Chr(5) ; " "
Locate 4 , 2 : Lcd Stopnie ; " " 'odczyt testowy stopni bez zaokrąglania
Azym_zad = Azym_odcz
Cls
Do
'początek pętli programu
Wart_ac1 = Getadc(0) 'odczytanie wartości z wejści ADC0 mikrokontrolera
Stopnie = Wart_ac1 / 2.841 'zamiana odczytanej wartości z A/C na stopnie azymutu
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)
Locate 3 , 2 : Lcd Azym_odcz ; Chr(5) ; " "
Locate 3 , 9 : Lcd Chr(4)
Locate 3 , 12 : Lcd Azym_zad ; Chr(5) ; " "
Locate 4 , 2 : Lcd Stopnie ; " " 'odczyt testowy stopni bez zaokrąglania
If Pind.0 = 0 Then 'zwiększanie zadanego azymutu
Waitms 25
If Pind.0 = 0 Then
Incr Azym_zad
If Azym_zad => 360 Then
Azym_zad = 360
End If
End If
End If
If Pind.1 = 0 Then 'zmiejszanie zadanego azymutu
Waitms 25
If Pind.1 = 0 Then
Decr Azym_zad
If Azym_zad <= 0 Or Azym_zad > 360 Then
Azym_zad = 0
End If
End If
End If
Locate 3 , 12 : Lcd Azym_zad ; Chr(5) ; " "
If Azym_odcz < Azym_zad Then
Gosub Lewo
End If
If Azym_odcz > Azym_zad Then
Gosub Prawo
End If
If Azym_odcz = Azym_zad Then
Gosub Zatrz
End If
Loop 'koniec pętli Do...Loop
End 'koniec programu
Sub Lewo
Portb = &B11111111 : Portb = &B11111110
End Sub Lewo
Sub Prawo
Portb = &B11111111 : Portb = &B11111101
End Sub Prawo
Sub Zatrz
Portb = &B11111111 : Portb = &B11111111
End Sub Zatrz
pozdrawiam 73 Jacek.
RE: Sterownik rotora - Bascom - SQ6OXK - 29-03-2011 15:10
Ponieważ, nie wiem jak zmienić, aby LCD odwrotnie wyświetlało litery, tzw taki invert czarne tło, białe znaki, dzięki czemu można by było wykonać przesuwający czarny pasek.
Ja w zamian powiększa litery w wybranym menu i proponuje tak wykonać menu:
Musisz zdeklarować stałe z tekstami menu
Kod:
Const Linia1 = "1 - Ustawienia"
Const Linia2 = "2 - Nastawy"
Const Linia3 - "3 - Pamieci"
Const Linia4 - "4 - Latarka"
....oczywiście dowolną ilość, oraz zmienna określając ilość linii w w menu
Kod:
Const Linii_menu = 4
Do tego potrzebne nam jeszcze pięć zmiennych, jedna do zapamiętywania aktualnej pozycję menu, trzy pomocnicze do obsługi wyświetlania i pętli, oraz pomocnicza znakową do przygotowywania tekstów menu
Kod:
Dim Linia As String * 16
Dim Pozycja_menu As Byte
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
...no i samą obsługę menu
Kod:
Do
'Najpier określamy które linie chcemy pokazać
A = Pozycja_menu - 1 'od której linii wyświetlamy menu
B = Pozycja_menu + 1 'do której linii wyświetlamy menu
If B > Linii_menu Then 'sprawdzanie czy nie jest to ostatnia pozycja w menu
B = Linii_menu
A = B - 2
End If
If A < 1 Then 'sprawdzanie czy nie jest to pierwszą pozycja w menu
A = 1
#if Linii_menu > 2
B = A + 2
#else
B = 2
#endif
End If
Locate 1 , 7 'wyśrodkowanie dla napisu Menu
Lcd "MENU"
'petla do wyswietlania reszty menu
For C = A To B
D = C - A 'okreslenie wysietalanej lini
Select Case D 'przesuniecie kursora na poczatek odpowiedniego wiersza
Case 0 : Home Lower
Case 1 : Home Third
Case 2 : Home Fourth
End Select
Select Case C 'wybor testu do menu
Case 1 : Linia = Linia1
Case 2 : Linia = Linia2
Case 3 : Linia = Linia3
Case 4 : Linia = Linia4
End Select
If C = Pozycja_menu Then 'jesli czy aktualnia linia to ta wybrana z menu
Linia = Ucase(linia)
End If
D = 16 - Len(linia)
Lcd Linia ; Spc(d)
Next A
Loop
Oczywiście obsługę zmiany zmienne pozycji menu, wraz z klawiszami, przejścia do odpowiedniej pozycji menu itd, musisz zrealizować sam.
RE: Sterownik rotora - Bascom - SQ2EER - 29-03-2011 22:12
Witam - dzięki Paweł za przykłady będę trenował może uda się coś zrobić - pozdrawiam 73 Jacek.
RE: Sterownik rotora - Bascom - SP3SWJ - 30-03-2011 9:51
ten driver to chyba jednak A3977 :-) http://www.elektroda.pl/rtvforum/topic483523.html
Silnik krokowy to fajna sprawa... tylko trzeba go najpierw wcisnąć do rotora i posiadac odpowiedni ( nietani) silnik :-)
Fajny prosty driver tez jest na TA8435H (IMT901)
http://www.ottop.republika.pl/sterownik8435.shtml
Jak jest odpowiednio mocny silnik krokowy i przełożenie nie trzeba stosować systemu pozycjonowania - wystarczą krańcówki bezpieczeństwa (i mogą robić jako referencja "0")
RE: Sterownik rotora - Bascom - SQ6ADE - 30-03-2011 17:58
(30-03-2011 9:51)SP3SWJ napisał(a): ten driver to chyba jednak A3977 :-) http://www.elektroda.pl/rtvforum/topic483523.html
Silnik krokowy to fajna sprawa... tylko trzeba go najpierw wcisnąć do rotora i posiadac odpowiedni ( nietani) silnik :-)
Bardzo fajny ten drajwer. Kupuje raczej gotowy moduł (ok 100PLN)
na tym czipie. Scalak się troche hajcuje przy większych prądach i wypada mu dokleić chłodnicę jeśli ma działać również po zatrzymaniu obrotu (jak sama przekładnia nie zapewni hamowania osi wyjściowej).
Wogóle krokówka to dobry kierunek.
RE: Sterownik rotora - Bascom - SQ2EER - 30-03-2011 21:39
Witam - Jarku tak masz racje to A3977.
Kilka fotek tego co zrobiłem do tej pory
[attachment=2765]
[attachment=2766]
[attachment=2767]
[attachment=2768]
tak ma być przyłączony silnik krokowy poprzez płytę alu, obroty zredukowane poprzez pasek zębaty
[attachment=2770]
a to sterownik, zasilacz i silnik
[attachment=2771]
[attachment=2772]
[attachment=2773]
oraz dane mojego silnika
[attachment=2774]
to narazie tyle - pozdrawiam Jacek.
|