Odpowiedz 
 
Ocena wątku:
  • 1 Głosów - 5 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Sterownik rotora - Bascom
SQ2EER Offline
Użytkownik
***

Liczba postów: 120
Dołączył: 17-06-2009
Post: #1
Sterownik rotora - Bascom
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


Załączone pliki Miniatury
İmage
(Ten post był ostatnio modyfikowany: 27-03-2011 22:20 przez SQ2EER.)
27-03-2011 21:42
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ5NBG Offline
Darek
*

Liczba postów: 19
Dołączył: 01-02-2009
Post: #2
RE: Sterownik rotora - Bascom
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
28-03-2011 10:49
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ6OXK Offline
Paweł
****

Liczba postów: 317
Dołączył: 23-06-2010
Post: #3
RE: Sterownik rotora - Bascom
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

--= SWL SP6-01-396 =--
28-03-2011 13:51
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ9MDD Offline
Rysiek
****

Liczba postów: 378
Dołączył: 01-02-2009
Post: #4
RE: Sterownik rotora - Bascom
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.

...przede wszystkim nie zakłócać...
28-03-2011 14:11
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ2EER Offline
Użytkownik
***

Liczba postów: 120
Dołączył: 17-06-2009
Post: #5
RE: Sterownik rotora - Bascom
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.
28-03-2011 19:02
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ6OXK Offline
Paweł
****

Liczba postów: 317
Dołączył: 23-06-2010
Post: #6
RE: Sterownik rotora - Bascom
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.

--= SWL SP6-01-396 =--
29-03-2011 15:10
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ2EER Offline
Użytkownik
***

Liczba postów: 120
Dołączył: 17-06-2009
Post: #7
RE: Sterownik rotora - Bascom
Witam - dzięki Paweł za przykłady będę trenował Big Grin może uda się coś zrobić - pozdrawiam 73 Jacek.
29-03-2011 22:12
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP3SWJ Offline
Jarek
****

Liczba postów: 653
Dołączył: 20-03-2010
Post: #8
RE: Sterownik rotora - Bascom
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")
30-03-2011 9:51
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ6ADE Offline
Radjoamator.
****

Liczba postów: 471
Dołączył: 05-04-2010
Post: #9
RE: Sterownik rotora - Bascom
(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.

tylko na FM UKF -> Just True Sound Hi-Fi Smile
30-03-2011 17:58
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ2EER Offline
Użytkownik
***

Liczba postów: 120
Dołączył: 17-06-2009
Post: #10
RE: Sterownik rotora - Bascom
Witam - Jarku tak masz racje to A3977.

Kilka fotek tego co zrobiłem do tej pory

İmage
İmage
İmage
İmage

tak ma być przyłączony silnik krokowy poprzez płytę alu, obroty zredukowane poprzez pasek zębaty

İmage

a to sterownik, zasilacz i silnik

İmage
İmage
İmage

oraz dane mojego silnika

İmage

to narazie tyle - pozdrawiam Jacek.
30-03-2011 21:39
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości