Zasilacz warsztatowy (2)

Zasilacz warsztatowy (2)

Jakiś czas temu na jednym z forów poświęconych praktycznym konstrukcjom elektronicznym, pewien uczestnik zadał pytanie o możliwość samodzielnego zbudowania zasilacza do swojej pracowni. Z kontekstu wynikało, że jest raczej początkujący i szuka prostych, sprawdzonych konstrukcji łatwych do powielenia. Początkowo dyskusja koncentrowała się wokół tego, co ewentualnie można wykonać nie mając doświadczenia. Jednak dość szybko ktoś zapytał: po co robić, jeżeli można kupić? Szybko, tanio i podobno dobrze. Czy na pewno? W drugiej części artykułu kontynuujemy opis naszego zasilacza DIY – tym razem skupimy się na sterowniku oraz aspektach montażowych urządzenia.

Podstawowe parametry:
  • konstrukcja: liniowa z szeregowym tranzystorem MOSFET i sterowaniem cyfrowym,
  • napięcie wyjściowe: 1...24 V z rozdzielczością 500 mV,
  • prąd wyjściowy: 50...1000 mA z rozdzielczością 50 mA,
  • sprzętowe zabezpieczenie nadprądowe sterowane cyfrowo,
  • obsługa za pomocą dwóch enkoderów obrotowych i wyświetlacza THT 128×160 px,
  • wbudowany przycisk do szybkiego załączania i wyłączania wyjścia.

Interfejs użytkownika – sterownik mikroprocesorowy

Druga, po torze analogowym, część zasilacza to sterownik mikroprocesorowy. Spełnia on dwie podstawowe funkcje:

  • ustawia napięcie wyjściowe i wartość ograniczenia prądowego przez podawanie napięć z przetworników cyfrowo-analogowych na wejścia USet i ISet oraz mierzy napięcie wyjściowe UMeter i prąd wyjściowy IMeter za pomocą przetworników analogowo-cyfrowych;
  • realizuje funkcje interfejsu użytkownika z obsługą kolorowego wyświetlacza LCD-TFT, impulsatorów nastawczych i klawisza START. Wbudowana nieulotna pamięć EEPROM zapamiętuje bieżące nastawy i odtwarza je po włączeniu zasilania.

Schemat sterownika został pokazany na rysunku 12.

Rysunek 12. Schemat sterownika zasilacza

Układ zasilania modułu sterownika

Moduł sterownika jest zasilany napięciem +12 V, pochodzącym z modułu sekcji analogowej, przez 8-pinowe złącze goldpin oznaczone POWER. Stabilizator U4 typu 7805 jest zasilany napięciem +12 V i dostarcza napięcie +5 V, które zasila dwa kolejne stabilizatory o napięciu wyjściowym +3,3 V: U3 typu 1117 oraz U2 typu MIC5207. Stabilizator U3 obsługuje część cyfrową sterownika, czyli mikrokontroler i pamięć EEPROM (U2 typu 24C32) z interfejsem I²C. Drugi stabilizator U2 (MIC5207) jest źródłem napięcia +3,3 V dla obwodów analogowych sterownika, które poprzez pin AVDD zasila także wewnętrzne bloki analogowe mikrokontrolera: przetworniki DAC i PADC, komparatory, wzmacniacze operacyjne i źródło napięcia odniesienia. Wbudowany 16-bitowy przetwornik ADC typu delta-sigma (tu nie wykorzystywany) jest natomiast zasilany przez wyprowadzenie SVDD. Napięcie +3,3 V ze stabilizatora U2 jest również odniesieniem dla przetwornika analogowo-cyfrowego PADC oraz zasila układ czujnika prądu INA250 na płytce sekcji analogowej zasilacza.

Jak się łatwo domyślić, zastosowanie dodatkowego, niskoszumnego stabilizatora zasilającego tylko układy analogowe, ma na celu znacząco ograniczyć przenikanie impulsowych zakłóceń przenoszonych po liniach zasilania z części cyfrowej urządzenia do obwodów analogowych.

Mikrokontroler modułu sterownika

W projekcie zastosowano 16-bitowy mikrokontroler PIC24FJ128GC006. Podstawowym kryterium wyboru tego układu były jego analogowe układy peryferyjne, konieczne do budowy opisanego poprzednio, analogowego toru zasilacza. Producent – firma Microchip – chwali się dobrymi parametrami analogowymi tego układu:

  • 12-bitowym, szybkim przetwornikiem analogowo-cyfrowym PADC z zaawansowanymi funkcjami akwizycji, takimi jak auto-accumulate czy Threshold Detect,
  • 16-bitowym przetwornikiem analogowo-cyfrowym ADC z modulatorem delta-sigma,
  • dwoma 10-bitowymi przetwornikami cyfrowo-analogowymi DAC,
  • dwoma wzmacniaczami operacyjnymi Rail-to-Rail o paśmie przenoszenia 2,5 MHz,
  • trzema komparatorami Rail-to-Rail,
  • wbudowanym programowalnym źródłem napięcia odniesienia.

W układzie zasilacza zastosowano 12-bitowy przetwornik analogowo-cyfrowy PADC do pomiaru napięcia wyjściowego zasilacza i do pomiaru prądu wyjściowego. Dwa przetworniki cyfrowo-analogowe zostały użyte do ustawiania napięcia wyjściowego zasilacza i do ustawienia poziomu ograniczenia prądowego. Pierwotnie planowano wykorzystanie zewnętrznych przetworników ADC i DAC o dobrej dokładności i liniowości, ale ostatecznie wybór padł na wbudowane moduły. Parametry przetworników znajdujących się w mikrokontrolerach są zazwyczaj gorsze w porównaniu do zewnętrznych układów tego typu. Założono jednak, że w przypadku niewystarczającej dokładności konwersji wprowadzone zostaną korekty programowe, a zastosowanie wbudowanych modułów znacznie upraszcza projekt. Należy też pamiętać, że nie budujemy tutaj przyrządu pomiarowego, ale zasilacz warsztatowy, zatem nie będą potrzebne bardzo dokładne pomiary.

Jak wiemy, w sekcji analogowej zasilacza zostały użyte wzmacniacze operacyjne pełniące funkcje wzmacniacza błędu i wzmacniacza napięcia stałego. Są to podwójne wzmacniacze typu OP296. Podstawowym powodem, dla którego nie zostały użyte wzmacniacze wbudowane w mikrokontroler, jest zbyt duży offset wejściowy, wynoszący typowo 2 mV, a maksymalnie nawet 14 mV. To mogło powodować problemy z poprawnym działaniem (dokładnością) układu regulacji, jak i układu pomiarowego. Zastosowany ostatecznie wzmacniacz operacyjny ma typowy, katalogowy offset na poziomie ok 30 μV, a maksymalny na poziomie 300 μV. Ponadto jest on przystosowany do pracy z pojedynczym napięciem zasilania +12 V, co upraszcza układ zasilania.

Oprócz bardzo istotnej sekcji analogowej, mikrokontroler sterujący graficznym wyświetlaczem TFT z interfejsem SPI powinien być stosunkowo szybki. Niestety, z tym nie jest najlepiej. Niezbyt szybki, 16-bitowy rdzeń PIC24F taktowany częstotliwością 16 MHz to istotne ograniczenie i dlatego zastosowano ekran o relatywnie małej rozdzielczości 128×160 pikseli, niewymagający przesyłania przez SPI dużych ilości danych przeznaczonych do wyświetlania. Chodziło o to, by interfejs użytkownika był w miarę responsywny. Lepszym wyborem byłby mikrokontrolery z rdzeniem ARM, np. STM32F4 lub ESP32, ale autorowi zależało na dobrej jakości sekcji analogowej zintegrowanej w jednym mikrokontrolerze. Ostatecznie, po zastosowaniu zabiegów optymalizacyjnych, PIC24F poradził sobie z tym zadaniem.

Przetwornik analogowo-cyfrowy

Microchip wbudował w mikrokontroler nietypowy, 12-bitowy przetwornik nazwany High Speed Pipeline A/D Converter, czyli przetwornik analogowo-cyfrowy z przetwarzaniem potokowym. W typowym konwerterze SAR faza próbkowania to czas, w którym kondensator próbkujący (S/H) konwertera analogowo-cyfrowego jest podłączony do analogowego wyprowadzenia wejściowego. Proces próbkowania jest uruchamiany przez obwody przetwornika analogowo-cyfrowego na przykład poprzez programowe wymuszenie konwersji. Dla każdego konwertera jest zdefiniowany minimalny czas próbkowania, który gwarantuje, że kondensator S/H zapewni wystarczającą dokładność konwersji analogowo-cyfrowej. Zdarzenie wyzwalające konwersję A/C rozpoczyna odliczanie czasu próbkowania. Po upływie tego czasu układy sprzętowe przetwornika automatycznie rozpoczynają konwersję, a jej czas jest potrzebny przetwornikowi analogowo-cyfrowemu na przekonwertowanie napięcia utrzymywanego przez kondensator S/H na postać cyfrową. Sekwencja czasowa konwersji A/C typu SAR została pokazana na rysunku 13.

Rysunek 13. Sekwencja czasowa konwersji A/C typu SAR

Główną różnicą między przetwornikami analogowo-cyfrowymi z przetwarzaniem potokowym, a przetwornikami z rejestrem aproksymacji sukcesywnej (SAR) jest szybkość. W typowej konwersji opartej na SAR, cyfrowa część procesu generowania wyników odbywa się szeregowo i zazwyczaj tylko jeden komparator analogowy jest używany do konwersji jednego bitu danych wynikowych na cykl zegara analogowo-cyfrowego. Konwerter potokowy używa wielu wewnętrznych komparatorów analogowych pracujących równolegle, aby umożliwić przetwarzanie wielu wyników na kilku różnych etapach konwersji. Umożliwia to wykonywanie jej w sposób „potokowy” (tj. każda konwersja jest ściśle etapowana, jedna po drugiej). W rezultacie układ może generować jeden wynik konwersji na każdy okres zegara analogowo-cyfrowego (TAD).

Duża szybkość to podstawowa zaleta, ale główną wadą przetwornika analogowo-cyfrowego typu pipeline jest wyższy poziom szumów w porównaniu z przetwornikami SAR. W praktyce, aby uzyskać pożądane rezultaty, pobiera się i uśrednia wiele próbek. W naszym urządzeniu nie potrzebujemy dużej szybkości, ale przydałby się niski poziom szumów. Zgodnie z sugestią, w programie obsługującym konwersję zastosowałem uśrednianie 32 próbek.

Przetworniki cyfrowo-analogowe

Mikrokontroler ma wbudowane dwa niezależne moduły przetworników cyfrowo-analogowych: DAC1 i DAC2. Każdy z modułów ma rozdzielczość 10 bitów, czyli dane wejściowe mają postać 10-bitowej wartości cyfrowej, zapisywanej w formacie wyrównania do lewej lub prawej strony. Sygnał wyjściowy to napięcie analogowe, proporcjonalne do cyfrowej wartości wejściowej. Moduł może generować napięcia wyjściowe między napięciem AVSS a skonfigurowanym dodatnim napięciem odniesienia DAC. U nas odniesieniem jest napięcie AVDD (+3,3 V) podane na port RB0 (DVREF+). Wyzwolenie konwersji następuje po zapisaniu nowej wartości do rejestru danych modułu.

Wyświetlacz

Wyświetlacz zastosowany w projekcie ma wbudowany, dość popularny sterownik ST7735S komunikujący się z mikrokontrolerem przez interfejs SPI. Blok SPI mikrokontrolera PIC24FJ128GC006 pracuje tutaj z częstotliwością zegara równą 16 MHz. Interfejs wyświetlacza jest zbudowany z linii:

  • zegara (SCK),
  • wyjścia danych z MCU (MOSI),
  • linii D/C identyfikującej rodzaj danych przesyłanych do sterownika (D/C=0 – kod komendy, D/C=1 – dane do wyświetlenia),
  • linii zerowania (RES).

Dodatkowo wyświetlacz ma także wyprowadzoną linię BL do sterowania podświetleniem: stan wysoki na tym wyprowadzeniu włącza podświetlenie.

Interfejs użytkownika

Interfejs użytkownika (fotografia 1) ma zadanie umożliwić interakcję operatora ze sterownikiem zasilacza i jest zbudowany z:

  • enkodera obrotowego opisanego jako SET_U, ustawiającego napięcie wyjściowe z zakresu od +1 V do +24 V ze skokiem 0,5 V,
  • drugiego enkodera obrotowego SET_I do ustawiania poziomu zabezpieczenia prądowego w zakresie od 50 mA do 1000 mA, ze skokiem co 50 mA,
  • przycisku do sterowania przekaźnikiem wyjściowym złączającym i wyłączającym napięcie wyjściowe,
  • ekranu wyświetlacza LCD pokazującego: zmierzone/ustawione napięcie wyjściowe – górny wiersz, prąd wyjściowy – środkowy wiersz i nastawioną wartość ograniczenia prądowego – dolny wiersz.
Fotografia 1. Płyta czołowa interfejsu użytkownika

Obsługa zasilacza została maksymalnie uproszczona, ale z zachowaniem zasad ergonomii, stąd zastosowanie dwóch niezależnych enkoderów do regulacji napięcia wyjściowego i nastawy ogranicznika prądowego. Skok zmiany napięcia wyjściowego co 0,5 V to wynik doświadczeń z eksploatacji zasilaczy używanych przez autora – mniejszy skok zazwyczaj nie jest potrzebny, a wymaga większej liczby kroków nastaw. Można było użyć jednego enkodera do zgrubnej zmiany napięcia co 1 V, a drugiego do dokładniejszej (np. co 0,2 V), a zabezpieczenie prądowe ustawiać na przykład po naciśnięciu ośki jednego z enkoderów. Konfiguracja sprzętowa sterownika umożliwia takie sterowanie, więc jest to tylko kwestia oprogramowania. Jak wspomniano, obecna konfiguracja interfejsu sterującego jest zdaniem autora optymalna.

Po włączeniu zasilania układu przekaźnik podający napięcie na wyjście zasilacza jest wyłączony. Napięcie na wyjściu może się pojawić dopiero po przyciśnięciu przycisku START. Kolejne przyciśnięcia START powodują sekwencyjne włączanie i wyłączanie. Wyłączenie przekaźnika wyjściowego i odcięcie wyjścia zasilacza od układu tuż po włączeniu zasilania sieciowego zabezpiecza też przed pojawieniem się na wyjściu zasilacza napięć stanów nieustalonych, generowanych w czasie stabilizacji parametrów pracy pętli regulacji napięcia wyjściowego.

W kolejnym kroku wartości napięcia wyjściowego i ograniczenia prądowego, zapisane przed wyłączeniem zasilania, są odczytywane z pamięci EEPROM i ustawiane przez przetworniki DAC. Po tych czynnościach sterownik sekwencyjnie mierzy napięcie i prąd na wyjściu oraz sprawdza, czy został przyciśnięty przycisk START lub obrócona ośka jednego z enkoderów. Jeżeli tak, to odpowiednio reaguje na te zdarzenia, przełączając przekaźnik wyjściowy, zmieniając napięcie wyjściowe lub wartość zabezpieczenia prądowego.

Oprogramowanie sterownika

Program sterujący został napisany w języku C i uruchomiony w środowisku MPLAB X IDE. Wykorzystałem tu darmową, w pełni funkcjonalną wersję kompilatora MPLAB XC16, która jest dostępna na stronie firmy Microchip. Na płytce drukowanej sterownika, na złączu ICSP, są wyprowadzone sygnały dla programatora/debuggera w standardzie urządzeń z rodziny Pickit. W trakcie pracy nas oprogramowaniem autor użył Pickit 4, który jest w pełni zintegrowany ze środowiskiem MPLAB X IDE i realizuje programowanie pamięci mikrokontrolera oraz funkcje debuggera. Bardzo pomocnym elementem w trakcie pracy nad programem okazała się wtyczka MCC, przeznaczona do konfigurowania układów peryferyjnych. Chociaż Microchip od dłuższego czasu bardzo oszczędnie dokumentuje procedury generowane przez MCC i często jest z tym problem, to i tak okazuje się to bardzo dużym ułatwieniem.

Przetwornik analogowo-cyfrowy – programowanie

Układ konfiguracji przetwornika potokowego jest dość skomplikowany i zawiera dużą liczbę rejestrów konfiguracyjnych. Jak już wspomniano, w projekcie użyto do konfiguracji wtyczki MCC.

Na rysunku 14 pokazano okno konfiguracyjne przetwornika PADC.

Rysunek 14. Okno konfiguracyjne PADC

W pierwszym oknie od góry konfiguruje się podstawowe parametry pracy przetwornika:

  • źródło zegara taktującego przetwornik i częstotliwość taktowania;
  • dodatnie i ujemne napięcia referencyjne. W naszym przypadku dodatnim napięciem referencyjnym jest napięcie podane na linie portu RB0 (VREF+), a ujemnym – potencjał masy (AVSS);
  • format danych wyjściowych. W naszym przypadku są to surowe dane 12-bitowe typu integer (liczba całkowita bez znaku).

Znaczenie tych danych konfiguracyjnych jest jasne i nie wymaga komentarza. Wyjaśnienia potrzeba za to odnośnie sekcji konfiguracji opisanej jako Sample List 0…3. Nie jest to bowiem, jak mogłoby się wydawać, konfiguracja bufora przeznaczonego do zapisywania próbek.

W wielu projektach pożądane jest skonfigurowanie przetwornika analogowo-cyfrowego do automatycznego próbkowania i konwersji wielu kanałów wejściowych, bez ingerencji procesora przy każdej konwersji. We wcześniejszych układach PIC24F funkcja automatycznego skanowania umożliwiała próbkowanie i skanowanie wielu kanałów w sekwencji o ustalonej numeracji wejść. Dopóki moduł nie został ponownie zainicjalizowany, te same parametry próbkowania i konwersji były używane dla każdego kanału w trakcie sekwencji próbkowania. PADC oferuje tę samą funkcjonalność dzięki wykorzystaniu list próbek, a jednocześnie zapewnia znacznie szerszy zakres opcji skanowania i próbkowania. Listę próbek można traktować jako listę instrukcji dla modułu przetwornika, która informuje sprzęt, co ma robić podczas automatycznych operacji próbkowania i konwersji. Zawiera ona między innymi informacje o tym, które kanały analogowe mają być próbkowane, w jakiej kolejności, które źródło wyzwalania ma być użyte do zainicjalizowania próbkowania itp. Może również określać, czy grupa kanałów ma być próbkowana jednokrotnie, czy też powtarzalnie w pętli ciągłej.

PADC obsługuje do czterech list próbek, z których każda jest konfigurowalna. Pozwala to na niezależne ustawienie każdej listy próbek z jej własnymi ustawieniami próbkowania, konwersji, progów detekcji i generowania przerwań. Ponadto każda lista próbek jest monitorowana przez osobny rejestr statusu, który pokazuje aktualny stan zdarzeń wyzwalających i statusy przerwań. Włączona lista próbek może zawierać od jednego do maksymalnie 64 wpisów (zależnie od układu).

Chociaż w naszym przypadku doskonale sprawdziłaby się konfiguracja starszych PIC24F, to tu nie mamy wyjścia i musimy skorzystać z jednej z list (Sample List 0) konfigurującej konwersję dla dwóch kanałów analogowych AN2 i AN3, przeznaczonych do pomiaru napięcia i prądu wyjściowego zasilacza. Na szczęście, jeżeli przyswoi się powyższą wiedzę na temat roli list próbek, to nie jest to zadanie trudne, szczególnie z użyciem wtyczki MCC. Kolejność operacji do wykonania jest następująca:

  • włączamy opcję Enable Auto Scan,
  • w okienku Charge Time ustawiamy 29Tad,
  • wybieramy pojedyncze wyzwalanie ręczne,
  • rozmiar listy próbek ustawiamy na 2.

Aby przetwornik zmierzył napięcie w dwóch kanałach analogowych, musimy go za każdym razem programowo wyzwolić. Rozmiar listy próbek określa, dla ilu kanałów analogowych ta konfiguracja jest właściwa. Konkretne kanały analogowe dla naszej listy ustawia się w oknie Analog Channel Selection Table. W naszym przypadku będą to wejścia AN2 i AN3. Można też tu włączyć tryb wejścia różnicowego dla danego kanału (u nas ta opcja nie jest wykorzystywana).

Na podstawie okna z rysunku 14 MCC wygeneruje w pliku padc1.c kilka procedur pozwalających na obsługę przetwornika. Na listingu 1 pokazano procedurę inicjalizacji modułu. Jest dość skomplikowana i jej ręczne wygenerowanie zajęłoby sporo czasu, szczególnie jeżeli robiłoby się to pierwszy raz.

void PADC1_Initialize(void)
{
// ADSLP disabled; ADSIDL disabled; PWRLVL Low-Power mode; PUMPEN disabled; FORM Integer, Raw Data; ADCAL disabled; ADON enabled;
ADCON1 = (0x8000 | 0x01) & 0x7FFF; // Full power mode, Enable ADC later
ADCON2 = (0x4000 | 0x0300); // NVCFG0 AVSS; PVCFG VREF+; REFPUMP disabled; BUFORG disabled;

ADCON2bits.BUFORG = 1; // Result buffer organized as indexed mode
BUFCON1 = 0x00; // BUFOE disabled; BUFSTBY Normal; BUFEN disabled; BUFSIDL disabled; BUFSLP disabled;
// BUFREF 1.2 V;
ADCON3 = 0x8004; // SLEN3 disabled; SLEN2 disabled; SLEN1 disabled; ADRC RC clock; SLEN0 disabled; ADCS 8;
// Set Sample lists
// MULCHEN One at a time; CTMEN disabled; CM Matching is disabled; SLINT No interrupt; WM All conversion results saved; SAMC 29 tad; ASEN enabled;
ADL0CONH = 0x801D;
ADL0CONHbits.SLINT = 0x01; // interrupt after autoscan completion
// THSRC Buffer register; SLTSRC Manual Trigger:Single Trigger; SLEN enabled; SLENCLR disabled; SLSIZE 2; SAMP disabled;
ADL0CONL = (0x8001 & 0x7FFF) | 0x4000; // open manual switch and Enable sample list later
// Set table registers

ADTBL0 = 0x2; // UCTMU disabled; ADCH AN2; DIFF disabled;
ADTBL1 = 0x3; // UCTMU disabled; ADCH AN3; DIFF disabled;
// Set table pointer registers
ADL0PTR =0;
ADL1PTR =0;
ADL2PTR =0;
ADL3PTR =0;
ACCONL = 0x00; // TBLSEL ADTBL0; COUNT 0;
ACCONH = 0x00; // ACIE disabled; ACEN disabled
ADCON1bits.ADON = 1; // Enable ADC
while(!(PADC1_IsReadyForConversion())); // Poll the ADREADY bit
ADCON1bits.ADCAL = 1; // Start calibration
while(!(PADC1_IsReadyForConversion())); // Poll the ADREADY bit
ADTMRPR = 0x00; // Set ADC timer register
// Enable sample list
ADL0CONLbits.SLEN = 1; // Enable Sample list 1
ADL0CONLbits.SAMP = 0; // Close sample switch
}

Listing 1. Konfiguracja PADC

Zainicjalizowany przetwornik ze skonfigurowaną listą próbek numer zero można użyć do konwersji napięć z wejść AN2 i AN3 na postać cyfrową. Ponieważ w konfiguracji wybraliśmy ręczny start konwersji, to trzeba wywołać funkcję PADC1_SampleList0ManualConversionStart rozpoczynającą konwersję z ustawieniami listy Sample List 0 – listing 2.

void PADC1_SampleList0ManualConversionStart(void)
{
ADL0CONLbits.SAMP = 1;
ADL0CONLbits.SAMP = 0;
}

Listing 2. Wyzwolenie konwersji z zerowej listy próbek

Pozostaje teraz poczekać na koniec konwersji i odczytać rejestry wyniku konwersji dla obu kanałów analogowych AN2 i AN3. Na listingu 3 pokazano kompletną procedurę, która:

  • czeka na gotowość modułu przetwornika na konwersję analogowo-cyfrową,
  • wyzwala programowo konwersję (listing 2),
  • czeka na zakończenie konwersji,
  • odczytuje wyniki konwersji z kanałów AN2 i AN3.
void GetPDAC(uint16_t *buffer)
{
uint32_t buf_oversampling[2];
uint8_t i;
buf_oversampling[0] = 0;
buf_oversampling[1] = 0;

for (i= 0; i< 32; i++)
{

while(!(PADC1_IsReadyForConversion()));
PADC1_SampleList0ManualConversionStart();
while(!PADC1_IsBusyInConversion());

PADC1_SampleList0ConversionResultBufferGet(buffer, 0, 2);
buf_oversampling[0] = buf_oversampling[0]+ buffer[0];
buf_oversampling[1] = buf_oversampling[1]+ buffer[1];
}

buffer[0] = buf_oversampling[0] /32;
buffer[1] = buf_oversampling[1] /32;

}

Listing 3. Odczyt wyniku konwersji kanałów AN2 i AN3

Te czynności są wykonywane w pętli 32 razy, a wyniki konwersji dla każdego z kanałów są sumowane. Po wyjściu z pętli ta suma jest dzielona przez 32, co powoduje uśrednianie wyniku w celu ograniczenia szumu w sygnale z przetwornika PADC.

Odczyt rejestrów wyniku konwersji wykonuje procedura PADC1_SampleList0ConversionResultBufferGet z argumentami: wskaźnikiem na 32-bitowy bufor wyniku, numerem listy próbek i rozmiarem listy próbek.

bool PADC1_SampleList0ConversionResultBufferGet (uint16_t *buffer, uint8_t tableRegIndex, u int8_t slSize)
{
uint8_t index;
bool dataValid = false;
if (ADSTATLbits.SL0IF != 0)
{
For (index=0; index < slSize; index++)
{
buffer[index] = *((uint16_t *) & ADRES0 + tableRegIndex);
tableRegIndex++;
}
ADL0STATbits.ADLIF = 0;
dataValid = true;
}
return dataValid;
}

Listing 4. Odczytanie wyniku konwersji

Na listingu 5 pokazano procedurę pomiaru napięcia wyjściowego odczytującą wynik konwersji i wyliczającą na jej podstawie wartość napięcia wyjściowego. Przeliczanie 12-bitowej liczby na wartość napięcia odbywa się przy założeniu, że napięciu wyjściowemu odpowiada napięcie +3,3 V. Inaczej mówiąc, kiedy napięcie wyjściowe zasilacza ma wartość +24 V, na wejściu przetwornika panuje napięcie równe referencyjnemu, czyli +3,3 V.

double Measure_V (void)
{
uint16_t buf[2];

double voltage;
GetPDAC(buf);
voltage = (double)buf[1];
voltage = (voltage/83.6) * 0.5;
return voltage;
}

Listing 5. Procedura pomiaru napięcia wyjściowego

Na podobnej zasadzie jest mierzony prąd wyjściowy – listing 6. Dla prądu 1000 mA napięcie na wejściu przetwornika wynosi +3,3 V.

double Measure_I (void)
{
double current;

GetPDAC(buf);
current = (current/203.5) * 50;
}
return current ;
}

Listing 6. Procedura pomiaru prądu wyjściowego

Konfiguracja i obsługa przetworników DAC, w porównaniu z przetwornikiem PADC, jest banalnie prosta. Na rysunku 15 pokazano okno konfiguracyjne wtyczki MCC. Możemy tu włączyć moduł, ustawić wyrównanie danych wejściowych (w tym przypadku do prawej) i wybrać źródło napięcia referencyjnego. Jeżeli nie odblokujemy sprzętowego wyzwalania (Trigger Enable), to każda konwersja DAC musi być wyzwalana programowo.

Rysunek 15. Okno konfiguracyjne przetworników DAC

Konfiguracja polega na zapisaniu jednego rejestru konfiguracyjnego DACxCON – listing 7.

void DAC2_Initialize(void)
{
// DACREF DVREF+; DACFM Right; DACEN enabled; DACTSEL CMP1; DACTRIG disabled; DACSLP disabled; DACSIDL disabled;
DAC2CON = 0x8001;

}

Listing 7. Konfiguracja przetwornika DAC2

Konwersja jest wyzwalana przez zapisanie rejestru DACxDAT – patrz listing 8.

void DAC2_OutputSet (uint16_t inputData)
{
DAC2DAT = inputData;
}

Listing 8. Wyzwolenie konwersji DAC2

Ustawienie napięcia wyjściowego realizuje procedura SetV z argumentem stepv (listing 9) – argument ten jest indeksem tablicy VSet, w której są zapisane wartości wysyłane do przetwornika DAC, a zarazem indeksem drugiej tablicy VSetCor, zawierającej wartości korekcji. To rozwiązanie pozwala na ustawianie napięcia w krokach co 0,5 V i korygowanie ewentualnych błędów przetwarzania przetwornika, szczególnie na początku zakresu.

void SetV (uint8_t stepv)
{

DAC1_OutputSet( VSet[stepv] + VSetCor [stepv] );

}
//tablica ustawiania napięcia zasilacza
const int16_t VSet [] =
{

0,21,42,63,84,
105,126,147,168,
189,210,231,252,
273,294,315,336,
357,378,399,420,
441,462,483,504,
525,546,567,588,
609,630,651,672,
693,714,735,756,
777,798,819,840,
861,882,903,924,
945,966,987,1008,
};

Listing 9. Procedura ustawiania napięcia wyjściowego z tablicą VSet

Pętla główna programu jest stosunkowo prosta. Na początku mierzone i wyświetlane są wartości napięcia i prądu wyjściowego. Potem program sprawdza, czy nie zostały obrócone enkodery ustawiania napięcia lub poziomu zabezpieczenia prądowego, a także czy został przyciśnięty przycisk START (listing 10). W obecnej wersji programu nie przewidziano żadnych dodatkowych funkcji i menu.

while (1)
{
//pomiar i wyświetlenie prądu wyjściowego
current = Measure_I();
HMI_CurrentDisplayFast (16, 53,current, RED, WHITE);

//pomiar i wyświetlenie napięcia wyjściowego
volt = Measure_V();
HMI_VoltageDisplayFast (16,10,volt, BLUE, WHITE);

//odczyt enkodera ustawiania napięcia
key_v = HMI_GetEncoderV();
//odczyt enkodera ustawiania ograniczenia prądowego
key_i = HMI_GetEncoderI();
//obsługa ustawienia napięcia
if(key_v == KOD_IMP_UP_V)
{
++Vstep;
if (Vstep > 48)
Vstep = 48;
SetV (Vstep);
volt = Measure_V();
HMI_VoltageDisplayFast (16, 10, volt , BLUE, WHITE);
}
if(key_v == KOD_IMP_DWN_V)
{
--Vstep;
if (Vstep < 1)
Vstep = 1;
SetV (Vstep);
volt = Measure_V();
HMI_VoltageDisplayFast (16, 10, volt, BLUE, WHITE)
}

//obsługa ustawienia prądu zabezpieczenia prądowego
if(key_i == KOD_IMP_UP_I)
{
++Istep;
if(Istep > 19)
Istep = 19;
SetI(Istep);
current_set = Istep * 50;
HMI_OverCurrentDisplay (19, 100, current_set, GOLD, BLACK);

}
if(key_i == KOD_IMP_DWN_I)
{
--Istep;
if(Istep <1 )
Istep = 1;
SetI(Istep);
current_set = Istep * 50;
HMI_OverCurrentDisplay (19, 100, current_set, GOLD, BLACK);

}
Sprawdzanie przyciśnięcia przycisku START i przełączanie przekaźnika wyjściowego
HMI_Check_START_Button();

}

Listing 10. Pętla główna programu

Budowa zasilacza, montaż i uruchomienie

Z założenia zasilacz miał być urządzeniem kompaktowym, dlatego transformator o napięciu wyjściowym +24 V i prądzie 1 A został umieszczony na płytce drukowanej sekcji analogowej.

Rysunek 16. Projekt płytki sekcji analogowej: a – strona TOP, b – strona BOTTOM

Projekt płytki pokazano na rysunku 16, a widok płytki z rozmieszczeniem poszczególnych układów na fotografii 2.

Fotografia 2. Zdjęcie płytki sekcji analogowej z rozmieszczeniem poszczególnych układów

Elementy na płytce są przeznaczone do montażu przewlekanego i powierzchniowego. W pierwszej kolejności montujemy elementy od najmniejszych SMD do największych: przekaźnik, mostek prostowniczy, transformator i główny kondensator filtru.

Projekt płytki sterownika został pokazany na rysunku 17. Najtrudniejszym elementem do montażu będzie mikrokontroler w obudowie z 64 wyprowadzeniami w rastrze 0,5 mm. Jedną ze sprawdzonych metod jest użycie dobrego topnika w płynie i lutownicy z grotem typu minifala.

Rysunek 17. Projekt płytki sterownika zasilacza: a – strona TOP, b – strona BOTTOM

Po zasileniu układu z napięcia sieciowego 230 VAC sprawdzamy poprawność napięcia +12 V na złączu J7. Jeżeli jest poprawne, możemy połączyć moduł sekcji analogowej ze sterownikiem za pomocą płaskich kabli z zaciśniętymi wtyczkami IDC o rastrze 2,54 mm, zwracając przy tym uwagę na prawidłowe położenie wtyczek – fotografia otwierająca artykuł.

Teraz sterownik jest zasilany napięciem +12 V i jeżeli wcześniej został zaprogramowany mikrokontroler, a montaż płytki sterownika został wykonany prawidłowo, to na wyświetlaczu sterownika powinien się pojawić ekran jak fotografii 3, ale oczywiście z innymi wartościami napięcia i prądu.

Fotografia 3. Ekran wyświetlacza sterownika

Sterownik domyślnie po pierwszym uruchomieniu (po zaprogramowaniu pamięci Flash) ustawia napięcie wyjściowe równe +12 V i ograniczenie prądowe na 500 mA.

Następnie naciskamy przycisk START i podłączamy woltomierz do wyjścia zasilacza. Teraz potencjometrem wieloobrotowym opisanym na płytce jako TRIM_U ustawiany napięcie równe +12 V. Kręcenie enkoderem SET_U powinno zmieniać napięcie wyjściowe ze skokiem 0,5 V. Zwiększamy teraz napięcie wyjściowe do +24 V i ewentualnie korygujemy je potencjometrem TRIM U. Tę czynność można powtórzyć klika razy – tak, by napięcie wyjściowe zmieniało się jak najdokładniej z krokiem 0,5 V. W prototypie konieczna była drobna korekta wartości tablicy VSetCor na końcach zakresów, szczególnie dla niskich napięć wyjściowych, co najprawdopodobniej było spowodowane nieliniowością przetwornika.

Teraz przechodzimy do kalibracji pomiaru napięcia wyjściowego, polegającej na takim ustawieniu wieloobrotowego potencjometru POMIAR_U, żeby wyświetlacz sterownika wskazywał dokładnie napięcie zmierzone multimetrem na wyjściu zasilacza.

Ostatnią czynnością jest ustawienie poprawnego pomiaru prądu wyjściowego. Układ INA250 mierzy prąd z wystarczającą dokładnością, ale na jego wyjściu mamy napięcie 0,8 V dla natężenia równego 1 A . Należy ten sygnał wzmocnić tak, by przy 1 A na wejściu przetwornika PADC panowało napięcie +3,3 V. Wzmocnienie napięciowe reguluje się wieloobrotowym potencjometrem TRIM I dokładnie ustalającym potrzebne wzmocnienie. Następnie obciążamy zasilacz prądem ok. 500 mA, a w szereg z obciążeniem włączamy amperomierz multimetru i tak ustawiamy TRIM I, aż prąd wyświetlany na ekranie wyświetlacza będzie równy wskazaniom amperomierza.

Tak wyregulowany zasilacz jest gotowy do pracy.

Podsumowanie

Na koniec możemy ponownie spróbować odpowiedzieć sobie na pytanie postawione na początku pierwszej części artykułu: czy warto samodzielnie budować takie urządzenie? Zaprojektowanie, wykonanie i oprogramowanie nawet tak relatywnie prostego urządzenia jak zasilacz warsztatowy, zajmuje mnóstwo czasu. Komercyjny koszt takiego przedsięwzięcia – zważywszy tylko na koszty pracy – jest tak duży, że za tę kwotę można kupić dobry lub nawet bardzo dobry, gotowy zasilacz. Ekonomicznie nie jest to w żaden sposób do obronienia, chyba że projekt miałby być produkowany w większej ilości. Ale w takim przypadku koszty opracowania jeszcze wzrosną. Prototyp trzeba by było pewnie trochę przeprojektować, usunąć drobne błędy, wprowadzić jakieś poprawki. Potem konieczne byłyby testy niezawodności, certyfikaty bezpieczeństwa itp. Do tego kosztowne opracowanie i wyprodukowanie mechaniki.

Jeżeli jednak będziemy rozpatrywać takie projekty w kategoriach zdobywania doświadczeń, szczególnie w projektowaniu urządzeń na styku techniki cyfrowej i analogowej, to może to być dobry poligon doświadczalny. A w kategoriach „Zrób to Sam” dochodzi do tego niemierzalna satysfakcja z własnoręcznie zaprojektowanego i wykonanego urządzenia. Dla sporej części entuzjastów to rzecz, którą trudno przecenić.

Tomasz Jabłoński, EP

Wykaz elementów: Część cyfrowa
Rezystory: (SMD1206, 1%)
  • R1...R10, R14, R15: 1 kΩ
  • R11...R13: 100 Ω
Kondensatory:
  • C1...C7, C14: 100 nF (SMD 1206)
  • C8: 10 nF (SMD 1206)
  • C9...C13, C15: 10 μF (tantalowy SMD)
Półprzewodniki:
  • D1: dioda LED RGB
  • U1: PIC24FJ128GC006-I/PT
  • U2: MIC5207-3,3YM5-TR
  • U3: AMS1117-3,3
  • U4: LM7805
  • U5: AT24C32D-SSHM-T
Pozostałe:
  • J1, J2: gniazdo IDC 16 pinów (raster 2,54 mm)
  • J3: goldpin 1×5 (raster 2,54 mm)
  • J5: goldpin 1×6 (raster 2,54 mm)
  • J6: goldpin 1×2 (raster 2,54 mm)
  • J7: gniazdo IDC 8 pinów (raster 2,54 mm)
  • SW1, SW2: enkoder obrotowy z przyciskiem
  • SW3, SW4: przycisk THT
  • Wyświetlacz LCD TFT 128×160 px ze sterownikiem ST7735S (wyprowadzenia goldpin 1×8)
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik lipiec 2026

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio lipiec - sierpień 2026

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje czerwiec 2026

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna czerwiec 2026

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich lipiec 2026

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów