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.
 
 
 
 |