Wzmacniacz Sterowany RS-232


8
Ocena: None Średnia: 8 (3 głosujących)

Opisywane urządzenie znakomicie nadaje się jako wzmacniacz multimedialny. Zaletą układu jest możliwość sterowania z komputera lub za pomocą pilota pracującego w standardzie Rc5. Główną częścią urządzenia jest sterownik zbudowany w oparciu o mikrokontroler ATMega162. Jego zadaniem jest między innymi komunikacja z komputerem PC przez port RS-232, sterowanie przedwzmacniaczem cyfrowym TDA8425, pomiar temperatury końcówki mocy, sterowanie chłodzeniem oraz zapis ustawień do pamięci EEPROM. Jako końcówkę mocy zastosowano dwa układy TDA2030 dostarczające moc ok. 2x15W. Aplikacja sterująca została napisana w programie LabVIEW firmy National Instruments (http://www.ni.com/) w ramach zajęć z przedmiotu Komputeryzacja Pomiarów jako projekt zaliczeniowy.

Działanie:


Schemat ideowy sterownika przedstawiony jest na rysunku poniżej:

Sercem układu jest mikrokontroler U1 (ATMega162) wraz z rezonatorem kwarcowym X1 (16MHz) i dwoma kondensatorami C1 (22pF) i C2 (22pF). Potencjometr P1 (10k) służy do regulacji kontrastu wyświatlacza LCD W1 (20x4). Tranzystory T3 (BC547B) oraz T4 (BD140) wraz z rezystorami R12 - R14 (3,3k) stanowią obwód wykonawczy do sterowania pracą wentylatora (z pomiarem obrotów, trójprzewodowy) podłączonego do złącza Went. Przyciski S1 - S8 (uSwitch) służą do ustawiania parametrów pracy wzmacniacza (poziom głosu, tony niskie i wysokie, wyciszenie oraz zmiana wejść). Złącze SW_Goldpin umożliwia podłączenie Odbiornika Rc5 a przez to sterowanie wzmacniaczem za pomocą pilota.

Tranzystory T1 (BC557B) i T2 (BC547B) oraz rezystory R1 - R3 (10k) tworzą prosty interfejs RR-232. Rezystory R16 (3,3k) oraz R17 (3,3k) podciągają linie magistrali I2C do plusa zasilania. Złącze GP zapewnia kontakt sterownika z płytką wzmacniacza oraz jest jednocześnie złączem zasilania sterownika. Kondensator C4 (100uF) filtruje napięcie zasilające. Prog1 jest złączem programującym a rezystory R4 - R7 (330R) zabezpieczają port LPT komputera przed ewentualnym uszkodzeniem. Diody LED D1 - D4, wraz z rezystorami R8 - R11 (330R) ograniczającymi ich prąd, informują o stanach pracy układu (wyciszenie, wejścia, autozapis ustawień).

Do pomiaru temperatury służy czujnik DS18B20 podłączony do złącza ds. Rezystor R15 (4,7k) umożliwia poprawną pracę magistrali 1-Wire.

Schemat ideowy wzmacniacza przedstawia poniższy rysunek:

Kondensatory C19 - C22 (470nF) odcinają składową stałą od wejśc procesora dźwięku U2 (TDA8425) natomiast kondensatory C9 (2,2uF) i C10 (2,2uF) robią to samo z wyjściami układu U2. Elementy C13 - C14 (33nF), C15 - C16 (15nF) oraz C17 - C18 (5,6nF) i C23 (100uF) zostały zastosowane zgodnie z zaleceniami producenta układu TDA8425 a ich wartości pochodzą wprost z karty katalogowej. Są one konieczne do poprawnej pracy procesora dźwięku.

Zasilacz zbudowany jest w oparciu o stabilizatory U3 (7812) i U4 (7805) dostarcza napięć zarówno dla przedwzmacniacza jak i płytki sterownika (dzięki złączu GP). Kondensatory C11 (4700uF), C12 (47uF) oraz C24 (47uF) filtrują napięcie zasilania i są konieczne do poprawnej pracy stabilizatorów. Złącza IN1 oraz IN2 stanowią dwa stereofoniczne niezależne wejścia, które mogą współpracować z źródłem dźwięku takim jak: komputer, odtwarzacz mp3 czy radio. Złącze AN podłączone do wyjścia procesora dźwięku ma zostać podłączone do wejścia liniowego w komputerze w celu umożliwienia analizy sygnału.

Rezystory R1a (100k), R2a (100k) i R3a (100k) służą do polaryzacji stopni wstępnych wzmacniacza, kondensator C2a (22uF) filtruje to napięcie polaryzacyjne. Kondensator C1a (1uF) zapobiega przedostawaniu się napięć stałych do wzmacniacza oraz na zewnątrz urządzenia. Elementy R4a (4.7k), R5a (150k) oraz C3a (2.2uF) pracują w pętli ujemnego sprzężenia zwrotnego i mają za zadanie kształtoanie charakterystyki widmowej wzmacniacza. Rezystor R6a (1R) wraz z kondensatorem C5a (100nF) pracują w układzie, który kształtuje charakterystyke na wyjściu. Kondensator C6a (1000uF) zapobiega przepływowi stałego prądu przez głośnik. Diody D1a (1N4007) oraz D2a (1N4007) zapobiegają pojawieniu się groźnych napięć, które mogą powstać w cewce głośnika. Kondensatory C7a (100uF) i C8a (100nF) filtrują dodatkowo napięcie zasilające obie końcówki mocy. Drugi kanał końcówki mocy ma identyczną budowę i zasadę działania a jego elementy oznaczone są literą "b".

Budowa:


Sterownik można zbudować w oparciu o płytkę dostępną tutaj. Rysunek w odbiciu lustrzanym dostępny jest tutaj. Montaż należy rozpocząć od wlutowania dwóch najkrótszych zworek. Pozostałe dwie należy wykonać kawałkami izolowanych przwodów dopiero po przylutowaniu podstawki pod mikrokontroler U1. Potencjometr P1, znajdujący się pod wyświetlaczem można zamontować w pozycji leżącej, tak aby umożliwić wygodniejszą regulację kontrastu wyświetlacza. Montaż pozostałych elementów jest typowy i nie stwarza problemów. Specjalne rozmieszczenie elementów na płytce stwarza możliwość rozcięcia jej na dwie części w poziomie. Umożliwi to zamontowanie obu części w ewentualnej przyszłej obudowie. Złącze DB9F należy w takim wypadku podłączyć przewodami i umieścić na tylnej ścianie obudowy. Sposób podłączenia wentelatora na tym samym stabilizatorze co procesor dźwięku powoduje generowanie niewielkich zniekształceń w torze audio, związanych z impulsową pracą wentylatora. Zniekształcenia słyszalne są tylko gdy wzmacniacz pracuje bez sygnału wejściowego. Gdyby było to problemem można zastosować osobny stabilizator dla wentylatora. Pomocą przy konstrukcji może okazać się dostępny tutaj schemat montażowy.

Wzmacniacz można zbudować w oparciu o płytkę dostępną tutaj. Rysunek w odbiciu lustrzanym dostępny jest tutaj. Montaż należy rozpocząć od wlutowania wszystkich zwór. Kolejność pozostałych elementów jest dowolna. Pod układ U2 dobrze jest zastosować podstawkę. Końcówki mocy muszą być koniecznie wyposażone w radiator, podobnie jak stabilizatory U3 i U4. Na płyce przewidziane są miejsca na złącza JACK do druku. Podyktowane jest to faktem iż opisywany projekt miał służyć jako wzmacniacz pokazowy. Bez żadnego problemu można umieścić gniazda w tylnej ścianie obudowy i połączyć je z płytką za pomocą skrętek przewodów. Do zasilania wzmacniacza należy zastosować transformator sieciowy o mocy ok. 50W i napięciu ok 17-20V. Uzwojenie wtórne transformatora należy podłączyć do złącza śrubowego Zas. Pomocą przy konstrukcji może okazać się dostępny tutaj schemat montażowy.

Wykaz Elementów:


Sterownik:


2x Listwa Gold Pin 1x3
1x Listwa Gold Pin 1x7
1x Listwa Gold Pin 1x10
1x Złącze szufladkowe na goldpiny 1x8
1x Złącze szufladkowe na goldpiny 1x16
8x uSwitch 12x12mm
1x Złącze DB9F do druku

8x 330R
5x 3,3k
1x 4,7k
3x 10k
1x 10k Potencjometr Montażowy

2x 22pF
1x 100uF Elektrolit

1x Rezonator Kwarcowy 16MHz
1x ATMEGA162 + Podstawka
2x BC547B
1x BC557B
1x BD140
4x Dioda LED 3mm
1x Wyswietlacz LCD 20x4

Wzmacniacz


3x Złącze ARK2
3x Złącze Jack 3,5mm do druku
1x Listwa Gold Pin 1x7

2x 1R
2x 4,7k
6x 100k
2x 150k

2x 5,6nF MKT
2x 15nF MKT
2x 33nF MKT
3x 100nF MKT
4x 470nF MKT

2x 1uF Elektrolit
4x 2,2uF Elektrolit
2x 22uF Elektrolit
2x 47uF Elektrolit
2x 100uF Elektrolit
2x 1000uF/35V Elektrolit
1x 4700uF/35V Elektrolit

4x 1N4007
1x Mostek Prostowniczy 5A
1x 7805
1x 7812
2x TDA2030
1x TDA8425

Programowanie:


Fragmenty programu napisanego w języku BASCOM AVR firmy MCS Electronics (http://www.mcselec.com/) przedstawione są poniżej:

Ten fragment pętli głównej programu odpowiedzialny jest za realizacją odczytu jednego bajtu danych przychodzących z portu RS-232 oraz jego odpowiednią interpretację:

 Rs_wartosc = Inkey()
  Rs_adres = Rs_wartosc
  Shift Rs_adres , Right , 5
  Rs_wartosc = Rs_wartosc And &B00011111
 
  If Rs_adres = 1 Then                                      'glos l i r
    Glos_l = 224 + Rs_wartosc                               'wartosc 0-31
    Gosub Wyslij_tda8425
    Gosub Wyswietl
  End If
 
  If Rs_adres = 3 Then                                      'bass
    Bass = 242 + Rs_wartosc                                 'wartosc 0-9  (0->-12dB,4->0dB, 8->12dB, 9->15dB)
    Gosub Wyslij_tda8425
    Gosub Wyswietl
  End If
 
  If Rs_adres = 4 Then                                      'treble
    Treble = 242 + Rs_wartosc                               'wartosc 0-8  (0->-12dB,4->0dB, 8->12dB)
    Gosub Wyslij_tda8425
    Gosub Wyswietl
  End If
 
  If Rs_adres = 5 Then                                      'funkcje
    Funkcje.0 = Rs_wartosc.0                                '[1][mu][efl][stl][we1=0 we2 =1]
    Funkcje.3 = Rs_wartosc.1
    Funkcje.4 = Rs_wartosc.2
    Funkcje.5 = Rs_wartosc.3
    Gosub Wyslij_tda8425
    Gosub Wyswietl
  End If
 
  If Rs_adres = 6 Then                       'pwm
    If Rs_wartosc = 31 Then                'wartosc 0-25 ->ustawia pwm i  reczny tryb
      Went_auto = 1                               'wartosc 31 -. ustawia automatyczny tryb
    Else
      Went_auto = 0
      Went_pwm = Rs_wartosc
    End If
  End If
 
  If Rs_adres = 2 Then              'zgloszenie potrzeby wyslania danych
    Rs_wyslij1 = 1
    Rs_wyslij2 = 1
  End If

Poniższy fragment kodu wykonywany jest co 4ms. Jego zadaniem jest obsługa klawiatury oraz wysyłanie dwóch pięciobajtowych paczek danych do komputera PC:

 If Flaga_4ms = 1 Then                                      'co 4ms
   Reset Flaga_4ms
   '***************
   If Sw_port <> 255 And Stan_portu = Sw_port Then
    Incr Licznik_sw
    If Licznik_sw = 50 Then
      Licznik_sw = 0
      Select Case Stan_portu
        Case 127:
         If Glos_l < 255 Then Incr Glos_l
        Case 247:
         If Glos_l > 224 Then Decr Glos_l
        Case 239:
         Funkcje.5 = Not Funkcje.5                          'mute
        Case 254:
         Funkcje.0 = Not Funkcje.0                          'wejscia
        Case 223:
         If Treble < 250 Then Incr Treble
        Case 253:
         If Treble > 242 Then Decr Treble
        Case 191:
         If Bass < 251 Then Incr Bass
        Case 251:
         If Bass > 242 Then Decr Bass
        Case 246:                                           ' reset
          Glos_l = 224
          Bass = 246
          Treble = 246
          Funkcje = 238
          Went_auto = 1
          Rs_wyslij1 = 1
          Rs_wyslij2 = 1
      End Select
 
      Gosub Wyslij_tda8425
      Gosub Wyswietl
      Rs_wyslij1 = 1                                        'flaga powodujaca wyslanie rs
    End If
  Else
    Stan_portu = Sw_port
    Licznik_sw = 45
  End If
 
  Rs_kolejnosc = Not Rs_kolejnosc
  If Rs_kolejnosc = 1 Then
    If Rs_wyslij1 = 1 Then
      Rs_wyslij1 = 0
      'jednorazowo wysyla parametry dzwieku
      Printbin 255                                          ' powoduje rozpoznanie bajtu jako ust dzwięku
      Printbin Glos_l                                       '224-255
      Printbin Bass                                         'min=242 0=246  max = 251
      Printbin Treble                                       'min=242 0=246  max = 250
      Printbin Funkcje                                      '[1][1][mu][efl][stl][1][1][we1=0 we2 =1]
    End If
  Else
    If Rs_wyslij2 = 1 Then
      Rs_wyslij2 = 0
      'jednorazowo wysyla temp, pwm i rpm
      If Went_auto = 1 Then
        Went_pwm_send = 31
      Else
        Went_pwm_send = Went_pwm
      End If
      Printbin Went_pwm_send
      Printbin Tempa
      Printbin Went_rpm
    End If
  End If
 
  '***************
 End If

Głównym zadaniem tej części programu jest odczyt temperatury i obliczanie obrotów wentylatora a także realizacja automatycznego regulatora obrotów w zależności od temperatury. Ten fragment programu wykonywany jest co 1s.

 If Flaga_1s = 1 Then                                       'co 1s
   Reset Flaga_1s
   '***************
   Pomiar_odczyt = Not Pomiar_odczyt
 
   Disable Interrupts
 
   1wreset
   If Pomiar_odczyt = 1 Then
     1wwrite &HCC
     1wwrite &H44
   Else
     1wwrite &HCC
     1wwrite &HBE
     Lsb = 1wread():
     Msb = 1wread():
 
     Tempa = Msb * 256
     Tempa = Tempa + Lsb
 
     Tempa = Tempa * 10                                     'temperatura *10
     Tempa = Tempa / 16
 
   End If
 
   Enable Interrupts
 
   Locate 4 , 2
   Tempa_10 = Tempa / 10
   Tempa_help = Tempa_10 * 10
   Tempa_1 = Tempa - Tempa_help
   Lcd Tempa_10 ; "." ; Tempa_1 ; Chr(2) ; "C  "
 
   If Went_auto = 1 Then                                    'sterowanie automatyczne went od temp
     Went_pwm = Tempa_10 / 5
     If Went_pwm > 25 Then Went_pwm = 25
   End If
 
   Went_rpm_help(1) = Went_rpm_help(1) * 10      'mnożnik = (60/czaspomiaru)*(1/imp na obrot)*(1/3wartosci do sredniej)
   If Went_rpm_help(1) < 10000 Then
     Went_rpm = Went_rpm_help(1)
     Went_rpm = Went_rpm + Went_rpm_help(2)
     Went_rpm = Went_rpm + Went_rpm_help(3)
     Went_rpm_help(3) = Went_rpm_help(2)
     Went_rpm_help(2) = Went_rpm_help(1)
   End If
   Went_rpm_help(1) = 0
 
   Rs_wyslij2 = 1                                           'flaga powodujaca wyslanie rs
 
   Locate 4 , 12
   If Went_rpm < 1000 Then Lcd " "
   If Went_rpm < 100 Then Lcd " "
   If Went_rpm < 10 Then Lcd " "
   Lcd Went_rpm
 
   If Save_en = 1 Then   'zapisywanie do eeprom gdy cos zmieniono w tda i nie zmieniano przez 5 sec
     Incr Save_count
     If Save_count = 5 Then
      Save_count = 0
      Save_en = 0
      Led_save = 0
      Writeeeprom Glos_l , Dane
      Writeeeprom Bass
      Writeeeprom Treble
      Writeeeprom Funkcje
     End If
   Else
     Save_count = 0
     Led_save = 1
   End If
   '***************
 End If

Widoczna poniżej obsługa przerwania timera 0 zajmuje się obliczaniem opoznień 4ms i 1s oraz ustawianiem flag potrzebnych do pracy głównej pętli programu. Zawarta jest tutaj także prosta realizacja zmiany obrotów przez regulację wypełnienia przebiegu prostokątnego podawanego na wentylator:

Prztimer0:                                                  'co  4ms
Timer0 = 5
 
Incr Went_licz
If Went_licz = 25 Then Went_licz = 0
If Went_licz < Went_pwm Then Set Went Else Reset Went
 
Set Flaga_4ms
 
Incr Dzielnik
If Dzielnik = 250 Then
  Dzielnik = 0
  Set Flaga_1s
End If
 
Return

Poniższy fragment kodu zawiera dwie procedury umożliwiające sterowanie pracą procesora dźwięku:

Wyslij_i2c:
  I2cstart
  I2cwbyte 130
  I2cwbyte Adres
  I2cwbyte Wartosc
  I2cstop
  Waitms 1
Return
 
Wyslij_tda8425:
  If Led_save = 1 Then
    Save_en = 1
    Save_count = 0
  End If
 
  Adres = 0
  Wartosc = Glos_l
  Gosub Wyslij_i2c
 
  Adres = 1
  Wartosc = Glos_l                                      
  Gosub Wyslij_i2c
 
  Adres = 2
  Wartosc = Bass
  Gosub Wyslij_i2c
 
  Adres = 3
  Wartosc = Treble
  Gosub Wyslij_i2c
 
  Adres = 8
  Wartosc = Funkcje
  Gosub Wyslij_i2c
Return

Aplikacja Sterująca:


Do obsługi wzmacniacza wykorzystano aplikację napisaną w LabVIEW. Niestety wersja programu dostępna na uczelni nie pozwoliła stworzyć odrębnie działającej aplikacji i do jej działania wymagane jest LabVIEW 7.1 oraz sterowniki sprzętowe dostępne na stronie firmy National Instruments (http://www.ni.com/). Wzmacniacz podłączony jest do komputera PC za pomocą interfejsu RS-232 a mierzony sygnał audio podawany jest na wejście liniowe karty dźwiękowej komputera.

Wygląd panelu przedniego aplikacji sterującej wzmacniaczem przedstawiony jest na rysunkach poniżej:

Aplikacja umożliwia między innymi:
- Regulację poziomu głosu wzmacniacza
- Regulację tonów niskich i wysokich
- Przełączanie efektów: Mono, Liniowe Stereo, Pseudo Stereo, Przestrzenne Stereo
- Zmianę wejść
- Wyciszenie
- Odczyt temperatury na radiatorze wzmacniacza
- Ustawienie alarmu temperatury
- Odczyt prędkości obrotowej wentylatora
- Przełączanie trybów pracy wentylatora (ręczny, automatyczny)
- Regulację prędkości obrotowej wentylatora (tryb ręczny)
- Analizę poziomu sygnału w kanale lewym i prawym (skala V/V lub dB)
- Analizę widma sygnału w 30 pasmach (skala V/V lub dB, z normalizacją lub bez)
- Ustawienie poziomu szumów poniżej którego poziom sygnału uznawany jest za zerowy
- Wybór jednej z dwunastu szat graficznych

Program w formacie *.vi można pobrać tutaj. Jedyny problem jaki może pojawić się podczas jego używania to obciążenie procesora jakie stwarza podczas wyświetlania grafiki analizatora widma. Po zminimalizowaniu aplikacji wszystko jest ok. Mimo, iż program ma dużą objętość, jego działanie nie jest bardzo skomplikowane. Budowę programu (użyte klocki) można zobaczyć tutaj natomiast poniżej zostanie omówione działanie najważniejszych części.

Pętla przedstawiona na rysunku poniżej zajmuje się obsługą karty dźwiękowej i odczytem sygnału:

Głównym składnikiem jest wewnętrzna pętla While, wewnątrz której znajduje się moduł Si READ odczytujący zawartość bufora, do którego zapisywane są kolejne wartości próbkowanego sygnału. Moduł ten dodatkowo działa jako opóźnienie pętli, zatrzymując jej wykonywanie do czasu zapełnienia bufora. Dzięki temu zwiększenie ilości iteracji, zapisywane do zmiennej nowe dane, jednoznacznie identyfikuje odczytanie bufora, którego zawartość jest zapisywana do tablicy sygnał. Dla danych ustawień początkowych (próbkowanie z częstotliwością 44,1 kHz przy 16-bitowej rozdzielczości) bufor o rozmiarze 1764 bajtów jest zapełniany w czasie 10ms. Zmieniając odpowiednio (przez zmienną Czas Próbkowania) rozmiar bufora można uzyskać różne czasy odczytu jego zawartości, a przez to szybkość działania analizatora. Zmiana wartości czasu próbkowania przez użytkownika wymaga ponownego zainicjowania procedury odczytu, co jest sygnalizowane przez wartość True zmiennej Reinicjacja. Wystąpienie błędu przepełnienia bufora, wynikające np. z zajęcia procesora przez inną aplikację, powoduje wpisanie wartości True do zmiennej Próbkowanie. Kombinacja logiczna zmiennych Reinicjacja i Próbkowanie powoduje przerwanie wykonywania wewnętrznej pętli While i wykonanie kolejnej iteracji zewnętrznej pętli, gdzie poprzez Strukturę Case następuje ponowne uruchomienie procedury odczytu sygnału.

Kolejnym ważnym elementem programu jest obsługa portu RS-232 i komunikacja ze wzmacniaczem. Poniżej przedstawiona jest pętla obsługi portu szeregowego bez jego konfiguracji, którą możemy zobaczyć na rysunku przedstawiającym cały schemat:

Na początku programu następuje konfiguracja portu szeregowego po czym program wpada do nieskończonej pętli while. Głównym elementem pętli jest Rejestr Przesuwny inicjowany wartością 255. Po pierwszym przejściu pętli do rejestru wpisywana jest wartość zmiennej Wysyłany_Bajt. W każdej iteracji pętli wartość z rejestru porównywana jest z tą zmienną. W razie niezgodności danych rejestr przyjmuje nową wartość i jednocześnie zmienna Wysyłany_Bajt zostaje podana na port RS-232 (zapewnia to niewielka Struktura Case). Dzięki Strukturze Sekwencyjnej generowane jest opóźnienie między ewentualnym wysyłaniem a odbieraniem danych z portu szeregowego. Po określeniu liczby bajtów znajdujących się w buforze portu szeregowego następuje ich odczyt. Interpretacja odebranych danych występuje tylko wtedy gdy odebrano 5 bajtów danych (taką ilość bajtów wysyła wzmacniacz, w dwóch niezależnych paczkach). Po spełnieniu warunku na długość danych wykonuje się struktura Wczytywanie bajtów z RS. Dane w postaci łańcucha znaków zamieniane są na Tablicę Bajtów a następnie dzielone są na 5 wartości liczbowych. Procesor wzmacniacza wysyła dwie paczki danych przez co konieczna jest identyfikacja które dane zostały odebrane. Dokonuje się to po pierwszym bajcie którego wartość równa 255 identyfikuje pozostałe bajty jako Dane do obsługi wzmacniacza, natomiast inna wartość pierwszego bajtu sprawia że paczka rozpoznawana jest jako Dane do obsługi temp. i went.. Gdy wewnętrzna Struktura Case dostaje na wejście stan True zajmuje się ustawianiem parametrów wzmacniacza (rysunek powyżej). Pierwszy bajt jest ignorowany ponieważ w tym przypadku zawsze ma wartość 255. Kolejne trzy bajty danych po przejściu przez elementarne operacje arytmetyczne (zdeterminowane przez oprogramowanie w mikrokontrolerze wzmacniacza) ustawiają pokrętła na panelu przednim w odpowiednich pozycjach. Ostatni bajt ze względu na fakt że jest zbiorem flag bitowych (każdy jego bit ustwiany jest niezależnie i oznacza np. wyciszenie włączone lub wyłączone itp.) dzielony jest na pojedyńcze bity, które ustawiają wejścia, wyciszenie oraz tryb pracy wzmacniacza (wartości bitów zależą od oprogramowania w mikrokontrolerze). Gdy natomiast wewnętrzna Struktura Case dostaje na wejście stan False zajmuje się ustawianiem pracy wentylatora oraz wyświetlaniem temperatury radiatora, co możemy zobaczyć na rysunku poniżej:

Pierwszy bajt interpretowany jest jako ustawienia wentylatora. Jego wartość równa 31 ustawia tryb pracy na Automatyczny, a wartości z przedziału 0-25 powodują ustawienie pokrętła Obroty oraz aktywowanie Ręcznego trybu pracy wentylatora. Kolejne dwa bajty to starszy i młodszy bajt temperatury, która wysyłana jest w postaci liczby pomnożonej przez 10. Wartość temperatury po przedzieleniu przez 10 ustawiana jest za pomocą Property Node ze względu na konieczność sygnalizowania zdarzenia po zmianie wartości. Dwa ostatnie bajty zawierają informację o prędkości obrotowej wentylatora.

Ważnym elementem w programie jest obsługa zdarzeń. Rysunek poniżej przedstawia fragment pętli, dotyczący pokrętła Poziom Głosu:

Zdarzenie wywoływane jest po przekręceniu pokrętła głośności na panelu przednim programu. Wartość głośności przeliczana jest do postaci akceptowanej przez wzmacniacz oraz sumowana logicznie z wartością 32, która odpowiada wartości 1 w mikrokontrolerze (po podzieleniu przez 32). Zdarzenia dla regulacji tonów wyglądają podobnie, różnią się jedynie adresem który jest sumowany logicznie z wartością regulacji tonów. Obliczona wartość wraz z adresem wpisywana jest do zmiennej Wysyłany_Bajt co powoduje jej wysłanie na port RS-232. Dzieje się to dzięki pętli obsługi portu szeregowego skanującej wartość zmiennej Wysyłany_Bajt.

Zdarzenia obsługi czterech przycisków zmieniających tryby pracy wzmacniacza są analogiczne, różnią się jedynie wartościami stałych wynikających z oprogramowania w mikrokontrolerze wzmacniacza. Na rysunku poniżej przedstawiony jest fragment pętli, dotyczący przycisku Liniowe Stereo:

Po wywołaniu zdarzenia dzięki Property Node blokowana jest możliwość ponownego kliknięcia przycisku Liniowe Stereo. Pozostałe przyciski tym samym sposobem stają się możliwe do kliknięcia. Jednocześnie do wszystkich pozostałych przycisków wpisywana jest wartość False. Tworzony jest bajt zawierający zespół flag bitowych niosących informację o funkcjach wzmacniacza (wartości w bajcie są określone przez oprogramowanie mikrokontrolera) a następnie jego wartość wpisywana jest do zmiennej Wysyłany_Bajt. Za resztę odpowiada pętla obsługi portu szeregowego.

Ostatnim zdarzeniem zasługującym na opis może być obsługa komponentu Zmiana Skórki. Odpowiedni rysunek zdarzenia przedstawiony jest poniżej:

Po wywołaniu zdarzenia odczytywana jest ścieżka do aktualnie uruchomionego projektu. Po odcięciu nazwy pliku *.vi do pozostałej części dodawana jest nazwa rysunku o numerze równym wartości komponentu Zmiana Skórki. Całość tworzy ścieżkę do aktualnej skórki. następnie obrazek jest wczytywany i wyświetlany na panelu przednim jako tło pod komponentami.

Obsługa pozostałych zdarzeń jest analogiczna do opisanych. Wszyskie komponenty ustawiające parametry w części sprzetowej ustawiają jedynie odpowiednią wartość zmiennej Wysyłany_Bajt według zasad określonych w programie mikrokontrolera. Za resztę odpowiada pętla obsługi portu szeregowego.

Największą część aplikacji stanowi pętla analizy sygnału. Jej fragment widoczny jest na rysunku poniżej:

Podobnie jak w pętli sterującej portem RS-232 działa tutaj Rejest Przesuwny wykrywający zmiany zmiennej nowe dane. Po przyjściu nowej tablicy danych sygnał rozpoczyna się jej analiza. Napierw zostaje podzielona na dwa niezależne kanały (lewy i prawy). Następnie w każdym z kanałów mierzona jest maksymalna amplituda, poprzez sumowanie najmniejszej i największej wartości z tablicy. Podział przez 655,36 zapewnia reprezentację w postaci stosunku wartości zmierzonej do maksymalnej wyrażonego w procentach. Amplituda jest porównywana z zadanym przez użytkownika poziomem szumów, co powoduje przemożenie całej tablicy przez 0, gdy poziom sygnału jest mniejszy od założonego, lub przez 1 (przepuszczenie sygnału w niezmienionej postaci), gdy amplituda wykroczy ponad zakładany poziom szumów. Struktura Case umożliwia wybór skali (V/V lub dB), przeliczając w drugim przypadku poziom sygnału na skalę logarytmiczną. Wartości amplitudy sygnału w prawym i lewym kanale trafiają dalej do komponentów (pasków) znajdujących się w lewej części panelu przedniego.

Na potrzeby analizatora sygnał z obu kanałów jest sumowany i normalizowany do maksymalnej amplitudy mierzonej w całym paśmie częstotliwości. Ma to na celu uniezależnić wskazania analizatora od aktualnie ustawionego wzmocnienia przedwzmacniacza. Dodatkowy selektor True/False wyłącza normalizację podczas odcięcia sygnału przez bramkę szumów. Następnie sygnał trafia do zestawu 30 filtrów pasmowo przepustowych o częstotliwościach granicznych dobranych tak, by różniły się od siebie o czynnik [tex]\sqrt[3]{2}[/tex] (filtry tercjowe). Następnie w każdym paśmie dokonywany jest pomiar maksymalnej amplitudy (jak wyżej). Z otrzymanych wartości budowana jest 30-elementowa tablica:

Pomiar maksymalnej wartości umożliwia znormalizowanie wszystkich amplitud do największej z nich, dzięki czemu otrzymuje się znacznie większą dynamikę wskazań analizatora. Wyboru skali dokonuje się poprzez Strukturę Case (jak wyżej). Tablica jest następnie rozdzielana na 30 sygnałów i przesyłana do odpowiednich komponentów. Ze względu na zastosowanie pasków podbicia każdy z komponentów przyjmuje dane w postaci klastra zawierającego dwa elementy: aktualny poziom i poziom paska, obliczany za pomocą pętli While przedstawionej niżej:

Do pętli przesyłana jest aktualna tablica poziomów sygnału oraz dwie 30-elementowe tablice z rejestrów przesuwnych, tablica zapamiętanych poziomów i tablica opóźnień. Pętla ta wykonuje 30 iteracji odczytując w każdej z nich kolejne elementy tablic (dzięki funkcji Indexing). Aktualna i zapisana wartość poziomu sygnału zostają porównane. W przypadku, gdy aktualny poziom jest większy od zapamiętanego (True dla zewnętrznej Struktury Case) jest on przepisywany do rejestru przesuwnego, zaś licznik opóźnienia jest ustawiany na zero. W przeciwnym przypadku wewnątrz Struktury wartość licznika jest zwiększana i porównywana z zadanym opóźnieniem. Gdy wartość licznika jest równa ustawionemu opóźnieniu (True dla wewnętrznej Struktury Case), do rejestru poziomu wpisywana jest aktualna wartość, zaś licznik jest resetowany. Jeśli opóźnienie jest mniejsze od zadanego, wartości obu rejestrów są przekazywane dalej. Po wyjściu z pętli While tablica rejestru przesuwnego zawierającego poziomy syganłu jest rozdzielana i przekazywana do odpowiednich komponentów (pasków).

Zdjęcia Projektu:

ZałącznikWielkość
Sterownik Schemat116.39 KB
Wzmacniacz Schemat58.43 KB
Sterownik Płytka23.88 KB
Sterownik Płytka (odbicie lustrzane)23.97 KB
Sterownik Płytka (2 na stronie)45.61 KB
Sterownik Montowanie32.32 KB
Wzmacniacz Płytka18.61 KB
Wzmacniacz Płytka (odbicie lustrzane)18.67 KB
Wzmacniacz Płytka (2 na stronie)35.05 KB
Wzmacniacz Montowanie29.74 KB
Kod Źródłowy11.3 KB
Program po kompilacji (BIN)4.71 KB
Program po kompilacji (HEX)13.26 KB
Aplikacja Sterująca (*.vi)784.27 KB



Portret użytkownika gosc 3

fuse

Co patrzyłem na zakładki fuse bitów to na pewno bit JTAGEN=1,i teraz nie jestem pewien bit ckdiv8=1,cksel 3.1=1
proszę o odpowiedz

Portret użytkownika mirley

Re; fusy

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc 3

Witam mam taki problem mały

Witam
mam taki problem mały gdy uruchamiam wszystko jest dobrze strona startowa i przechodzi do menu pisze tam poziom glosy tony niskie itp.
Ale nie działa klawiatura i na ekranie jest temperatura 57C i obroty 2300 ale nic nie mam podłączone

Portret użytkownika mirley

Re: Wzmacniacz

Zwieraj za pomocą kabelka pin PE0 procesora do masy, czy obroty się zmieniają. Czujnik Ds masz podłączony?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc 3

tak mam podłączony czujnik ds

tak mam podłączony czujnik ds ale tez się dziwi ze wogule przyciski nie działała a bit jtag jest wyłączony a wiec port c powinien działać a co do zwarcia pinu pe0 nic się nie zmienia