Zasilacz laboratoryjny 0...30 V/5 A ze sterowaniem mikroprocesorowym (2)

Zasilacz laboratoryjny 0...30 V/5 A ze sterowaniem mikroprocesorowym (2)
Pobierz PDF Download icon

Na ścieżce rozwoju każdego elektronika-konstruktora pojawia się wreszcie taka chwila, gdy w prowadzonych pracach rozwojowych przestają wystarczać takie źródła energii elektrycznej, jak jednorazowe ogniwa elektrochemiczne, akumulatory i akumulatorki czy tanie zasilacze wtyczkowe o przeciętnych parametrach. To chwila, w której jasna staje się potrzeba posiadania własnego zasilacza laboratoryjnego. W poprzednim artykule opisano budowę zasilacza – w tym zajmiemy się opisem jego oprogramowania oraz uruchomieniem.

Podstawowe parametry:
  • Napięcie wyjściowe regulowane w zakresie 0…30 V.
  • Ogranicznik prądowy regulowany w zakresie 100 mA…5 A.
  • Regulacja za pomocą dwóch par potencjometrów.
  • Dzielone uzwojenie transformatora dla ograniczenia mocy strat.
  • Sterowanie za pomocą mikrokontrolera AVR.
  • Oprogramowanie w języku Bascom AVR.

Oprogramowanie sterujące zasilaczem napisano w języku Bascom-AVR. Zostało ono podzielone na pięć głównych modułów logicznych:

  • Konfiguracji programu, portów, przetworników oraz deklaracji zmiennych.
  • Deklaracji, prekonfiguracji i warunkowej prezentacji kluczowych parametrów roboczych, zapamiętywanych w pamięci EEPROM.
  • Pętli głównej programu.
  • Podprogramów podstawowych.
  • Podprogramów obsługi menu.

Moduł konfiguracji programu, portów, przetworników i zmiennych, pokazany na listingu 1, rozpoczyna się od podania parametrów dla kompilatora języka. Dalej następuje konfiguracja dwóch portów wyjściowych (D.4 i D.5), które są wyjściami 10-bitowych przetworników cyfrowo-analogowych DAC/PWM, dostarczającymi nieprzetworzonych napięć sterujących (referencyjnych) Us oraz Im dla głównego stabilizatora napięcia wyjściowego oraz dla komparatora ograniczającego prąd wyjściowy. Uruchomienie przetworników DAC/PWM już na początku programu ma na celu umożliwienie bezproblemowej realizacji dalszej części konfiguracyjnego bloku programu (bez ryzyka negatywnych skutków niezerowego napięcia na wyjściu stabilizatora) poprzez ustawienie referencji dla napięcia wyjściowego na minimum (PWM=0, Uo=0V) oraz wartości limitu dla przeciążenia prądowego Im na bezwzględne maksimum (PWM=1023).

Teraz następuje konfiguracja wyjściowych portów B.0, B.1, B.3 i B.4, sterujących: przekaźnikiem K1 przełączającym sekcje transformatora, bocznikiem diody Zenera D7 – odpowiedzialnej za zakres regulacji napięcia Uo, wentylatorem radiatora M1 oraz buzzerem SP1, ustawionych (kolejno) na: niższy zakres napięć wyjściowych Uo, wyłączone chłodzenie oraz nieaktywną sygnalizację dźwiękową. Następnie konfigurowane są wyjściowe porty D.0..D.2 i D.6, odpowiedzialne za załączanie sygnalizacji optycznej diodami LED (stany: normalna praca, załączenie wentylatora, przeciążenie prądowe oraz przegrzanie zasilacza). Kolejno konfigurowane są porty wejściowe: przycisków sterujących D.7, C.0, C.1 i B.2 oraz wejście przerwania INT1 (port D.3), wyzwalanego niskim poziomem przez komparator U5B na skutek wykrycia stanu przekroczenia limitu prądowego Im. Za tymi deklaracjami następuje: konfiguracja wyświetlacza LCD 16×2 (U7), używającego portów: C.2…C.7, definicja znaku stopnia oraz wyświetlenie ekranu powitalnego urządzenia.

>>>>>>>>>> LISTING_1 >>>>>>>>>>

'MIKROPROCESOROWY ZASILACZ LABORATORYJNY
'DIGITALLY CONTROLLED DC POWER SUPPLY 0..30V / 0..5A
'AVT5585
'By Adam Sobczyk SQ5RWQ (11'16-10'17)

$regfile = "m16adef.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32

'***********************************************************************************************************************
'************************************************ Konfiguracje portów *************************************************
'***********************************************************************************************************************
'--------------------------------- Konfiguracja przetwornika cyfrowo-analogowego DAC/PWM -------------------------------
Config Portd.5 = Output : Portd.5 = 0
Config Portd.4 = Output : Portd.4 = 1
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear_up , Compare B Pwm = Clear_up , Prescale = 1
Enable Timer1
Pwm1a = 0 ' Uo=0V
Pwm1b = 1023 ' Im=max.

'---------------------------------------------------- STEROWANIE - WYJŚCIA ---------------------------------------------
Config Portb.0 = Output : Relay Alias Portb.0 : Relay = 0 ' przekaźnik sekcji trafa; na start: zał. jedna sekcja
Config Portb.4 = Output : Zener Alias Portb.4 : Zener = 1 ' bocznik D7; na start: D7 zwarta
Config Portb.1 = Output : Cooler Alias Portb.1 : Cooler = 0 ' załączanie wentylatora; na start: wyłączony
Config Portb.3 = Output : Buzzer Alias Portb.3 : Buzzer = 0 ' sterowanie buzzerem; na start: wyłączony

Config Portd.6 = Output : Led_working Alias Portd.6 : Led_working = 1 ' LED [WORKING] ; 1=OFF
Config Portd.2 = Output : Led_cooling Alias Portd.2 : Led_cooling = 1 ' LED [COOLING] ; 1=OFF
Config Portd.1 = Output : Led_overload Alias Portd.1 : Led_overload = 1 ' LED [OVERLOAD] ; 1=OFF
Config Portd.0 = Output : Led_overheating Alias Portd.0 : Led_overheating = 1 ' LED [OVERHEATING] ; 1=OFF


'----------------------------------------------------- STEROWANIE - WEJŚCIA --------------------------------------------
Config Portd.7 = Input : Portd.7 = 1 : Sw1_opt Alias Pind.7 ' dodany pull-up ; [SW1_OPT]
Config Portc.0 = Input : Portc.0 = 1 : Sw2__up Alias Pinc.0 ' dodany pull-up ; [SW2__UP]
Config Portc.1 = Input : Portc.1 = 1 : Sw3_dwn Alias Pinc.1 ' dodany pull-up ; [SW3_DWN]
Config Portb.2 = Input : Portb.2 = 1 : Sw4_set Alias Pinb.2 ' dodany pull-up ; [SW4_SET]
Config Portd.3 = Input : Portd.3 = 1 : Int_ovl Alias Pind.3 ' dodany pull-up ; [INT_OVL] - wej. przerwania nadprąd.

'------------------------------------------- Konfiguracja wyświetlacza LCD ---------------------------------------------
Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
Config Lcd = 16 * 2
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32 ' znak stopnia

'-------------------------------------------------- Ekran powitalny ----------------------------------------------------
Cls : Cursor Off
Upperline : Lcd " DC Power Supply"
Lowerline : Lcd " 0..30V / 0..5A "
Wait 1 : Cls
Upperline : Lcd " AVT5585 v.1.00"
Lowerline : Lcd " by SQ5RWQ 10'17"
Wait 1 : Cls

'--------------------------------------------- STAŁA I ZMIENNE OPERACYJNE ----------------------------------------------
Const Ku = 0.15841584 ' wzmocnienie wzmacniacza napięcia = (1k5+100R)/(10k+100R)

Dim Fromadc As Word ' dana pomiarowa z ADC
Dim Prhi As Single , Prlo As Single 'dane pośrednie pomiarów ADC z pot. regul. POT1..POT4
Dim Upwm As Single ' zmienna pomocnicza do przeliczania nap. ster. z DAC/PWM
Dim Todacpwm As Word ' dana sterująca DAC/PWM

Dim Uz As Single ' główne napięcie stałe, zasilające blok wykonawczy
Dim Us As Single , Us_temp As Single ' zadane napięcie wyj. zasilacza: aktualne i poprzednie

Dim Uo As Single ' napięcie wyjściowe zasilacza: aktualne
Dim Uo_old As Single ' napięcie wyjściowe zasilacza: poprzednie
Dim Uo_tmp As Single ' napięcie wyjściowe zasilacza - zmienna pomocnicza
Dim Uo_lcd As Single ' nap. wyj. zasilacza - do wyświetl. na LCD w trybie BASIC

Dim Im As Single ' max. dopuszczalny prąd wyjściowy (limit) - nastawa
Dim Im_lower As Single ' górny próg podnoszenia Us w obsłudze przeciążenia

Dim Io As Single ' prąd wyjściowy zasilacza: aktualny
Dim Io_old As Single ' prąd wyjściowy zasilacza: poprzedni
Dim Io_tmp As Single ' prąd wyjściowy zasilacza - zmienna pomocnicza
Dim Io_lcd As Single ' prąd wyj. zasil. - wyświetlany na LCD w trybie BASIC

Dim Fovl As Bit ' flaga stanu przeciążenia prądowego
Fovl = 0 ' na start: 0 - nie ma przeciążenia/zwarcia

Dim Tr As Single ' Temperatura radiatora przy tranzystorze 2SC5200
Dim Tr_old As Single ' Tr - wartość poprzednia (na potrzeby filtracji zakłóceń)
Tr_old = 18 ' wartość początkowa dla algorytmu filtracji (18 st.C.)
Dim Tr_tmp As Single ' Tr - zmienna pomocnicza
Dim Trint As Integer ' Tr - wersja Integer do celów wyświetlenia i porównania

Dim Pt As Single : Dim Ptint As Integer 'moc strat termicznych Pt

Dim Us_chng As Single ' krok zmiany napięcia Us w obsłudze stanu przeciążeniu
Dim A As Single ' współczynnik proporcjonalności dla ustawiania Us
Dim B As Single ' współczynnik proporcjonalności dla wyznaczania Uo
Dim C As Single ' współczynnik proporcjonalności dla nastawiania Im
Dim D As Single ' współczynnik proporcjonalności dla wyznaczania Io
Dim E As Single ' współczynnik proporcjonalności dla wyznaczania Tr
Dim F As Single ' współczynnik proporcjonalności dla wyznaczania Uz

Dim Selitem As Byte ' wskaźnik wybranej pozycji menu (do wyświetl. i zmiany)
Selitem = 1 ' wskazanie na początek menu

Dim Poschanged As Byte ' wskaźnik zmiany pozycji menu (trigger odświeżenia ekranu)
Poschanged = 1 ' 1 -> wyzwól odświeżenie ekranu

Dim Us_hi As Byte ' zakres pracy głównego zasilania: 1 -> wysoki , 0 -> niski
Us_hi = 0 ' załączone jedno uzwojenie trafa i zwarta dioda Zenera D7

W ostatnim bloku tego modułu są definiowane stałe i zmienne. Należą do nich: Ku (stała wzmocnienia wzmacniacza napięciowego), Fromadc (słowo pomiarowe z przetwornika A/C), Prhi i Prlo (dane pośrednie pomiarów A/C z potencjometrów regulacyjnych POT1…POT4), Upwm i Todacpwm (zmienna pomocnicza do przeliczania napięcia sterującego oraz dana sterująca przetwornikiem DAC/PWM), Uz (główne napięcie zasilania bloku wykonawczego stabilizatora), Us i Us_temp (zadane napięcie wyjściowe zasilacza: aktualne i poprzednie), Uo, Uo_old, Uo_tmp i Uo_lcd (napięcia wyjściowe zasilacza: aktualne, poprzednie, zmienna pomocnicza oraz wartość przeznaczona do wyświetlenia na ekranie LCD w podstawowym trybie BASIC), Im (nastawiany limit prądu wyjściowego), Im_lower (górny próg dla podnoszenia napięcia Us w trakcie obsługi stanu przeciążenia), Io, Io_old, Io_tmp oraz Io_lcd (prądy wyjściowe zasilacza: aktualny i w poprzedniej iteracji, wartość pomocnicza oraz wartość wyświetlana na ekranie LCD w trybie BASIC), Fovl (flaga statusu wystąpienia przeciążenia prądowego), Tr, Tr_old, Tr_tmp oraz Trint (temperatury radiatora: bieżąca i poprzednia na potrzeby filtracji zakłóceń, wartość pomocnicza do obliczeń oraz wersja całkowitoliczbowa do celów wyświetlenia i porównania), Pt i Ptint (moc strat termicznych w głównym bloku wykonawczym zasilacza w wersji zmiennoprzecinkowej i całkowitej – do wyświetlenia na ekranie LCD), Us_chng (krok zmiany napięcia Us w trakcie obsługi stanu przeciążenia), A, B, C, D, E i F (współczynniki proporcjonalności kolejno do: ustawiania napięcia sterującego Us, wyznaczania napięcia Uo, nastawiania limitu prądu Im, pomiaru wyjściowego prądu Io, wyznaczania temperatury radiatora Tr, wyznaczania głównego napięcia Uz bloku wykonawczego stabilizatora), Selitem (wskaźnik pozycji menu, wybranej do wyświetlenia i ewentualnej modyfikacji), Poschanged (flaga zmiany pozycji menu, wymuszająca odświeżenie ekranu) i na koniec Us_hi (zakres obszaru pracy dla głównego napięcia zasilania oraz sterowania stabilizatora).

Moduł deklaracji, wstępnej konfiguracji oraz warunkowej prezentacji kluczowych parametrów roboczych, zapamiętywanych w pamięci EEPROM, pokazano na listingu 2. W pierwszej, największej części składa się on z dziesięciu podobnych do siebie algorytmicznie sekcji, z których każda jest odpowiedzialna za: deklarację, odczyt z pamięci EEPROM, warunkową rekonfigurację i zapis do pamięci EEPROM oraz warunkową prezentację jednej ze zmiennych konfiguracyjnych. W szczególności, po odczytaniu zadeklarowanego uprzednio parametru, sprawdzana jest jego przynależność do dozwolonego zakresu wartości i – w przypadku negatywnego wyniku testu – nadawana jest mu wartość default, następnie zapisywana do pamięci EEPROM. Jeśli flaga Show_params, odpowiedzialna za zgodę na wyświetlanie parametrów konfiguracyjnych zasilacza przed rozpoczęciem jego właściwej pracy jest ustawiona (równa 1), to w następnym kroku jest wyświetlana wartość danego parametru.

'>>>>>>>>>> LISTING_2 >>>>>>>>>>

'***********************************************************************************************************************
'******** ZMIENNE KONFIGUROWALNE W MENU I ZAPAMIĘTYWANE W EEPROM - deklaracje, autokonfiguracja i prezentacje **********
'***********************************************************************************************************************
' Wyświetlanie parametrów konfiguracyjnych (zapisanych w EEPROM) przed rozpoczęciem właściwej pracy zasilacza
Dim Show_params As Byte ' 0 -> nie pokazuj, 1 -> pokazuj
Readeeprom Show_params , 1
If Show_params <> 0 And Show_params <> 1 Then
Show_params = 0 ' default: nie wyświetlamy parametrów konfiguracyjnych
Writeeeprom Show_params , 1
End If
If Show_params = 1 Then
Cls
Upperline : Lcd "Show_params"
Lowerline : Lcd Show_params
Wait 1
End If

' Tryby wyświetlania na LCD: BASIC MODE -> 0 / SERVICE MODE -> 1
Dim Lcd_mode As Byte
Readeeprom Lcd_mode , 2
If Lcd_mode <> 0 And Lcd_mode <> 1 Then
Lcd_mode = 0 ' default: LCD w trybie BASIC
Writeeeprom Lcd_mode , 2
End If
If Show_params = 1 Then
Cls
Upperline : Lcd "Lcd_mode"
Lowerline : Lcd Lcd_mode
Wait 1
End If

' Używanie buzzer'a
Dim Buzzer_on As Byte
Readeeprom Buzzer_on , 4
If Buzzer_on <> 0 And Buzzer_on <> 1 Then
Buzzer_on = 0 ' default: nie używamy buzzer'a
Writeeeprom Buzzer_on , 4
End If
If Show_params = 1 Then
Cls
Upperline : Lcd "Buzzer_on"
Lowerline : Lcd Buzzer_on
Wait 1
End If

' Vref - napięcie referencyjne, pobierane ze stabilizatora LM7805 (ok. 5V w zakresie: 4.7..5.3V)
Dim Vref As Single
Readeeprom Vref , 8
If Vref < 4.7 Or Vref > 5.3 Then
Vref = 5.0 ' default: 5.00V
Writeeeprom Vref , 8
End If
Gosub Pars_recalc ' przeliczenie wszystkich parametrów zależnych od Vref
If Show_params = 1 Then
Cls
Upperline : Lcd "Vref"
Lowerline : Lcd Fusing(vref , "#.##") ; " V "
Wait 1
End If

' Próg zakończenia chłodzenia wentylatorem {STOP COOLER}
Dim Tr0 As Integer '
Readeeprom Tr0 , 12
If Tr0 < 40 Or Tr0 > 60 Then
Tr0 = 50 ' default: 50 st. C
Writeeeprom Tr0 , 12
End If
If Show_params = 1 Then
Cls
Upperline : Lcd "Tr0"
Lowerline : Lcd Tr0 ; Chr(0) ; "C"
Wait 1
End If

' Próg rozpoczęcia chłodzenia wentylatorem {START COOLER}
Dim Tr1 As Integer
Readeeprom Tr1 , 16
If Tr1 <= Tr0 Or Tr1 > 70 Then
Tr1 = Tr0 + 10 ' default: histereza 10 st.C względem progu wyłączenia chłodzenia
Writeeeprom Tr1 , 16
End If
If Show_params = 1 Then
Cls
Upperline : Lcd "Tr1"
Lowerline : Lcd Tr1 ; Chr(0) ; "C"
Wait 1
End If

' Próg zastosowania procedury przegrzania {OVERHEATING}
Dim Tr2 As Integer
Readeeprom Tr2 , 20
If Tr2 <= Tr1 Or Tr2 > 80 Then
Tr2 = Tr1 + 10 ' default: histereza 10 st.C względem progu załączenia chłodzenia
Writeeeprom Tr2 , 20
End If
If Show_params = 1 Then
Cls
Upperline : Lcd "Tr2"
Lowerline : Lcd Tr2 ; Chr(0) ; "C"
Wait 1
End If

' Próg napięciowy dla załączenia górnego zakresu zasilania i sterowania
Dim Us_hi_on As Single
Readeeprom Us_hi_on , 24
If Us_hi_on < 10 Or Us_hi_on > 20 Then
Us_hi_on = 15.5
Writeeeprom Us_hi_on , 24
End If
If Show_params = 1 Then
Cls
Upperline : Lcd "Us_hi_on"
Lowerline : Lcd Fusing(us_hi_on , "#.#") ; " V "
Wait 1
End If

' Próg napięciowy dla załączenia dolnego zakresu zasilania i sterowania
Dim Us_hi_off As Single
Readeeprom Us_hi_off , 28
If Us_hi_off < 9 Or Us_hi_off >= Us_hi_on Then
Us_hi_off = Us_hi_on - 1.0 ' default: histereza 1.0V względem górnego progu
Writeeeprom Us_hi_off , 28
End If
If Show_params = 1 Then
Cls
Upperline : Lcd "Us_hi_off"
Lowerline : Lcd Fusing(us_hi_off , "#.#") ; " V "
Wait 1
End If

' Opóźnienie dodane w obsłudze przerwania od przeciążenia
Dim Ovldwait As Integer
Readeeprom Ovldwait , 32
If Ovldwait < 1 Or Ovldwait > 10000 Then
Ovldwait = 5000 ' default: 5000us (bardzo "miękka" reakcja)
Writeeeprom Ovldwait , 32
End If
If Show_params = 1 Then
Cls
Upperline : Lcd "Ovldwait"
Lowerline : Lcd Ovldwait ; " usek. "
Wait 1
End If

Cls

'---------------------------------- Konfiguracja przetwornika analogowo-cyfrowego ADC ----------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Avcc ' Vref = ca. 5.0V +/- 5% max. -> Vref wpisywane w menu
Start Adc

'--------------------------------- Konfiguracja zewnętrznego przerwania sprzętowego INT1 -------------------------------
Config Int1 = Low Level
On Int1 Overload
Enable Int1
Enable Interrupts

Obecność opisanego bloku programowego jest konieczna po to, by uniknąć ryzyka uruchomienia zasilacza z niewłaściwymi wartościami parametrów konfiguracyjnych. Należą do nich: opisany wcześniej Show_params (wartości: 0 – TAK, 1 – NIE), Lcd_mode (tryb wyświetlania na ekranie LCD: 0 – podstawowy/BASIC, 1 – serwisowy/SERVICE), Buzzer_on (zgoda na używanie buzzer’a do sygnalizacji przeciążenia i przegrzania: 0 – NIE, 1 – TAK), Vref (napięcie referencyjne z wyjścia stabilizatora: ok. 5 V – w zakresie od 4,7 do 5,3 V), Tr0 (próg temperatury zakończenia chłodzenia wentylatorem: od 40 do 60 stopni Celsjusza), Tr1 (próg temperatury rozpoczęcia chłodzenia wentylatorem: od powyżej Tr0 do 70 stopni Celsjusza), Tr2 (próg temperatury rozpoczęcia procedury przegrzania: od powyżej Tr1 do 80 stopni Celsjusza), Us_hi_on (próg napięciowy dla załączenia górnego zakresu zasilania i sterowania: od 10 do 20 V), Us_hi_off (próg napięciowy dla załączenia dolnego zakresu zasilania i sterowania: od 9 V do poniżej Us_hi_on) oraz Ovldwait (opóźnienie dodane w pojedynczym kroku obsługi przerwania od przeciążenia: od 1 msdo 10000 ms) Opisany moduł kończą instrukcje: konfiguracji i uruchomienia przetwornika A/C oraz zewnętrznego przerwania sprzętowego INT1, używanego do obsługi stanu przeciążenia prądowego.

Moduł pętli głównej pokazano na listingu 3. Wejście do tej pętli zostało poprzedzone wyłączeniem wyświetlania kursora i załączeniem zielonej diody LED (D11), sygnalizującej rozpoczęcie normalnej pracy urządzenia. Została ona zorganizowana w postaci pętli nieskończonej. Na początku tej pętli znajduje się blok inicjowanego naciśnięciem przycisku SW_1 (OPT) wejścia do menu konfiguracyjnego urządzenia. Właściwe uruchomienie podprogramu obsługi menu poprzedzone jest ustawieniem limitu prądowego na maksymalną wartość Im=5 A, wysterowania napięcia wyjściowego Us na 0 V oraz wyłączeniem diod LED sygnalizujących: pracę urządzenia (D11) i ewentualnie stan przeciążenia (D13). Wyłączany jest też profilaktycznie buzzer SP1 oraz gaszona jest flaga stanu przeciążenia Fovl. Po powrocie z podprogramu obsługi menu zapalana jest ponownie dioda LED D11, sygnalizująca normalną pracę urządzenia, a ewentualna aktywacja pozostałych indykatorów i flag następuje już w ramach normalnego cyklu roboczego. W kolejnym bloku głównej pętli programu, za pomocą skoków do odpowiednich podprogramów realizowane są poszczególne pomiary i odczyty nastaw. Najpierw odczytywane są wszelkie parametry napięciowe: głównego napięcia zasilającego Uz (warunkowo – tylko w serwisowym trybie wyświetlania na LCD), nastaw napięcia Us sterującego stabilizatorem (z potencjometrów POT1 i POT2; warunkowo – tylko wówczas, gdy flaga przeciążenia prądowego jest zgaszona) oraz napięcia wyjściowego Uo. Dalej następuje bezwarunkowy odczyt parametrów prądowych: limitu prądowego Im (z potencjometrów POT3 i POT4) oraz prądu wyjściowego Io. Sekcję odczytów kończy pomiar temperatury radiatora Tr. Kolejny, bardzo ważny, blok głównej pętli programu to blok regulacji.

'>>>>>>>>>> LISTING_3 >>>>>>>>>>

'***********************************************************************************************************************
'********************************************* GŁÓWNA PĘTLA PROGRAMU ***************************************************
'***********************************************************************************************************************
Cursor Off , Noblink
Led_working = 0 ' rozpoczęcie normalnej pracy urządzenia
Do
'**************************** MENU - warunkowe wejście *****************************
If Sw1_opt = 0 Then
' wstrzymanie normalnej pracy urządzenia
Im = 5.0 : Gosub Ustaw_im
Us = 0 : Gosub Ustaw_us
Led_working = 1 : Led_overload = 1 : Buzzer = 0 : Fovl = 0
' właściwe wejście do menu
Gosub Menu
' powrót do normalnej pracy urządzenia
Led_working = 0
End If

'************************************ ODCZYTY **************************************
'------------------------------------ NAPIĘCIE -------------------------------------
'Warunkowy pomiar głównego napięcia zasilającego Uz w serwisowym trybie wyświetlania
If Lcd_mode = 1 Then
Gosub Pomiar_uz
End If
'Odczyt nastaw potencjometrów regulacji napięcia wyjściowego Us (POT1..POT2)
If Fovl = 0 Then ' jeśli nie ma stanu przeciążenia nadprądowego
Gosub Odczyt_us
End If
'Pomiar wartości napięcia wyjściowego Uo
Gosub Pomiar_uo
'------------------------------------ PRĄD --------------------------------------
'Odczyt nastaw potencjometrów regulacji maksymalnego prądu wyjściowego Im (POT3..POT4)
Gosub Odczyt_im
'Pomiar wartości prądu wyjściowego Io
Gosub Pomiar_io
'---------------------------------- TEMPERATURA ----------------------------------
'Pomiar temperatury radiatora Tr
Gosub Pomiar_tr

'*********************************** REGULACJE *************************************
'------------------------------------ NAPIĘCIE -------------------------------------
'Ustawienie napięcia wyjściowego Uo
If Fovl = 0 Then ' nie ma stanu przeciążenia prądowego
Gosub Ustaw_us
Elseif Int_ovl = 1 And Io < Im_lower Then ' tryb obsługi przeciążenia poniżej limitu prąd. Im_lower
Us_temp = Us ' zapamiętaj aktualną wartość Us
Gosub Odczyt_us ' odczytaj aktualną nastawę Us z gałek POT1..POT2
If Us_temp < Us Then ' jeżeli Us_temp<Us (za niskie), to zwiększ Us
Us = Us_temp + Us_chng : Gosub Ustaw_us
Else ' Us_temp sięgnęło Us -> koniec obsługi przeciążenia
Led_overload = 1 : Buzzer = 0 : Fovl = 0 ' zgaszenie sygnalizacji i flagi
End If
End If
'-------------------------------------- PRĄD --------------------------------------
'Ustawienie referencji dla limitu prądu Im, ograniczającego prąd wyjściowy Io
Gosub Ustaw_im
'----------------------------------- TEMPERATURA -----------------------------------
' Regulacja temperatury radiatora
Select Case Trint ' analiza zakresu Tr
Case Is < Tr0 : Cooler = 0 : Led_cooling = 1 ' poniżej progu wyłączenia
Case Tr0 To Tr1 : ' zakres bez zmian
Case Tr1 To Tr2 : Cooler = 1 : Led_cooling = 0 ' nad progiem włączenia
Case Is > Tr2 : Gosub Overheating ' nad progiem przegrzania
End Select

'********************************** PREZENTACJE ************************************
If Lcd_mode = 0 Then
'*************************** TRYB PODSTAWOWY / BASIC ****************************
'Prezentacja wartości napięcia wyjściowego Uo
Gosub Filtruj_uo_lcd : Locate 1 , 1 : Lcd "U=" ; Fusing(uo_lcd , "#.##") ; "V "
'Prezentacja wartości prądu wyjściowego Io
Gosub Filtruj_io_lcd : Locate 1 , 9 : Lcd " I=" ; Fusing(io_lcd , "#.##") ; "A "
'Prezentacja nastaw limitu prądu Im
Locate 2 , 1 : Lcd "Im=" ; Fusing(im , "#.##") ; "A "
'Prezentacja temperatury radiatora Tr
Locate 2 , 10 : Lcd "T=" ; Trint ; Chr(0) ; "C "
Else
'************************** TRYB SERWISOWY / SERVICE ***************************
Upperline
'----------------------------------- NAPIĘCIE ------------------------------------
Lcd Fusing(uz , "#.#") ; ">" ' główne nap. zasilające Uz
Lcd Fusing(us , "#.##") ; ">" ' nastawa napięcia wyj. Us
Lcd Fusing(uo , "#.##") ; " " ' napięcia wyjściowe Uo
Lowerline
'----------------------------------- PRĄD ---------------------------------------
Lcd Fusing(im , "#.##") ; ">" ' nastawa limitu prądu Im
Lcd Fusing(io , "#.##") ; ">" ' prądu wyjściowy Io
'----------------------- PARAMETRY MOCOWE I TERMICZNE ---------------------------
'Straty termiczne Pt
Pt = Uz - Uo : Pt = Pt * Io : Ptint = Round(pt) : Lcd Ptint ; ">"
Lcd Trint ; " " ' temperatura radiatora
End If
Loop

Pierwsza jego część dotyczy regulacji napięcia wyjściowego Uo za pomocą napięcia sterującego Us. Jeśli zasilacz nie znajduje się w stanie przeciążenia prądowego (Fovl=0), to wartość Us jest przenoszona do bloku wykonawczego stabilizatora bezpośrednio na podstawie nastaw odczytanych z potencjometrów POT1...POT2. W przeciwnym wypadku sprawdzany jest aktualny stan wejścia przerwania INT1 (aktywowane niskim poziomem, jeśli występuje przeciążenie prądowe z warunkiem Io>=Im) i jeśli nie jest ono aktywne oraz bieżąca wartość prądu wyjściowego Io jest poniżej dopuszczalnego progu prądu Im_lower dla podwyższania napięcia sterującego Us, to realizowane jest działanie mające na celu wyjście ze stanu przeciążenia prądowego. W tym celu w zmiennej Us_temp zapamiętywana jest aktualna wartość napięcia sterującego Us, a następnie realizowany jest odczyt nowej wartości Us (z potencjometrów POT1 i POT2). Jeśli poprzednia wartość nastawy Us jest mniejsza od bieżącej, to jest realizowane podniesienie wartości Us o pojedynczy krok równy Us_chng, po którym następuje realna zmiana Us na odpowiednim wyjściu sterującym zasilacza – jest to działanie mające na celu doprowadzenie do zgodności zredukowanego uprzednio (w stanie przeciążenia prądowego) napięcia Us z aktualną wartością nastawioną.

Natomiast jeśli stwierdzono, że napięcie Us przekroczyło już wartość z nastaw na potencjometrach POT1 i POT2 (warunek: Us_temp>=Us), to następuje zakończenie procedury obsługi przeciążenia prądowego poprzez zgaszenie flagi Fovl, wyłączenie diody LED (D13) oraz ewentualne wyłączenie buzzera. Dalej, w bloku regulacji, następuje aktualizacja nastawy limitu prądowego Im, która może wpływać na sposób obsługi przeciążenia prądowego (w trakcie jej trwania) poprzez dalszą redukcję prądu wyjściowego Io (przy obniżeniu wartości Im) lub przyśpieszenie wyjścia z tego stanu (przy zwiększeniu wartości Im). Ostatni fragment bloku regulacji odpowiada za reakcję na bieżącą wartość temperatury radiatora Tr. Jest w nim analizowana przynależność wartości bieżącej Tr do przedziałów wyznaczonych przez zapisane w pamięci EEPROM wartości progów temperaturowych: Tr0<Tr1<Tr2. Chłodzenie radiatora jest załączane (wraz z LED D12) po przekroczeniu progu Tr1, natomiast wyłączane, gdy temperatura Tr spadnie poniżej progu Tr0. Obsługa stanu przegrzania jest realizowana przez odpowiednią procedurę, gdy temperatura Tr przekroczy próg Tr2 i kończy się wówczas, gdy temperatura Tr spadnie poniżej Tr1.

Ostatni blok głównej pętli programu to blok wyświetlania. Podzielono go na dwie części, uruchomiane alternatywnie zależnie od parametru Lcd_mode. Jeśli Lcd_mode=0, to następuje prezentacja parametrów w trybie podstawowym (BASIC). Są w nim prezentowane wyłącznie sformatowane wartości parametrów: napięcia wyjściowego Uo, prądu wyjściowego Io, limitu prądowego Im oraz temperatury Tr. Parametry: Uo, Io oraz Im, są prezentowane z dokładnością do dwóch miejsc po przecinku, natomiast parametr Tr jest pokazywany jako liczba całkowita z uwagi na niewielką dynamikę jego zmian, których wartości ułamkowe mają marginalne znaczenie dla prawidłowej pracy przyrządu. W tym miejscu należy podkreślić, że w trybie wyświetlania BASIC parametry: Uo, Io oraz Tr podlegają wstępnej cyfrowej filtracji dolnoprzepustowej prostymi filtrami IIR (Infinite Impulse Response) po to, by poprawić percepcję ich prezentacji na wyświetlaczu LCD – w obecności szybkich fluktuacji ich wartości.

Dodatkowo, temperatura Tr jest mierzona czujnikiem półprzewodnikowym narażonym na silne zakłócenia EMC, pochodzące od sąsiednich źródeł napięć i prądów zmiennych, więc jej filtracja jest realizowana w obu trybach wyświetlania. Jeśli parametr Lcd_mode jest równy 1, to następuje prezentacja parametrów w dodatkowym trybie serwisowym (SERVICE), który może okazać się przydatny przy regulacji, strojeniu parametrów oraz diagnostyce pracy zasilacza. W tym trybie, w górnej linijce wyświetlacza LCD prezentowane są wszystkie dostępne parametry napięciowe zasilacza: główne napięcie zasilania Uz, napięcie sterujące napięciem wyjściowym Us oraz zmierzone napięcie wyjściowe Uo. Parametry te, zmienne w czasie, nie są filtrowane dolnoprzepustowo po to, by można było lepiej zaobserwować „surową” pracę zasilacza w różnych warunkach testowych. W dolnej linijce prezentowane są parametry prądowe: limit prądowy Im i prąd wyjściowy Io, a także szacowane straty termiczne w tranzystorze wykonawczym Darlingtona: Q2–Q3 oraz temperatura radiatora Tr. Prezentacja podanych parametrów w trybie serwisowym ma charakter maksymalnie uproszczony: z uwagi na oszczędność miejsca na ekranie LCD kolejno wymienione parametry nie są opisane, a jedynie rozdzielone znakiem „>”. Prezentacja na ekranie LCD w trybie serwisowym może okazać się pomocna nie tylko przy diagnostyce urządzenia, ale także przy doborze jego optymalnych parametrów, np. progów temperaturowych Tr0..Tr2 czy progów napięciowych: Us_hi_on oraz Us_hi_off.

Na listingu 4 pokazano moduł podprogramów podstawowych, których przeznaczeniem jest przede wszystkim realizacja procedur wywoływanych w głównej pętli programu (list. 3). Pierwszą z procedur w tym module jest Pars_recalc, która musi zostać wywołana każdorazowo po zaczytaniu lub modyfikacji napięcia referencyjnego Vref. Służy ona do wyznaczenia wartości stałych obliczeniowych: Us_chng oraz A, B, C, D, E i F, używanych w innych procedurach obliczeniowych i zależnych właśnie od Vref. Kolejna procedura Overload jest przeznaczona do obsługi przerwania sprzętowego INT1, które jest wywoływane niskim poziomem na pinie PD.3 tak długo, aż mierzony prąd wyjściowy Io spadnie poniżej nastawionej wartości limitu prądowego Im. Procedura ta w pierwszej kolejności ustawia flagę przeciążenia prądowego Fovl, aktywuje sygnalizację świetlną (LED D13) i dźwiękową buzzerem SP1.

'>>>>>>>>>> LISTING_4 >>>>>>>>>>

'***********************************************************************************************************************
'*********************************************** PODPROGRAMY PODSTAWOWE ************************************************
'***********************************************************************************************************************

' Wyliczenie parametrów będących funkcjami parametru Vref
Pars_recalc:
Us_chng = Vref / 1024 : Us_chng = Us_chng / Ku
A = Ku * 1024 : A = A / Vref
B = Vref * 0.0061705767 ' B = Vref * 6.3125 / 1023 = Vref * 0.0061705767
C = 921.6 / Vref ' C = 0.1 * 9 / Vref * 1024 = 921.6 / Vref
D = Vref * 0.0010861301 ' D = Vref / 1023 * 10 / 9 = Vref * 0.0010861301
E = Vref * 0.097751710 ' E = Vref / 1023 * 100 = Vref * 0.097751710
F = Vref * 0.0097751710 ' F = Vref / 1023 * 10 = Vref * 0.0097751710
Return

' Procedura obsługi przerwania INT1, wygenerowanego przez komparator U5B po przekroczeniu limitu prądowego
Overload:
Fovl = 1 : Led_overload = 0 : Buzzer = Buzzer_on ' ustawienie flagi i sygnalizacji przeciążenia prądowego
' Redukacja napięcia sterującego Us o pojedynczy krok Us_chng lub wprost do 0V
If Us >= Us_chng Then
Us = Us - Us_chng
Elseif Us > 0 Then
Us = 0
End If
Gosub Ustaw_us ' ustawienie zmienionego nap. Us
Waitus Ovldwait ' konfigurowalne opóźnienie czasowe
Return

' Procedura awaryjnego chłodzenia urządzenia z wyłączonym wyjściem układu {OVERHEATING}
Overheating:
' - wprowadzenie zasilacza w stan pętli nieskończonej z warunkiem wyjścia opartym o spadek temperatury poniżej progu Tr1.
Us = 0 : Gosub Ustaw_us ' zamknięcie wyjścia zasilania
Cooler = 1 ' włączenie chłodzenia
' Sygnalizacja LED: anormalna praca/chłodzenie/przegrzanie oraz włączenie buzzera
Led_working = 1 : Led_cooling = 0 : Led_overheating = 0 : Buzzer = Buzzer_on
' Pętla "nieskończona" komunikacji i obsługi stanu przegrzania - z warunkiem opuszczenia: Tr<Tr1
Cls
Upperline : Lcd "***OVERHEATING**"
Do
Lowerline : Lcd "*SYSTEM**CLOSED*"
Wait 1
Lowerline : Lcd "**UNTIL*COOLED**"
Wait 1
Gosub Pomiar_tr
Lowerline : Lcd " T=" ; Trint ; Chr(0) ; "C "
Wait 1
Loop Until Trint < Tr1
' Aktualizacja sygnalizacji LED oraz wyłączenie buzzera
Led_working = 0 : Led_overheating = 1 : Buzzer = 0
Cls
Return

' Wyznaczanie nowej wartości nap. Us na podstawie nastaw potencjometrów POT1 i POT2
Odczyt_us:
Fromadc = Getadc(4) ' pomiar z ADC (POT1)
'Prhi = Fromadc / 1023 : Prhi = 25.0 * Prhi ' przeliczenie etapami
Prhi = Fromadc * 0.024437927 ' przeliczenie skrócone
Fromadc = Getadc(5) ' pomiar z ADC (POT2)
'Prlo = Fromadc / 1023 : Prlo = 5.0 * Prlo ' przeliczenie etapami
Prlo = Fromadc * 0.0048875855 ' przeliczenie skrócone
Us = Prhi + Prlo ' sumowanie obu nastaw
Return

' Ustawianie nowej wartości nap. Us
Ustaw_us:
'Ustalanie zakresu sterowania diodą Zenera i przekaźnikiem trafa - z zastosowaną histerezą
If Us > Us_hi_on And Us_hi = 0 Then ' przekroczony próg załącz. stanu wysokiego w stanie niskim
Relay = 1 ' załączanie obu sekcji trafa
Waitms 150 ' stabilizacja wartości Uz; 50..250ms (5..25 x T @ F=100Hz)
Zener = 0 : Us_hi = 1 ' aktywacja d.Z. D7, status pracy w wyższym zakresie napięć
Elseif Us < Us_hi_off And Us_hi = 1 Then ' przekroczony próg załącz. stanu niskiego w stanie wysokim
Zener = 1 : Relay = 0 ' deaktywacja d.Z. D7, załączenie jednej sekcji trafa
Us_hi = 0 ' status pracy w niższym zakresie napięć
End If
'Przeliczenie napięcia sterującego Us (odpowiada pożądanemu Uo) na słowo sterujące DAC/PWM, czyli Upwm
'Upwm = Ku * Us : Upwm = 1024 * Upwm : Upwm = Upwm / Vref ' przeliczenie etapami
Upwm = A * Us ' przeliczenie skrócone
Todacpwm = Round(upwm) : Pwm1a = Todacpwm ' ustawienie słowa DAC/PWM (po zaokrągleniu i rzutowaniu)
Return

' Pomiar napięcia wyjściowego Uo
Pomiar_uo:
Fromadc = Getadc(0) ' pomiar z ADC
'Uo = Fromadc : Uo = Uo * Vref : Uo = Uo / 1023 : Uo = Uo * 6.3125 ' przeliczenie etapami
Uo = B * Fromadc ' przeliczenie skrócone
Return

' Filtracja dolnoprzepustowa IIR napięcia Uo na potrzeby prezentacji dla trybu LCD podstawowego (BASIC)
Filtruj_uo_lcd:
' Formuła IIR: Uo_lcd(t) = 0.8 * Uo_lcd(t-1) + 0.2 * Uo(t)
Uo_tmp = 4 * Uo_old : Uo_tmp = Uo_tmp + Uo : Uo_lcd = 0.2 * Uo_tmp : Uo_old = Uo_lcd
Return

' Wyznaczanie nowej wartości limitu prądu Im oraz granicy podnoszenia napięcia Us w stanie przeciążenia Im_lower
Odczyt_im:
Fromadc = Getadc(6) ' pomiar z ADC (POT3)
'Prhi = Fromadc / 1023 : Prhi = 4.0 * Prhi ' przeliczenie etapami
Prhi = Fromadc * 0.0039100684 ' przeliczenie skrócone
Fromadc = Getadc(7) ' pomiar z ADC (POT4)
'Prlo = Fromadc / 1023 : Prlo = 1.0 * Prlo ' przeliczenie etapami
Prlo = Fromadc * 0.00097751710 ' przeliczenie skrócone
Im = Prhi + Prlo ' sumowanie obu nastaw
If Im <= 0.1 Then ' ograniczenie wartości minimalnej Im do 100mA
Im = 0.1
End If
'Zaokrąglenie kroku zmian limitu Im do 50mA w trybie wyświetlania LCD podstawowym (BASIC)
If Lcd_mode = 0 Then
Im = 20 * Im : Im = Round(im) : Im = 0.05 * Im
End If
Im_lower = Im - 0.035 ' górna granica prądu Io przy wychodzeniu z przeciążenia
Return

' Ustawienie elektrycznej wartości progu Im dla komparatora U5B
Ustaw_im:
'Upwm = 0.1 * Im : Upwm = 9 * Upwm : Upwm = Upwm / Vref : Upwm = 1024 * Upwm ' przeliczenie etapami
Upwm = C * Im ' przeliczenie skrócone
Todacpwm = Round(upwm) : Pwm1b = Todacpwm ' zaokrąglenie i nastawienie wartości DAC/PWM
Return

' Pomiar prądu wyjściowego Io
Pomiar_io:
Fromadc = Getadc(1) ' pomiar z ADC
'Io = Fromadc : Io = Io * Vref : Io = Io / 1023 : Io = Io * 10 : Io = Io / 9 ' przeliczenie etapami
Io = D * Fromadc ' przeliczenie skrócone
Return

' Filtracja dolnoprzepustowa IIR prądu Io na potrzeby prezentacji dla trybu LCD podstawowego (BASIC)
Filtruj_io_lcd:
' Formuła IIR: Io_lcd(t) = 0.8 * Io_lcd(t-1) + 0.2 * Io(t)
Io_tmp = 4 * Io_old : Io_tmp = Io_tmp + Io : Io_lcd = 0.2 * Io_tmp : Io_old = Io_lcd
Return

' Pomiar temperatury radiatora Tr
Pomiar_tr:
Fromadc = Getadc(2) ' pomiar z ADC
' Parametry przetwarzania T->U czujnika MCP9700AE: 0 st.C.->500mV + 10mV/st.C
'Tr = Fromadc : Tr = Tr * Vref : Tr = Tr / 1023 : Tr = Tr - 0.5 : Tr = Tr * 100 ' przeliczenie etapami
Tr = E * Fromadc : Tr = Tr - 50 ' przeliczenie skrócone
' Filtracja dolnoprzepustowa IIR temperatury radiatora Tr na potrzeby sterowania i prezentacji na LCD
' Formuła IIR: Tr(t) = 0.98 * Tr(t-1) + 0.02 * Tr(t)
Tr_tmp = 49 * Tr_old : Tr_tmp = Tr_tmp + Tr : Tr = 0.02 * Tr_tmp : Tr_old = Tr : Trint = Round(tr)
Return

' Pomiar głównego napięcia Uz (wyprostowanego i odfiltrowanego), zasilającego blok stabilizatora
Pomiar_uz:
Fromadc = Getadc(3) ' pomiar z ADC
'Uz = Fromadc : Uz = Uz * Vref : Uz = Uz / 1023 : Uz = Uz * 10 ' przeliczenie etapami
Uz = F * Fromadc ' przeliczenie skrócone
Return

Następnie redukuje napięcie Us, sterujące napięciem wyjściowym Uo o ustalony niewielki krok Us_chng (około 31 mV – w zależności od wartości Vref) lub do wartości 0V, jeśli Us<Us_chng i odczekuje konfigurowany w menu zasilacza czas równy Ovldwait mikrosekund po to, by blok kontrolno-sterujący urządzenia, obarczony pewną inercyjnością czasową, był w stanie skutecznie zrealizować i zweryfikować wykonanie tej operacji. Następną procedurą jest Overheating, która wywoływana jest z głównej pętli programu po przekroczeniu przez radiator progu temperatury Tr2. Po jej rozpoczęciu napięcie wyjściowe zasilacza jest sprowadzane (przez wartość Us) do 0 V, wymuszane jest też załączenie wentylatora i sygnalizacji dźwiękowej oraz gaszona jest sygnalizacja optyczna normalnej pracy (LED D11), a zapalane są sygnalizacje: załączenia chłodzenia i stanu przegrzania (LED: D12 i D14). Następnie rozpoczynana jest pętla nieskończona, w której z krokiem jednosekundowym wyświetlane są komunikaty o stanie urządzenia oraz o aktualnej temperaturze radiatora (fotografia 15).Wyjście z tej pętli może nastąpić tylko w wypadku schłodzenia radiatora do temperatury Tr<Tr1 – wówczas wyłączona zostanie sygnalizacja świetlna (LED D14) i dźwiękowa (SP1) przegrzania, załączana LED D11 i następuje powrót do normalnej pracy zasilacza.

Fotografia 15. Zawartość LCD po załączeniu zasilacza

Procedura Odczyt_us ma za zadanie wyznaczenie wartość napięcia sterującego Us na podstawie nastaw potencjometrów POT1 (zgrubny) i POT2 (precyzyjny). Napięcie z potencjometrów jest mierzone za pomocą przetwornika A/C (kanały: 4 i 5), sumowane i odpowiednio skalowane. Funkcją procedury Ustaw_us jest zadanie na wyjściu bloku sterującego z przetwornikiem DAC/PWM #1A, wzmacniaczem operacyjnym U4A oraz filtrami: R23/C23 i R24/C24, takiego poziomu napięciowego, by na wyjściu zasilacza ustaliło się napięcie o wartości Us. Jest to realizowane dwuetapowo.

Po pierwsze, napięcie Us jest porównywane z progami napięciowymi Us_hi_on oraz Us_hi_off i odnoszone do aktualnego stanu pracy bloku wykonawczego zasilacza (zakres napięć wysoki lub niski). Jeśli zachodzi taka potrzeba, to jest przełączane uzwojenie wtórne transformatora sieciowego oraz dioda Zenera D7, przy czym po załączeniu obu sekcji transformatora jest wprowadzone opóźnienie 150 ms, pozwalające na ustalenie się stabilnego wyższego napięcia Uz za prostownikiem D4 i na kondensatorach filtrujących C8…C10. Następnie, przed podaniem na wejście przetwornika DAC/PWM #1A, liczba sterująca jego wyjściem jest skalowana względem wzmocnienia Ku bloku pomiarowo-sterującego (ze wzmacniaczami operacyjnymi U4D i U5A), zakresu przetwarzania przetwornika DAC/PWM i napięcia odniesienia Vref oraz zaokrąglana do najbliższej wartości całkowitej.

Kolejna procedura, Pomiar_uo, odpowiada za pomiar napięcia wyjściowego Uo, który jest realizowany przez kanał #0 przetwornika A/C. Zmierzona wartość, w zakresie od 0 do 1023, jest skalowana do tego zakresu, napięcia referencyjnego Vref oraz wzmocnienia bloku pomiarowo-sterującego (około 1/6,3125 V/V). Procedura Filtruj_uo_lcd realizuje filtrowanie cyfrowe napięcia Uo za pomocą filtru IIR opisanego wzorem Uo_lcd(t)=0,8*Uo_lcd(t-1)+0,2*Uo(t). Jego zadaniem jest poprawienie stabilności i czytelności odczytu wartości Uo na ekranie LCD. Odbywa się to kosztem pewnej inercji odczytywanej wartości Uo względem szybkich zmian nastaw potencjometrami POT1 i POT2, co jednak nie wpływa na komfort obsługi.

Procedura Odczyt_im wyznacza wartość górnego limitu prądowego Im na podstawie nastaw potencjometrów POT3 (zgrubny) i POT4 (precyzyjny). Nastawy te są odczytywane za pomocą przetwornika A/C (kanały: 6 i 7) a następnie skalowane. Wartości nastaw, odczytane z obu potencjometrów, są finalnie sumowane, a jeśli rezultat sumowania jest mniejszy od 0,1 A, to wartość wynikowa Im jest podnoszona do tej właśnie minimalnej wartości limitu. Takie podejście poprawia stabilność pracy urządzenia przy skończonej wartości kroku limitu prądowego, równego około 5,4 mA (w zależności od wartości napięcia Vref). W wypadku pracy w podstawowym trybie wyświetlania na wyświetlaczu LCD (BASIC) zadana wartość nastawy Im jest też ograniczona do rastra równego 50 mA, co jest wartością rozsądną dla dozwolonego prądu Im w zakresie od 0,1 do 5,0 A. Na koniec jest liczona wartość parametru Im_lower, który stanowi górną granicę dopuszczalnego prądu wyjściowego Io przy podnoszeniu napięcia sterującego Us podczas wychodzenia ze stanu przeciążenia prądowego.

Kolejną procedurą jest Ustaw_im, której zadaniem jest ustawienie elektrycznej wartości progu prądowego Im dla komparatora U5B na wyjściu bloku sterującego z przetwornikiem DAC/PWM #1B, wzmacniaczem operacyjnym U4B oraz filtrami: R25/C25 i R26/C26. Przed podaniem na wejście przetwornika DAC/PWM liczba sterująca jest skalowana względem: szeregowej rezystancji probierczej R9, wzmocnienia bloku pomiarowego (ze wzmacniaczem operacyjnym U4C), napięcia odniesienia Vref oraz zakresu przetwarzania przetwornika DAC/PWM, a na koniec jest zaokrąglana do najbliższej wartości całkowitej. Procedura Pomiar_io odpowiedzialna jest za pomiar prądu wyjściowego Io, realizowany przez kanał #1 przetwornika A/C. Podobnie jak w wypadku procedury Ustaw_im, zmierzona wartość, w zakresie od 0 do 1023, jest skalowana do tego zakresu i napięcia referencyjnego Vref, a także do szeregowej rezystancji próbkującej R9 oraz do wzmocnienia bloku pomiarowego ze wzmacniaczem operacyjnym U4C (jakkolwiek w tych dwóch ostatnich przypadkach skalowanie odbywa się przez odwrotności z uwagi na odwrotny kierunek przekazywania sygnału).

Procedura Filtruj_io_lcd (podobnie, jak procedura Filtruj_uo_lcd) realizuje filtr cyfrowy zmierzonego prądu Io za pomocą filtru IIR opisanego wzorem Io_lcd(t)=0,8*Io_lcd(t-1)+0,2*Io(t). Także w tym wypadku chodziło o uzyskanie jak najlepszej stabilności i czytelności odczytu wartości Io na ekranie LCD.

Przedostatnia z procedur w tym module programowym to Pomiar_tr. Temperatura radiatora Tr jest odczytywana przez ADC (kanał #2) z wyjścia czujnika półprzewodnikowego U8. W dalszej jej części są realizowane obliczenia mające na celu uwzględnienie parametrów liniowego przetwarzania U=f(T) zastosowanego czujnika MCP9700AE: 0°C odpowiada napięciu 500 mV, a zmiana temperatury o 1°C powoduje zmianę napięcia na wyjściu czujnika o 10 mV. Na końcu tej procedury zastosowano filtr dolnoprzepustowy IIR o formule Tr(t)=0,98*Tr(t-1)+0,02*Tr(t). Ogranicza on pasmo przenoszonego sygnału, co wprowadza dość wyraźną inercję czasową, ale za to znakomicie stabilizuje odczyt wartości Tr, zakłócany sąsiednimi silnymi źródłami napięcia i prądu. Ostatnia z procedur podstawowych to Pomiar_uz. W ramach jej działania przetwornik ADC (kanał #3) mierzy główne napięcie Uz, zasilające blok wykonawczy stabilizatora a następnie skaluje je względem zakresu przetwarzania przetwornika, jego napięcia referencyjnego Vref oraz współczynnika podziału zastosowanego dzielnika napięciowego z elementami: R5, R6 i C11.

Ostatni moduł programu sterującego zasilaczem obejmuje podprogramy obsługi menu (listing 5). Pierwsza z ujętych w tym module procedur nazywa się po prostu Menu i w procesie obsługi menu konfiguracyjnego zasilacza ma charakter nadrzędny względem wszystkich dalszych procedur pomocniczych. Po prezentacji informacji o wejściu do menu aktywowana jest flaga Poschanged, wymuszająca wyświetlenie w kolejnym kroku wybranej pozycji menu (zmienna Selitem) wraz z aktualną wartością powiązanego z nią parametru. Następujący po niej ciąg instrukcji warunkowych Select…Case odpowiada właśnie za to zadanie. Dalej następuje obsługa przycisków sterujących SW1…SW4 (OPT, „^”, „v” oraz SET). Naciśnięcie przycisku OPT (SW1) w tym podprogramie spowoduje opuszczenie menu, poprzedzone stosownym komunikatem. Naciskanie przycisków SW2 (strzałka w górę) lub SW3 (strzałka w dół) sprawi, że zostanie wybrana poprzednia lub następna pozycja menu (zmienna Selitem) oraz aktywowana zostanie flaga Poschanged, wymuszająca odświeżenie zawartości ekranu LCD w kolejnej iteracji pętli obsługi menu. Natomiast po naciśnięciu przycisku SET (SW4) nastąpi aktywowanie kursora i przejście do realizacji podprogramu zmiany parametru konfiguracyjnego, wskazanego zmienną Selitem.

'>>>>>>>>>> LISTING_5 >>>>>>>>>>

'***********************************************************************************************************************
'********************************************** PODPROGRAMY OBSŁUGI MENU ***********************************************
'***********************************************************************************************************************
' Główne menu konfiguracji parametrów pracy zasilacza
Menu:
Cls
Upperline : Lcd "*** Entering ***"
Lowerline : Lcd "***** Menu *****"
Wait 1
Cls
Poschanged = 1 ' flaga zmian w menu -> wymuszenie wyświetlenia na początek

Do
If Poschanged = 1 Then ' wyświetl ponownie menu, jeśli była zmiana
Select Case Selitem
Case 1 : Cls : Upperline : Lcd "Show_params" : Lowerline : Lcd Show_params
Case 2 : Cls : Upperline : Lcd "Lcd_mode" : Lowerline : Lcd Lcd_mode
Case 3 : Cls : Upperline : Lcd "Buzzer_on" : Lowerline : Lcd Buzzer_on
Case 4 : Cls : Upperline : Lcd "Vref" : Lowerline : Lcd Fusing(vref , "#.##") ; " V "
Case 5 : Cls : Upperline : Lcd "Tr0" : Lowerline : Lcd Tr0 ; Chr(0) ; "C"
Case 6 : Cls : Upperline : Lcd "Tr1" : Lowerline : Lcd Tr1 ; Chr(0) ; "C"
Case 7 : Cls : Upperline : Lcd "Tr2" : Lowerline : Lcd Tr2 ; Chr(0) ; "C"
Case 8 : Cls : Upperline : Lcd "Us_hi_on" : Lowerline : Lcd Fusing(us_hi_on , "#.#") ; " V "
Case 9 : Cls : Upperline : Lcd "Us_hi_off" : Lowerline : Lcd Fusing(us_hi_off , "#.#") ; " V "
Case 10 : Cls : Upperline : Lcd "Ovldwait" : Lowerline : Lcd Ovldwait ; " usek. "
End Select
Locate 1 , 11 : Lcd "[menu]"
End If

'Obsługa klawiatury
Poschanged = 0
If Sw1_opt = 0 Then ' opuszczenie menu
Cls
Upperline : Lcd "**** Exiting ***"
Lowerline : Lcd "***** Menu *****"
Wait 1
Cls
Exit Do
End If
If Sw2__up = 0 And Selitem < 10 Then ' kolejna (wyższa) pozycja menu
Incr Selitem
Waitms 250
Poschanged = 1
Elseif Sw3_dwn = 0 And Selitem > 1 Then ' poprzednia (niższa) pozycja menu
Decr Selitem
Waitms 250
Poschanged = 1
End If
If Sw4_set = 0 Then ' obsługa zmiany wybranego parametru w submenu
Cursor On , Blink
Select Case Selitem
Case 1 : Gosub Show_pars_menu
Case 2 : Gosub Lcd_mode_menu
Case 3 : Gosub Buzzer_on_menu
Case 4 : Gosub Vref_menu
Case 5 : Gosub Tr0_menu
Case 6 : Gosub Tr1_menu
Case 7 : Gosub Tr2_menu
Case 8 : Gosub Us_hi_on_menu
Case 9 : Gosub Us_hi_off_menu
Case 10 : Gosub Ovldwait_menu
End Select
Cursor Off , Noblink
Waitms 250
End If
Loop
Return

' Podmenu wyświetlania parametrów konfiguracyjnych (zapisanych w EEPROM) przed rozpoczęciem właściwej pracy zasilacza
Show_pars_menu:
Cls
Do
Upperline : Lcd "Show_params"
Lowerline : Lcd Show_params
Locate 1 , 11 : Lcd "[chng]"
Waitms 150
If Sw1_opt = 0 Then ' wyjście z submenu
Poschanged = 1 ' wymuszenie odświeżenia opisu pozycji menu
Exit Do
Elseif Sw2__up = 0 Then ' zwiększenie wartości
Show_params = 1
Elseif Sw3_dwn = 0 Then ' zmniejszenie wartości
Show_params = 0
Elseif Sw4_set = 0 Then ' zapisz zmiany
Writeeeprom Show_params , 1
Locate 2 , 10 : Lcd "[saved]"
Wait 1
Locate 2 , 10 : Lcd " "
End If
Loop
Return

' Tryby wyświetlania na LCD: BASIC MODE -> 0 / SERVICE MODE -> 1
Lcd_mode_menu:
Cls
Do
Upperline : Lcd "Lcd_mode"
Lowerline : Lcd Lcd_mode
Locate 1 , 11 : Lcd "[chng]"
Waitms 150
If Sw1_opt = 0 Then ' wyjście z submenu
Poschanged = 1 ' wymuszenie odświeżenia opisu pozycji menu
Exit Do
Elseif Sw2__up = 0 Then ' zwiększenie wartości
Lcd_mode = 1
Elseif Sw3_dwn = 0 Then ' zmniejszenie wartości
Lcd_mode = 0
Elseif Sw4_set = 0 Then ' zapisz zmiany
Writeeeprom Lcd_mode , 2
Locate 2 , 10 : Lcd "[saved]"
Wait 1
Locate 2 , 10 : Lcd " "
End If
Loop
Return

' Używanie buzzer'a
Buzzer_on_menu:
Cls
Do
Upperline : Lcd "Buzzer_on"
Lowerline : Lcd Buzzer_on
Locate 1 , 11 : Lcd "[chng]"
Waitms 150
If Sw1_opt = 0 Then ' wyjście z submenu
Poschanged = 1 ' wymuszenie odświeżenia opisu pozycji menu
Exit Do
Elseif Sw2__up = 0 Then ' zwiększenie wartości
Buzzer_on = 1
Elseif Sw3_dwn = 0 Then ' zmniejszenie wartości
Buzzer_on = 0
Elseif Sw4_set = 0 Then ' zapisz zmiany
Writeeeprom Buzzer_on , 4
Locate 2 , 10 : Lcd "[saved]"
Wait 1
Locate 2 , 10 : Lcd " "
End If
Loop
Return

' Vref - napięcie referencyjne, pobierane ze stabilizatora LM7805 (ok. 5V w zakresie: 4.7..5.3V)
Vref_menu:
Cls
Do
Upperline : Lcd "Vref"
Lowerline : Lcd Fusing(vref , "#.##") ; " V "
Locate 1 , 11 : Lcd "[chng]"
Waitms 150
If Sw1_opt = 0 Then ' wyjście z submenu
Poschanged = 1 ' wymuszenie odświeżenia opisu pozycji menu
Exit Do
Elseif Sw2__up = 0 And Vref <= 5.29 Then ' zwiększenie wartości
Vref = Vref + 0.01
Elseif Sw3_dwn = 0 And Vref => 4.71 Then ' zmniejszenie wartości
Vref = Vref - 0.01
Elseif Sw4_set = 0 Then ' zapisz zmiany
Writeeeprom Vref , 8
Locate 2 , 10 : Lcd "[saved]"
Wait 1
Locate 2 , 10 : Lcd " "
End If
Loop
Gosub Pars_recalc ' przeliczenie parametrów zależnych od Vref
Return

' Próg zakończenia chłodzenia wentylatorem {STOP COOLER}
Tr0_menu:
Cls
Do
Upperline : Lcd "Tr0"
Lowerline : Lcd Tr0 ; Chr(0) ; "C "
Locate 1 , 11 : Lcd "[chng]"
Waitms 150
If Sw1_opt = 0 Then ' wyjście z submenu
Poschanged = 1 ' wymuszenie odświeżenia opisu pozycji menu
Exit Do
Elseif Sw2__up = 0 And Tr0 < 60 Then ' zwiększenie wartości
Incr Tr0
Elseif Sw3_dwn = 0 And Tr0 > 40 Then ' zmniejszenie wartości
Decr Tr0
Elseif Sw4_set = 0 Then ' zapisz zmiany
Writeeeprom Tr0 , 12
Locate 2 , 10 : Lcd "[saved]"
Wait 1
Locate 2 , 10 : Lcd " "
End If
Loop
Return

' Próg rozpoczęcia chłodzenia wentylatorem {START COOLER}
Tr1_menu:
Cls
Do
Upperline : Lcd "Tr1"
Lowerline : Lcd Tr1 ; Chr(0) ; "C "
Locate 1 , 11 : Lcd "[chng]"
Waitms 150
If Sw1_opt = 0 Then ' wyjście z submenu
Poschanged = 1 ' wymuszenie odświeżenia opisu pozycji menu
Exit Do
Elseif Sw2__up = 0 And Tr1 < 70 Then ' zwiększenie wartości
Incr Tr1
Elseif Sw3_dwn = 0 And Tr1 > Tr0 Then ' zmniejszenie wartości
Decr Tr1
Elseif Sw4_set = 0 Then ' zapisz zmiany
Writeeeprom Tr1 , 16
Locate 2 , 10 : Lcd "[saved]"
Wait 1
Locate 2 , 10 : Lcd " "
End If
Loop
Return

' Próg zastosowania procedury przegrzania {OVERHEATING}
Tr2_menu:
Cls
Do
Upperline : Lcd "Tr2"
Lowerline : Lcd Tr2 ; Chr(0) ; "C "
Locate 1 , 11 : Lcd "[chng]"
Waitms 150
If Sw1_opt = 0 Then ' wyjście z submenu
Poschanged = 1 ' wymuszenie odświeżenia opisu pozycji menu
Exit Do
Elseif Sw2__up = 0 And Tr2 < 80 Then ' zwiększenie wartości
Incr Tr2
Elseif Sw3_dwn = 0 And Tr2 > Tr1 Then ' zmniejszenie wartości
Decr Tr2
Elseif Sw4_set = 0 Then ' zapisz zmiany
Writeeeprom Tr2 , 20
Locate 2 , 10 : Lcd "[saved]"
Wait 1
Locate 2 , 10 : Lcd " "
End If
Loop
Return

' Próg napięciowy dla załączenia górnego zakresu zasilania i sterowania
Us_hi_on_menu:
Cls
Do
Upperline : Lcd "Us_hi_on"
Lowerline : Lcd Fusing(us_hi_on , "#.#") ; " V "
Locate 1 , 11 : Lcd "[chng]"
Waitms 150
If Sw1_opt = 0 Then ' wyjście z submenu
Poschanged = 1 ' wymuszenie odświeżenia opisu pozycji menu
Exit Do
Elseif Sw2__up = 0 And Us_hi_on < 20 Then ' zwiększenie wartości
Us_hi_on = Us_hi_on + 0.1
Elseif Sw3_dwn = 0 And Us_hi_on > 10 Then ' zmniejszenie wartości
Us_hi_on = Us_hi_on - 0.1
Elseif Sw4_set = 0 Then ' zapisz zmiany
Writeeeprom Us_hi_on , 24
Locate 2 , 10 : Lcd "[saved]"
Wait 1
Locate 2 , 10 : Lcd " "
End If
Loop
Return

' Próg napięciowy dla załączenia dolnego zakresu zasilania i sterowania
Us_hi_off_menu:
Cls
Do
Upperline : Lcd "Us_hi_off"
Lowerline : Lcd Fusing(us_hi_off , "#.#") ; " V "
Locate 1 , 11 : Lcd "[chng]"
Waitms 150
If Sw1_opt = 0 Then ' wyjście z submenu
Poschanged = 1 ' wymuszenie odświeżenia opisu pozycji menu
Exit Do
Elseif Sw2__up = 0 And Us_hi_off < Us_hi_on Then ' zwiększenie wartości
Us_hi_off = Us_hi_off + 0.1
Elseif Sw3_dwn = 0 And Us_hi_off > 9 Then ' zmniejszenie wartości
Us_hi_off = Us_hi_off - 0.1
Elseif Sw4_set = 0 Then ' zapisz zmiany
Writeeeprom Us_hi_off , 28
Locate 2 , 10 : Lcd "[saved]"
Wait 1
Locate 2 , 10 : Lcd " "
End If
Loop
Return

' Opóźnienie dodane w obsłudze przerwania od przeciążenia
Ovldwait_menu:
Cls
Do
Upperline : Lcd "Ovldwait"
Lowerline : Lcd Ovldwait ; " usek. "
Locate 1 , 11 : Lcd "[chng]"
Waitms 150
If Sw1_opt = 0 Then ' wyjście z submenu
Poschanged = 1 ' wymuszenie odświeżenia opisu pozycji menu
Exit Do
Elseif Sw2__up = 0 And Ovldwait <= 9999 Then ' zwiększenie wartości
Ovldwait = Ovldwait + 1
Elseif Sw3_dwn = 0 And Ovldwait >= 2 Then ' zmniejszenie wartości
Ovldwait = Ovldwait - 1
Elseif Sw4_set = 0 Then ' zapisz zmiany
Writeeeprom Ovldwait , 32
Locate 2 , 10 : Lcd "[saved]"
Wait 1
Locate 2 , 10 : Lcd " "
End If
Loop
Return

Dalsza część omawianego tutaj modułu programowego obejmuje właśnie zestaw dziesięciu bliźniaczych podprogramów modyfikacji parametrów konfiguracyjnego: Show_params, Lcd_mode, Buzzer_on, Vref, Tr0, Tr1, Tr2, Us_hi_on, Us_hi_off oraz Ovldwait. Każdy z tych podprogramów rozpoczyna się od wyświetlenia nazwy i bieżącej wartości właściwego mu parametru wraz z hasłem „[chng]” informującym o tym, że aktualnie możliwa jest modyfikacja wartości danego parametru. Dalej następuje obsługa przycisków sterujących: naciśnięcie OPT (SW1) spowoduje opuszczenie podprogramu ze wskazaniem na konieczność odświeżenia treści ekranu LCD, naciskanie strzałek w górę lub w dół (SW2, SW3) wywoła zmianę (+/–) danego parametru natomiast wciśnięcie przycisku SET (SW4) wymusi zapisanie aktualnej wartości modyfikowanego parametru w pamięci EEPROM, po którym nastąpi wyświetlenie na LCD komunikatu statusowego „[saved]”.

Rysunek 16. Zalecana konfiguracja fusebitów mikrokontrolera U6

Przed zaprogramowaniem mikrokontrolera U6 należy ustawić w nim właściwą konfigurację fusebitów, których zalecane wartości przedstawiono na rysunku 16.

Konfiguracja i regulacja zasilacza

W przypadku prawidłowego montażu zasilacza jego regulacja i konfiguracja nie powinny nastręczać większych trudności. Na fotografii wnętrza i schemacie montażowym zasilacza pokazano komplet potencjometrów montażowych, których kolejność (patrząc od lewej strony) jest następująca: PR7, PR6, PR4, PR3, PR2, PR1 i PR5. W pierwszej kolejności dokonujemy regulacji kontrastu wyświetlacza LCD (U7) za pomocą potencjometru PR5. Następnie włączamy zasilacz i obserwujemy to, co jest wyświetlane na LCD.

Fotografia 17. Ekrany: powitania, trybu podstawowego i serwisowego

Na fotografii 17 pokazano kolejne ekrany prezentujące: powitanie, ekrany robocze w trybie podstawowym BASIC oraz w trybie serwisowym SERVICE. Kolejne dziesięć ekranów ujmuje automatyczną prezentację wszystkich konfigurowalnych parametrów, która nastąpi przed przejściem do normalnej pracy zasilacza, jeśli wartość parametru Show_params=1. Natomiast tryb prezentacji parametrów roboczych na LCD zależy od ustawienia wartości parametru Lcd_mode (0 – BASIC, 1 – SERVICE).

Fotografia 18. Konfigurowanie parametrów – część 1

Na fotografiach 18 i 19 zaprezentowano kompletny cykl konfiguracji wszystkich dziesięciu parametrów, który będzie dostępny po wejściu do menu urządzenia poprzez naciśnięcie przycisku OPT. W trybie przeglądu parametrów w menu w prawym górnym rogu ekranu LCD jest wyświetlany komunikat „[menu]”, który po naciśnięciu przycisku SET zmienia się na komunikat „[chng]” informujący o tym, że możliwa jest modyfikacja danego parametru. Zmiany pozycji menu, podobnie, jak zmiany wartości poszczególnych parametrów, wykonujemy przyciskami „up/+” (oznaczony strzałką w górę) oraz „down/–” (oznaczony strzałką w dół). Zatwierdzenie i zapisanie w pamięci EEPROM wartości danego parametru następuje po naciśnięciu przycisku SET i jest sygnalizowane poprzez uaktywnienie czasowe (na około 1 s) w prawym donym rogu ekranu LCD napisu „[saved]”. Z kolei za pomocą przycisku OPT możemy opuścić zarówno podmenu modyfikacji danego parametru, jak i (ostatecznie) całego menu konfiguracyjnego. Parametr Show_params można ustawić na wartość 0 po skrystalizowaniu się ostatecznej konfiguracji zasilacza (unikniemy dzięki temu opóźnienia w jego uruchamianiu, spowodowanego wyświetlaniem ustawień konfiguracyjnych).

Fotografia 19. Konfigurowanie parametrów – część 2

Parametr Lcd_mode normalnie powinien być ustawiony na wartość 0 (tryb wyświetlania podstawowy – BASIC), jednak w trakcie strojenia konfiguracji i diagnostyki zasilacza może być użyteczny tryb serwisowy SERVICE (Lcd_mode=1). Parametr Buzzer_on ustawiamy według własnych preferencji: wartość 0 sprawi, że stany: przekroczenia wyznaczonego limitu prądu Im (stan OVERLOAD) oraz przekroczenia dopuszczalnej temperatury Tr2 (OVERHEATING) nie będą sygnalizowane dodatkowo sygnałem dźwiękowym. Natomiast kluczowe na tym etapie konfiguracji zasilacza jest dokładne ustawienie wartości parametru Vref (napięcie referencyjne dla pomiarów napięć i prądu), którego rzeczywistą wartość należy uprzednio zmierzyć dobrej klasy woltomierzem (na jak najniższym zakresie pomiarowym) na wyjściu (wyprowadzenie 3) stabilizatora U2 (LM7805), który jest łatwo dostępny do pomiaru na górnej krawędzi płytki. Należy tu podkreślić, że o ile stabilność temperaturową napięcia wyjściowego stabilizatorów scalonych z rodziny LM78xx można uznać za całkowicie wystarczającą do uzyskania napięcia odniesienia dla celów pomiarowych w zasilaczu warsztatowym, o tyle trzeba mieć świadomość znacznej tolerancji tego napięcia w różnych egzemplarzach układu (katalogowo jest to aż 4% dla wersji CT i 2% dla wersji ACT kostki).

Po ustawieniu i zapamiętaniu w pamięci EEPROM właściwej wartości napięcia Vref można już przystąpić do regulacji pozostałych potencjometrów montażowych PRn, jednak warto od razu dokończyć wstępną konfigurację pozostałych parametrów. Kolejnymi z nich są progi temperaturowe: Tr0, Tr1, Tr2, których przekroczenie wyzwala zdarzenia: zakończenia i załączenia chłodzenia wentylatorem (Tr0 i Tr1) oraz aktywację i dezaktywację stanu przegrzania (Tr1 i Tr2). Praktyczna wartość progu termicznego dla załączenia chłodzenia Tr1 powinna leżeć w zakresie od 55 do 65°C (zalecane 60°C), natomiast pozostałe dwa progi powinny być od niego odległe o 5 do 15°C, zapewniając odpowiedni odstęp pomiędzy momentami aktywacji i dezaktywacji poszczególnych stanów pracy (zalecane Tr0=50°C, Tr2=70°C). Należy przy tym pamiętać, że zbyt duża temperatura Tr2 (OVERHEATING) może doprowadzić do uszkodzenia zasilacza, więc nie należy z nią przesadzać (w oprogramowaniu konfiguracyjnym ustalono limit 80°C).

Kolejne dwa parametry to progi napięciowe Us_hi_on oraz Us_hi_off, których wartości decydują o momentach przełączenia sekcji transformatora sieciowego oraz bloku sterującego stabilizatora D7. Różnica wartości między tymi progami zapewnia odpowiednią histerezę procesu dla dwukierunkowego przełączania, dzięki której dynamiczne zmiany napięcia sterującego Us w okolicach wartości progowych nie powodują częstych przełączeń zakresów zasilania Uz i sterowania napięciem wyjściowym Uo.

W tym miejscu należy podkreślić, że podane wartości progów napięciowych: Us_hi_on =15,2 V oraz Us_hi_off=14,8 V (15,0 V ±0,2 V), są odpowiednie dla zastosowanego transformatora sieciowego typu TST200/006 i diody Zenera D7 (15 V). Natomiast stosując inny transformator sieciowy, może być konieczna zmiana wartości tych progów oraz dobór diody D7 na inne napięcie Zenera (rekomendowana wartość powinna być jak najbardziej zbliżona do połowy maksymalnego osiągalnego napięcia wyjściowego Uo). W wypadku zastosowania innego transformatora sieciowego przydatny może okazać się tryb serwisowy wyświetlania parametrów (Lcd_mode=1), w którym jest możliwa także obserwacja wartości głównego napięcia stałego Uz, zasilającego blok wykonawczy stabilizatora. Napięcie to, pod pełnym możliwym obciążeniem prądowym zasilacza, powinno być wyższe o co najmniej 2 V od uzyskiwanego napięcia wyjściowego Uo i. Kierując się tą wskazówką, należy dobrać ewentualne nowe progi napięć Us_hi_on i Us_hi_off, koniecznie z zachowaniem histerezy napięciowej. Jest to warunek konieczny dla prawidłowej pracy szeregowego elementu regulacyjnego z tranzystorem Darlingtona Q2…Q3 oraz dla minimalizacji przenoszenia się tętnień o częstotliwości 100 Hz z wyprostowanego napięcia zasilającego Uz na napięcie wyjściowe Uo przy dużym obciążeniu zasilacza.

Ostatnim konfigurowalnym programowo parametrem jest opóźnienie czasowe Ovldwait wyrażone w mikrosekundach. Definiuje ono czas trwania jednostkowej reakcji na stan przeciążenia prądowego (przekroczenie limitu Im) wywoływanego przez przerwanie INT1 i realizującego elementarną redukcję napięcia sterującego Us o wartość kroku Us_chng. Możliwe wartości mieszczą się w zakresie od 1 do 10000 ms. Jeśli zależy nam na jak najszybszej reakcji na stan zwarcia na wyjściu zasilacza, to należy ustawić wartość minimalną 1 ms. Zapewni ona błyskawiczną redukcję napięcia wyjściowego Uo, a zatem i prądu wyjściowego Io, jednak kosztem dalszego powolnego powrotu do pożądanego napięcia wyjściowego Uo. Jeśli chcemy uzyskać efekt pracy zasilacza jako źródła prądowego o wydajności zbliżonej do wartości Im, nadążającego z napięciem wyjściowym Uo za zmianami obciążenia, to należy ustawić większe opóźnienie Ovldwait. Optymalnej wartości tego parametru należy wówczas szukać w zakresie od 3000 do 5000 ms. Można też przyjąć strategię modyfikacji wartości opóźnienia Ovldwait w zależności od tego, z jakim rodzajem obciążenia i w jakich warunkach laboratoryjnych zamierzamy pracować. Po zakończeniu konfiguracji ostatniego z omawianych parametrów opuszczamy menu poprzez naciśnięcie przycisku OPT.

Mając skonfigurowany wstępnie komplet parametrów programowalnych, przystępujemy do regulacji pozostałych potencjometrów montażowych: PR1...PR4 oraz PR6 i PR7. Jako punktu odniesienia (masy) dla wszelkich pomiarów napięciowych wygodnie będzie użyć wyprowadzenia „stopki” (radiatora) łatwo dostępnego na górnej krawędzi PCB stabilizatora U2 (LM7805), do której ujemny zacisk woltomierza można dogodnie dopiąć na czas pomiarów za pomocą zacisku typu krokodylek. W pierwszej kolejności należy zweryfikować i ewentualnie skorygować wartość napięcia +20 V, zasilającego wzmacniacz operacyjny U5 i dostępnego na wyjściu (wyprowadzenie 2) stabilizatora scalonego U3 (LM317L). Z uwagi na nieco utrudniony dostęp do potencjalnych punktów pomiarowych (wyjście U3 lub zasilanie U5) pomiar regulacyjny wygodnie jest przeprowadzić metodą pośrednią – poprzez zmierzenie napięcia na suwaku (środkowym wyprowadzeniu) potencjometru PR1, którym regulujemy aż do uzyskania napięcia około +18,75 V we wskazanym punkcie, połączonym jednocześnie z pinem 1 (ADJUST) układu U3 (jego potencjał jest niższy od wyjściowego napięcia stabilizowanego kości LM317L o wartość napięcia odniesienia 1,25V). Kolejna regulacja powinna dotyczyć pętli ujemnego sprzężenia zwrotnego dla kontroli napięcia wyjściowego Uo, opartej o wzmacniacz różnicowy, w którego układzie pracują m.in. wzmacniacz operacyjny U4D oraz potencjometry PR2 i PR3. Poprawna regulacja PR2 i PR3 wymagałaby jednoczesnej manipulacji nastawieniami obu tych elementów – i to z uwzględnieniem niezerowej wartości prądu wyjściowego Io, co w praktyce mogłoby okazać się niezwykle trudne do prawidłowej realizacji także przez bardziej doświadczonych czytelników. Dlatego autor tego projektu proponuje nieco inne, nie mniej skuteczne a znacznie dogodniejsze rozwiązanie. Mianowicie, w założeniach projektu przyjęto, że przy idealnie dokładnych wartościach elementów w gałęziach dzielników: R12–PR2–R13 i R15–PR3–R14, oraz przy ustawieniach suwaków PR2 i PR3 dokładnie w połowach zakresów ich regulacji, ich wzmocnienia napięciowe powinny wynosić odpowiednio: Ku’=(1,5 kΩ+100 Ω)/(1,5 kΩ+200 Ω+10 kΩ=0,136752 V/V i Ku”=(10 kΩ+100 Ω)/(1,5 kΩ+200 Ω+10 kΩ)=
0,863248 V/V (podane wartości podziałów dzielników rezystancyjnych zostały oczywiście uwzględnione także w oprogramowaniu sterującym zasilaczem). Zadaniem osoby regulującej jest po prostu ustawienie suwaków potencjometrów PR2 i PR3 tak, by jak najbardziej zbliżyć się do podanych wartości. Przykładowo, proces ten mógłby wyglądać następująco:

  • Na wyjściu nieobciążonego zasilacza ustawiamy napięcie równe około 19,5 V, a następnie multimetrem mierzymy i zapisujemy dokładną jego wartość Uo.
  • Dla Uo=19,50 V wyliczamy napięcie U’=Ku’*Uo=0,136752*19,50 V=2,667 V (dla potencjału suwaka PR2) i regulujemy PR2 tak długo, aż osiągniemy zgodność obu napięć, tzn. przykładowo U’=2,667 V przy Uo=19,50 V.
  • Mierzymy multimetrem i zapisujemy dokładną wartość napięcia na wyjściu wzmacniacza operacyjnego U4D (pin 14), które w przybliżeniu powinno być równe U(U4D/p.14)=U’/Ku”=2,667/0,863248 V=3,089 V. Mierzenie napięcia U(U4D/p.14) w zmontowanym zasilaczu najwygodniej jest wykonać na pinie 40 mikrokontrolera U6, gdzie jest ono doprowadzane w celu pomiaru przez wewnętrzny przetwornik A/C.
  • Mając do dyspozycji zmierzoną rzeczywistą wartość napięcia U(U4D/p.14), wyznaczamy wartość napięcia U”=U(U4D/p.14)*Ku” (dla potencjału suwaka PR3), które przykładowo dla U(U4D/p.14)=3,089 V powinno wynosić U”=3,089 V*0,863248 V=2,667 V (takie samo, jak przyjęte wcześniej U’ – z uwagi na pracę ujemnej pętli sprzężenia zwrotnego).
  • Regulujemy PR3 tak długo, aż osiągniemy odpowiednią proporcjonalność obu napięć, tzn. np.: U”=2,667 V przy U(U4D/p.14)=3,089 V.
  • Weryfikujemy rezultaty przeprowadzonych regulacji zgodnie z przedstawionym powyżej cyklem i ewentualnie dokonujemy naprzemiennych regulacji potencjometrami PR2 i PR3, aż do spełnienia obu podanych warunków proporcjonalności napięć.

Uwaga: nieprecyzyjne wykonanie opisanych czynności regulacyjnych może skutkować nie tylko niedokładną pracą zasilacza, ale także niestabilnością jego działania (oscylacje na wyjściu), dlatego do tego zadania należy podejść niezwykle starannie!

Regulacja wzmacniacza pomiarowego prądu wyjściowego Io (ze wzmacniaczem operacyjnym U4C i dzielnikiem napięciowym R19/R20/PR4/R21) sprowadza się do ustawienia potencjometru PR4 tak, aby wskazywana na ekranie LCD wartość prądu Io była zgodna z odczytem na odpowiednio dokładnym amperomierzu prądu stałego. Można do tego celu wykorzystać sztuczne obciążenie stałoprądowe o prądzie 5 A lub większym (np. AVT-5586, https://goo.gl/uhQVNU) lub rezystor dużej mocy. Przy regulacji egzemplarza prototypowego autor użył zestawu połączonych równolegle pięciu 10-watowych oporników o rezystancji 10 Ω. W egzemplarzu prototypowym kalibrację pomiaru Io wykonano przy prądzie obciążenia około 4,9 A i nastawionym maksymalnym limicie prądowym Im=5,0 A.

Ostatnie dwie regulacje dotyczą potencjometrów PR6 i PR7, odpowiedzialnych za precyzyjne zerowanie napięć referencyjnych, przeznaczonych do ustalenia napięcia Us, sterującego napięciem wyjściowym Uo, oraz progu (limitu) prądowego Im. Za zerowanie napięcia Us jest odpowiedzialny potencjometr PR6. Jego regulację wykonujemy przy napięciu wyjściowym Uo zasilacza ustawionym dokładnie na 0,00 V. Pomiar tego napięcia wykonujemy na zakresie woltomierza 0…199,9 mV lub niższym. Potencjometr PR6 należy obracać powoli w kierunku, dla którego Uo będzie malało – aż do momentu, w którym przestanie ono spadać (w egzemplarzu prototypowym udało się uzyskać Uo=0,4 mV). Precyzyjne zerowanie Uo potencjometrem PR6 jest o tyle istotne, że pozwala zapobiec konsekwencjom przepływu znacznego prądu zwarciowego Io, jeśli nastawione teoretycznie Uo wynosi 0,00 V i – wobec tego – nie spodziewamy się przepływu prądu w obwodzie wyjściowym. Natomiast precyzyjna regulacja potencjometru PR7 (zerowanie limitu prądowego Im) nie jest już tak krytyczna z uwagi na wprowadzenie do projektu dolnego limitu prądu Im=100 mA. Dlatego w praktyce wystarczy, że potencjometr PR7 ustawimy w pozycji maksymalnie zbliżonej do tej, w której wcześniej ustawiliśmy potencjometr PR6 (obie omówione gałęzie kompensacyjne działają w bardzo zbliżonych konfiguracjach układowych i w oparciu o te same lub niemal identyczne podzespoły).

Użytkowanie i obsługa zasilacza

Fotografia 20. Oscylogram z testów z obciążeniem impulsowym (@ Uo=10 V, Rl=10/20 Ω, F=100 Hz)

Po załączeniu zasilania i przejściu do normalnego trybu pracy można przystąpić do ustawienia napięcia wyjściowego Uo i limitu prądu Im. Następnie można przyłączyć obciążenie. Prawidłowość wykonania montażu i wszelkich regulacji można sprawdzić z zastosowaniem obciążenia stałoprądowego i impulsowego. Fotografia 20 zawiera oscylogram z testów impulsowych, w których ustawiono Uo=10 V, natomiast obciążeniem były dwa połączone szeregowo oporniki o mocy 10 W i rezystancji 10 V. Jeden z tych rezystorów był zwierany z częstotliwością 100 Hz. Na dole oscylogramu widać przebieg kluczujący, natomiast przebieg górny to składowa zmienna napięcia wyjściowego Uo. Jak widać, pulsacje spowodowane zmiennym obciążeniem nie przekroczyły poziomu 20 mVp-p. Na fotografii 21 pokazano fragment przedniego panelu zasilacza w trakcie pracy z ograniczeniem prądowym z parametrem opóźnienia Ovldwait=5000 ms. Stan ograniczenia prądowego sygnalizuje zaświecony LED OVERLOAD, natomiast rzeczywista wartość prądu Io wynosi 390 mA i (z założenia) jest nieco mniejsza od ustawionego limitu prądowego Im=400 mA.

Fotografia 21. Panel sterujący zasilacza w trakcie pracy z ograniczeniem prądowym w trybie ciągłym (@ Ovldwait=5000 µs)

Na fotografii 22 pokazano oscylogram napięcia wyjściowego Uo (przebieg górny) przy przełączanym tranzystorem N-MOSFET obciążeniu 10/20 Ω przebiegiem pokazanym na dole oscylogramu. W tym wypadku częstotliwość przełączania wynosiła tylko 1 Hz, a poziom ograniczenia prądowego Im był ustawiony na połowę prądu występującego przy obciążeniu 10 Ω lub 20 Ω. Ograniczenie prądowe skonfigurowanego do powolnej pracy wolno podwyższało napięcie wyjściowe Uo po rozwarciu bocznika jednego z rezystorów 10 Ω i gwałtownie obniżało je, gdy rezystancja obciążenia spadała z 20 Ω do 10 Ω (nieustalony stan pracy tego mechanizmu).

Fotografia 22. Oscylogram z dynamicznych testów ograniczenia prądowego w trybie ciągłym (@ F=1 Hz)

Na fotografii 23 pokazano komunikat wyświetlany po przekroczeniu przez radiator progu temperatury Tr2 i wejściu urządzenia w stan tzw. przegrzania. Cyklicznie jest powtarzana treść trzech kolejnych komunikatów, przy czym ostatni prezentuje wartość temperatury bieżącej radiatora Tr.

Fotografia 23. Zawartości wyświetlacza LCD w stanie przegrzania zasilacza (OVERHEATING)

Podsumowanie projektu

W artykule kompleksowo opisano projekt zasilacza laboratoryjno-warsztatowego o parametrach konstrukcyjnych i użytkowych, które pozwalają mu skutecznie konkurować (także cenowo) z gotowymi urządzeniami, dostępnymi „ze sklepowej półki”. Znaczącą wartością dodaną są spore możliwości konfiguracji urządzenia wg osobistych preferencji, a także modyfikacji konstrukcji pod kątem własnych potrzeb. Projekt jest przeznaczony dla osób, które chcą mieć zasilacz warsztatowy o niezłych parametrach, kompaktowej, zwartej konstrukcji i niewygórowanym koszcie realizacji oraz dla osób, które pragną poszerzyć swoją wiedzę konstruktorską w zakresie urządzeń zasilających lub zmodernizować posiadane już przyrządy. Więcej informacji o dalszych losach tego projektu można będzie znaleźć na stronie WWW autora pod adresem https://goo.gl/BKmz4T. Na koniec chciałbym serdecznie podziękować koledze Jerzemu Mroszczakowi SQ7JHM (https://goo.gl/NvfYPC) za podzielenie się dużym praktycznym doświadczeniem w zakresie konstruowania zasilaczy liniowych o znacznej mocy znamionowej.

Adam Sobczyk SQ5RWQ
sq5rwq@gmail.com
http://sq5rwq.pl

Artykuł ukazał się w
Elektronika Praktyczna
styczeń 2018
DO POBRANIA
Pobierz PDF Download icon
Materiały dodatkowe
KIT do tego projektu
Zasilacz laboratoryjny 0-30V 5A ze sterowaniem mikroprocesorowym, AVT5585
Zasilacz laboratoryjny 0-30V 5A ze sterowaniem mikroprocesorowym, AVT5585
Uniwersalny zasilacz laboratoryjny 0-30V 5A ze sterowaniem mikroprocesorowym. Urządzenie szczególnie polecane w każdym laboratorium elektronicznym;...
Zobacz w sklepie

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik wrzesień 2021

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio wrzesień - październik 2021

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka Podzespoły Aplikacje wrzesień 2021

Automatyka Podzespoły Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna wrzesień 2021

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich wrzesień 2021

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów