Skocz do zawartości

Regulator MPPT


Yggas

Pomocna odpowiedź

Dobra działa, zrobiłem markerem drugą płytkę, wlutowałem tranzystor i kabelkami wlutowałem w odpowiednie miejsca płytki. Nie wygląda to super poważnie ale ze względu czasowego musi tak pozostać przynajmniej na jakiś czas.

Cały czas szukam informacji i czytam o tej częstotliwości na timer2 i idzie mi to powoli 😋

Ale sprawa taka na teraz to będzie to jak zrobić w Arduino dwie osobne pętle, które wykonują się w tym samym czasie? Da się tak zrobić?

W jednej bym miał pomiary, obliczenia i sterowanie MMP, a druga by generowała tylko PWM.

Oczywiście pierwsza by sterowała drugą.

Czy przypadkiem wymagam niemożliwego? 🙄

Link do komentarza
Share on other sites

Nie bardzo rozumiem co miałaby robić ta pętla od PWM. Masz tak:

1. Pomiary ADC,
2. Wypracowanie nowego PWMa uwzględniające stan akumulatora i stan algorytmu MPPT,
3. Zapis nowego wypełnienia do rejestru OCR2x,
4. Ew. wysłanie danych przez serial żeby było wiadomo co się zmierzyło, jakie są policzone moce we/wy, jaki jest stan/faza procesu ładowania (CI/CV) i jaka jest najnowsza decyzja MPPT,
5. Ew. jakieś opóźnienie bo ani ładowarka ani MPPT nie muszą pracować w cyklu milisekund, wystarczy 1s.

Koniec.

Po odpaleniu timera, PWM robi się samo więc potem to tylko jedna linia w kodzie, np:

OCR2A = nowy_pwm;

Link do komentarza
Share on other sites

void setup() {
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 TCCR1A = 0;
 TCCR1B = 0;
 TCCR1A |= (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1);
 TCCR1B |= (1<<CS10) | (1<<WGM12);

 Serial.begin(9600);  //Uruchomienie komunikacji przez USART
 lcd.begin(16,2);
}

Tak uzyskałem 62500Hz na pinie 9 ale to jest z Timer1. Jeżeli to nie wpłynie na inne funkcje np LCD lub odczyt analogowy to fajnie jak by to pozostało 😋 Nie wgłębiałem się w to jak działają rejestry, wziąłem tylko odpowiedni kod z yt.

W pętli loop tylko teraz zrobić sterowanie pwm które będę wpisywał do OCR1A = pwm i tyle?

Ładowanie baterii zrobię później, teraz chcę opisać i oddać projekt taki jaki jest.

Link do komentarza
Share on other sites

Ok, zwyczajnie niczego nie przeczytałeś (albo nic nie dotarło) i olałeś to wszystko co pisałem o wyborze trybu pracy wyjścia PWM (normal/inverted). Wziąłeś za to pierwszy lepszy kod z sieci uruchamiający nie ten timer i na dodatek dwa wyjścia na raz. Czyli: dzisiejszy standard, zero wysiłku, bezmyślnie kopiujemy co się da, może jakoś zadziała.

Niniejszym skończyły mi się motywacje dalszego interesowania się tematem. Racja, oddaj ten projekt czym prędzej i zapomnij o sprawie.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Czyli tak, najpierw ustawiam prescaler na 1 więc w TCCR2B zeruję wszystkie bity, a potem ustawiam prescaler:

TCCR2B = 0;
TCCR2B |= (1<<CS20);

Potrzebny mi będzie prawdopodobnie tryb FAST PWM, nie PHASE CORRECT bo:

-Liczy od zera co jest nazwane BOTTOM, do TOP.

-TOP prawdopodobnie będę mógł ustawiać wartością w OCR2A co da mi sterowanie szerokością impulsu

Żeby ustawić TOP jako OCR2A, należy ustawić WGM20, WGM21 i WGM22 na 1 czyli to będzie praca jako Mode 7.

TCCR2A = 0;
TCCR2B = 0;
TCCR2A |= (1<<WGM20) | (1<<WGM21);
TCCR2B |= (1<<CS20) | (1<<WGM22);

W tej tabelce chodzi o to co się dzieje z OCR2A po osiągnięciu TOP?

Jeżeli tak to najlepsze będzie to wyjście:

(1<

Czyli sumując kod:

TCCR2A = 0;
TCCR2B = 0;
TCCR2A |= (1<<WGM20) | (1<<WGM21) | (1<<COM2A1);
TCCR2B |= (1<<CS20) | (1<<WGM22);

Teraz dobrze to zrobiłem na Timer2?

Nie chcę sprawdzać teraz tego bo nie mam już możliwości, przyjechałem wczoraj na sesję z domu, a w mieszkaniu tu nie mam oscyloskopu. Tamten kod na Timer1 dawał mi 62500Hz i mogłem go elegancko modulować.

Proszę jeszcze o sprawdzenie kodu Arduino, który testowałem ale miałem trochę błędów:

KOD ARDUINO

Mianowicie, jak nie płynie prąd przez oporniki pomiarowe to mój super układ INA138 ma dużo błędów i wskazuje 3A. W miarę wzrostu prądu wskazania maleją do 2.5A, a gdy już większy prąd płynie (w granicach chyba 150mA) to dopiero dobrze wskazuje (prawdopodobnie dobrze, jutro idę po multimetr bo swojego też nie mam).

I proszę się nie obrażać na uczniów 😳

PS: a może używać _BV() zamiast (1<

Link do komentarza
Share on other sites

To nie jest obrażanie się. Nic na siłę. Musi mi się chcieć pisać a to pojawia się wtedy gdy temat jest rozwojowy i widzę, że ktoś rokuje i wnika. Gdy zaczynasz bez zastanowienia ściągać (niechby i z YT) kody zamiast przeczytać dwie strony tekstu to pomoc nie jest Ci potrzebna. A ja mam wiele innych ciekawych zajęć.

Wracając do timera. W tabelce 22-9 masz tryby pracy. Potrzebujesz takiego w którym generowany jest PWM więc w grę wchodzą 1, 3, 5 i 7. Słusznie, tutaj wystarczający jest FAST więc zostają dwa.

W kolumnie TOP masz podaną wartość do jakiej timer będzie zliczał w każdym cyklu - po niej się wyzeruje. Na razie nie ma tu jeszcze nic o wypełnieniu, bo okres timera definiuje częstotliwość. Tak więc w trybie 3 będzie zliczał zawsze do 0xFF, czyli jego cykl będzie wynosił 256 okresów zegara - najbardziej naturalny tryb licznika 8-bitowego. Jeżeli częstotliwość 16MHz/256=62.5kHz Ci pasuje, bierz to. Masz wtedy do dyspozycji dwa rejestry: OCR2A i OCR2B sterujące generacją dwóch PWMów. Ponieważ potrzebujesz tylko jednego, wybierasz sobie pin wyjściowy (OC2A lub OC2B) wg uznania i do związanego z nim rejestru będziesz wpisywał wypełnienie.

W trybie 7 (który wybrałeś) masz tylko jeden generator PWM (rejestr OCR2B i pin OC2B), bo rejestr OCR2A zostanie tu wykorzystany do ustalenia okresu timera. Oczywiście nie możesz go wydłużyć powyżej 0xFF bo timer jest 8-bitowy, ale możesz skrócić. To oznacza, że możesz dostać jeszcze wyższą częstotliwość PWM. Ładując teraz do OCR2A (jednokrotnie, w procesie konfiguracji timera) liczbę np. 99 dostajesz timer o okresie 100 a więc produkujący PWM o częstotliwości 16MHz/100=160kHz. Niestety nic za darmo. Skoro skróciłeś okres, to timer nigdy nie osiągnie liczb większych niż 100 a skala PWM zmniejszyła się z 256 różnych wartości do 100. Częstotliwość kosztem rozdzielczości. W skrajnym przypadku możesz tam załadować np. 3 i mieć 16MHz/4=4MHz, ale za to tylko z 4 poziomami wypełnienia PWM: 0, 1, 2 i 3. Poeksperymentuj z oscyloskopem.

Teraz mamy tabelkę 22-4. Każde z dwóch wyjść timera 2 ma swoje dwa bity określające sposób generacji PWMa w trybie FAST. Skoro wybrałeś tryb 7, to nie możesz używać wyjścia OC2A (bo jego rejestr został zawłaszczony przez ustawianie okresu timera) więc powinieneś skupić się na bitach sterujących wyjściem OC2B. A jeśli wrócisz do prostszego trybu 3, to oczywiście możesz wybierać wyjście, bo oba rejestry OCR2A/B są dostępne dla wypełnień. Na szczęście oba komplety bitów sterujących wyjściami mają takie samo znaczenie, różnią się tylko nazwami więc możemy użyć równie dobrze Twojej tabelki.

Dla PWM sensowne są jedynie dwie ostatnie kombinacje. Na pozór różnią się tylko polaryzacją sygnału wyjściowego (prosty-odwrotny), ale ma to swoje głębsze konsekwencje.

Zakładając używanie rejestru OCR2A:

a. dla kombinacji 10 na wyjściu dostajesz PWM o wypełnieniu (OCR2A+1)/256

b. dla kombinacji 11 na wyjściu dostajesz PWM o wypełnieniu (255-OCR2A)/256

Skoro do OCR2A możesz wpisywać liczby 0-255 to wygląda, że w pierwszym przypadku uzyskasz wypełnienia 1/256 do 256/256 a w drugim od 0/256 do 255/256. W przetwornicy gdzie nigdy nie będziesz potrzebował wypełnienia 100% a na pewno czasem musisz ją wyłączyć na 0%, wypadałoby użyć kombinacji 11, prawda?

Wygląda mi to na taki kod startowy:

 OCR2A = 255;
 TCCR2A = _BV(WGM21) | _BV(WGM20) | _BV(COM2A1) | _BV(COM2A0);
 TCCR2B = _BV(CS20);

A ustawienie wypełnienia będzie się wiązało z odejmowaniem, bo w trybie inverted PWM rośnie gdy OCR2A/B maleje:

 OCR2A = 255 - nowy_pwm;

Wtedy dla 0 dostajesz kompletne wyłączenie tranzystora (0%) a dla 255 wypełnienie 255/256 (99.6%) co raczej w Twoim przypadku nigdy nie będzie miało miejsca.

EDIT:

Twoje wzmacniacze pomiarowe są bardzo precyzyjne, ale nie umieją pracować gdy napięcie wejściowe spadnie poniżej 2.7V. Gdy zmierzysz dzielnikami napięcie takie lub niższe, przestajesz mierzyć prąd bo pomiar wtedy nie działa. Za to w górę możesz szaleć powyżej 30V. A może masz jakiś problem z pomiarami ADC? Jak wykryłeś te 3A? Multimetrem na wyjściach wzmacniaczy czy przeliczając ADC? Może tam coś siedzi?

Link do komentarza
Share on other sites

Przelicając z ADC, nie mam multimetra. Ale nic w rzeczywistości nie płynie na 100% jak napięcia są 0, a na dodatek jeżeli by płynęło 3 A przez ten pomiarowy gwizdek to by był czerwony jak cegła pewnie a jest zimniutki.

Wyżej jest kod to możesz sprawdzić konwersję. Wszystko działa jak płynie przez nie prąd 150mA+. Na napięciu wejściowym z panelu pv oświetlanym żarówką i wyłączonym tranzystorze było napięcie 6.5V, i prąd też pokazywało 3 A 😃

Może wyjście układu ina138 sprzęgnąć przez rezystor o dużej rezystancji do masy?

Kondensator włączyłem na wyjściu ale to tylko pozwoliło mi na stabilizację wyniku (tych błędnych też).

Link do komentarza
Share on other sites

Rozumiem, że naprawdę nie płyną te 3A bo byś nie zgłaszał tego jako problem.

Zastanawiam się tylko gdzie jest błąd. Wzmacniacz INA138 zamienia napięcie różnicowe z opornika (zwieszonego na jakimś potencjale szyny zasilającej) na prąd wypływający z wyjścia. Ten prąd zamieniasz na napięcie opornikiem stojącym na masie. Przyjęliśmy, że te oporniki będą o ile pamiętam 220, 240 czy 250kΩ no i muszą takie być, bo inaczej całość nie działa. To one (oprócz samego rezystora szeregowego) tak naprawdę odpowiadają za współczynnik konwersji prądu na napięcie.

Miałeś uruchamiać układ po kolei, zajrzyj do planu, to nie są brednie które możesz pomijać. Nie mając opanowanej przetwornicy nie możesz poprawnie obliczać PWMa a nie mając dobrych pomiarów nie możesz pracować z przetwornicą.

Może wrzuć ostateczny schemat z wartościami elementów jakie rzeczywiście wlutowałeś, bo teraz nawet trudno komentować kod. W obsłudze ADC masz między kolejnymi pomiarami jakieś opóźnienia po 20ms. Po co? Przecież cała myk polega na tym, że mierzysz wszystko jak najbliżej siebie, bo te 4 wartości muszą dotyczyć jednej chwili czasowej. Jaki jest sens pomiaru napięcia w chwili t1 a potem prądu w chwili t2? To której chwili dotyczy policzony ich iloczyn czyli moc?

W przeliczaniu ADC na prąd masz współczynnik 5/1024 czyli pełny zakres to 5A. Czy tak ma być? Przekształcając wzór z karty katalogowej wzmacniacza, pełna skala wychodzi:

I(Full_scale) = (Vo*5k)/(RS*RL)

podstawiając wartości z ostatniego widzianego tu schematu (RS=100mΩ, RL=250kΩ, Vo=5V) dostajemy 1A. Współczynnik powinien być zatem 9.765E-4.

W przeliczaniu ADC na napięcia masz z kolei pełną skalę ustawioną na 2V. WTF? I Ty mówisz, że masz jakieś wyniki z ADC? Po to miał być etap kalibracji pomiarów, byś mógł na nich bazować. A tak piszesz o jakichś 3A nie mając pojęcia co i ile mierzysz. Weź się ogarnij i zacznij pracować a nie zgadywać.

W miejscu obliczania nowego PWM nie rób dziesięciu różnych inkrementacji/dekrementacji rejestru OCR tylko zrób zmienną byte w której trzymasz aktualny PWM i na jej podstawie, wiedząc jaki jest aktualny błąd obliczaj nowy współczynnik. Gdy wypracujesz nowe wypełnienie, załaduj je do rejestru jednorazowym zapisem. Teraz, nie dość że możesz zrobić wiele ++ i -- w jednym obrocie to jeszcze zmuszasz do wielokrotnych dostępów procesora do rejestru. Nie korzystaj z niego jak ze zmiennej. Ten zasób jest z definicji volatile więc kompilator nie ma możliwości jakiegoś uporządkowania tego bałaganu. W każdym miejscu gdzie wstawiłeś OCR2A++, procesor robi odczyt, inkrementację i zapis. I tak dziesięć razy w kodzie, choć wykona się tylko jedna odnoga. I jeszcze jedno: takie obliczanie wypełnienia to kaszana. Po to miałeś zrobić próby z "ręcznym" ustawianiem PWM by zrozumieć jak działa ta przetwornica i obliczenia przeprowadzić porządnie. Skąd wiesz, że akurat krok ±1 albo ±2 jest poprawny?

Zacznij od kawałka kodu mierzącego, przeliczającego i wypisującego poprawnie cztery podstawowe wielkości z ADC zweryfikowane multimetrem do 1% odchyłek oraz tych kilka, które liczysz na ich podstawie. Dopóki tego nie masz, cała reszta (kodu i roboty) nie ma sensu.

Link do komentarza
Share on other sites

void loop() {

 //Odczyt z przetwornika ADC
 Digital_I_in = analogRead(A0);
 Digital_V_in = analogRead(A1);
 Digital_I_out = analogRead(A2);
 Digital_V_out = analogRead(A3);

 //Przeliczenie wartości cyfrowych na analogowe
 V_in = Digital_V_in * 2.0 * (5.0/1023.0);
 V_out = Digital_V_out * 2.0 * (5.0/1023.0); 
 I_in = Digital_I_in * (1.04/1023.0); 
 I_out = Digital_I_out * (1.04/1023.0); 

 //Obliczanie mocy i sprawności
 P_in = V_in * I_in;
 P_out = V_out * I_out;
 n = P_out / P_in;

 nowy_pwm = 135;
 OCR2A = 255 - nowy_pwm;
}

To jest część z przetwornikiem, zmieniłem ją.

Rezystory pomiarowe: 2 x 0.1 Ohm

Rezystory dzielnika: 4 x 33 kOhm

Rezystor na wyjściu INA138: 240 kOhm

Wszystkie węglowe, tolerancja 10% chyba (złote paski).

No i tak jak mówisz błędy są do tak gdzieś 2.7V.

A tutaj screeny BEZ dodatkowych kondensatorów 4.7nF na wyjściu wzmacniaczy:

EDIT:

Płytka jako źródło była zasilana zasilaczem 5V / 500mA.

Obciążona rezystorem mocy 10 Ohm / 5W.

Co dziwne powinno płynąć na obciążeniu chyba 400mA, czyż nie?

Link do komentarza
Share on other sites

No to multimetr do ręki i badasz gdzie giną wyniki pomiarów. To chyba prosty łańcuch:

- prąd rzeczywisty (odczyt z miliamperomierza)

- napięcie na oporniku pomiarowym (odczyt z woltomierza, zakres 200mV)

- napięcie z wyjścia wzmacniacza (znowu woltomierz z końcówką minusową podpiętą na masie płytki przetwornicy)

- napięcie na wejściu ADC (woltomierz z minusem na masie Arduino)

- wypisujesz odczyt z ADC (int) i wynik z przeliczeń (float)

- liczysz i modyfikujesz współczynnik wg wyznaczonego błędu pomiaru.

Zastanawiasz się 10 sekund i masz odpowiedź kto jest winny głupich wyników. Przecież to przedszkole elektroniki...

Oczywiście nigdy nie zakładasz, że oporniki mają dokładnie tyle co napisano a Vref Arduino jest 5.000V więc w taki sam sposób (multimetr) kalibrujesz wszystkie 4 tory. Z dzielnikami jest prościej bo nie masz wzmacniaczy. Ciekawe jakie współczynniki wyjdą do przeliczeń.

BTW: Najbardziej podoba mi się sprawność >100% 🙂

Link do komentarza
Share on other sites

Jest ogólnie beka niezła bo... cała płytka jest ŹLE ZAPROJEKTOWANA.

Tutaj też źle dobrałem wyprowadzenia nóżek...

Niestety nic już nie zrobię, choćbym się ze...ł to nie zrobię nowej płytki do piątku bo mam jeszcze inne rzeczy do roboty, a tutaj nie mam materiałów i jestem zmuszony oddać to jako zwykłą przetwornicę SEPIC... :/

Bardzo i szczerze dziękuję za pomoc, odezwę się jak już zrobię nową płytkę, będzie wtedy bez zbędnego ciśnienia czasowego pewnie 😋

Link do komentarza
Share on other sites

Szkoda, tylu ludzi się gapi i nikt nie widzi, włącznie ze mną. Gdzie człowiek się spieszy, tam.. coś było dalej. Przykro mi. Czyli generalny problem z niedopasowaniem bibliotek schematowych do footprintów PCB? Trochę odzwyczaiłem się od takich błędów, bo jednak sprawdzone biblioteki to podstawa. A nie dasz rady polutować tych wzmacniaczy jakoś na drutach? Szkoda tyle roboty do kosza.. U mnie w firmie robię mnóstwo projektów i też czasem takie rzeczy się zdarzają, szczególnie gdy jest dużo nowych typów podzespołów (shit happens) i jeśli to prototyp, to nie czekamy na kolejną wersję PCB tylko staramy się wycisnąć wszystko co się da z tej obecnej. W ruch idą nagrzewnice, mikroskopy itp sprzęt i zwykle daje się coś uratować. A programistom potem i tak wszystko jedno jak to wygląda, byle dawało się debugger podłączyć..

Może jednak wylutuj ostrożnie te dwie kostki i postaw je tak na PCB by ze dwie-trzy nóżki pasowały. Chociaż jedna? Potem znajdź cienki drucik i polutuj resztę "na pająka".. 🙁

Link do komentarza
Share on other sites

Mam czas do poniedziałku na oddanie więc to będzie pracowity dla mnie weekend 🙂

Robię jutro płytkę od nowa, raczej ją zrobię porządnie teraz.

W KiCad jest zła biblioteka INA138 z pozamienianymi nóżkami i nie wiem teraz jak to mam zrobić ale coś wymyślę. Tranzystorów tam było 10 bibliotek i dobrałem po namyśle tą dobrą ale układu pomiarowego jest tylko jedna i błędna. Będę musiał przestać zwracać uwagę chyba na proponowane trasowanie.

Teraz załóżmy, że pomiary ADC mam dobre.

Jak ma wyglądać ten algorytm MPPT? Napewno będzie to ten łatwy P&O ale z tego co pisałeś to w kodzie go zapisałem źle?

Link do komentarza
Share on other sites

Nie kombinuj wbrew połączeniom pokazywanym przez program tylko dodaj poprawny element do biblioteki, z dobrymi numerami nóżek i odpowiednim footprintem. W ten sposób po jakimś czasie dopracujesz się zweryfikowanych symboli i footprintów. Taka baza jest cenniejsza niż cały program razem wzięty (tym bardziej gdy jest darmowy). Masz właśnie przykład jak wyglądają rzeczy otrzymane z sieci. Buduj własne kompetencje.

Algorytm a jego realizacja to dwie różne rzeczy. Samo P&O jest w idei proste, prawda? A jeśli chodzi o kodowanie tego, to miałem dwa zarzuty:

1. Nadużywanie operacji z rejestrem OCR. Zrób sobie zmienną uint8_t pwm i w niej trzymaj aktualny współczynnik wypełnienia PWM. Gdy już algorytm przemiele pomiary i wypracuje decyzję "w górę" lub "w dół" (to może być np. zmienna "krok" do której wpiszesz +1 lub -1), to w jednym miejscu kodu zmodyfikuj zmienną pwm przez zwykłe sumowanie

pwm += krok;

i wywołaj prostą funcję np."ustaw_pwm(pwm)" w której przeładujesz rejestr. W ten sposób widać jak na dłoni co się stało ze współczynnikiem wypełnienia a jednocześnie ukrywasz mniej ważne rzeczy typu sterowanie rejestrem. Tym bardziej, że teraz ma tam być odejmowanie a co to obchodzi kogoś, kto próbuje zrozumieć Twój algorytm? To tylko jakaś implementacja współpracy ze sprzętem.

2. Sama wielkość kroku. Jeżeli decyzje będziesz podejmował rzadko (1/s?) a krok będzie tylko ±1 to algorytm będzie bardzo wolny. Nie wiem jak będzie wyglądał zakres pracy przetwornicy, ale sam się zastanów. Oczywiście to zadziała, w końcu dojedziemy do warunków gdzie znów będziesz się kręcić +1, -1, +1, -1 wokół jakiejś stabilnej wartości, ale to zajmie dużo czasu. W przypadku chmur to pewnie zadziała, choć aż się prosi liczyć to sprytniej. Gdy przy dużym wietrze coś nagle zasłoni Słońce, Twoja rozpędzona przetwornica kompletnie zdechnie baterię zanim dojedzie do miejsca w którym moce się zrównoważą. A w tym czasie zaliczy zgon i restart, gdy napięcia zabraknie a będzie to jedyne źródło zasilania. Teraz to tylko pokaz idei więc możesz sobie na to pozwolić tym bardziej, że zasilanie komputerka masz "z boku", najwyżej przez pół minuty będzie na wejściu zero bo algorytm będzie dreptał -1, -1, -1.. aż coś na wejściu wreszcie się podniesie. Przemyśl to. Może warto liczyć krok z zależności od wielkości błędu? A może jedynie wystarczy optymalizować czas między próbami? Np. każda decyzja w tym samym kierunku podwaja lub jakoś inaczej powiększa krok albo zmniejsza okres próbkowania napięć/prądów/mocy?

Link do komentarza
Share on other sites

Nowa płytka:

Zmieniłem dzielnik napięcia z 2*33kR na 100kR i 47kR. Zabezpieczy to trochę lepiej uC przed wyższymi napięciami. Dodatkowo zmieniłem miejsca pomiarów napięć. Vin jest mierzone za opornikiem pomiarowym na teoretycznym wejściu przetwornicy, Vout jest mierzone za drugim opornikiem pomiarowym czyli jest to napięcie podawane prosto na podłączone obciążenie.

Tak wyglądają teraz pomiary:

PWM nie chce mi się wyświetlać coś w procentach, jeszcze nad tym popracuje.

  //Przeliczenie wartości cyfrowych na analogowe
 V_in = Digital_V_in * 3.20862 * (5.0/1024.0);
 V_out = Digital_V_out * 3.2316 * (5.0/1024.0); 
 I_in = Digital_I_in * (1.04/1024.0); 
 I_out = Digital_I_out * (1.04/1024.0);

Wyregulowałem też współczynniki by poprawnie wskazywały napięcia. Prądowych chyba nie trzeba jakoś dodatkowo regulować bo wskazują poprawnie.

//Funkcja przeładowania rejestru nową wypracowaną zmienną
int ustaw_pwm (int pwm)
 {

   OCR2A = 255 - pwm;
  return OCR2A;

 }

Taka funkcja do przeładowania rejestru jest poprawna?

  //MPPT P&O
 delta_V = V_in - V_in_poprzednie ;
 delta_P = P_in - P_in_poprzednie ;

 if(delta_P != 0)
   {
     if(delta_P > 0)
       {
        if(delta_V > 0)
          {
          krok++;

          } 
        else
         krok--;
       }
     else
       if(delta_V > 0)
       {
         krok--;
       }
       else
         krok++;
   }

 pwm += krok;

 ustaw_pwm(pwm);

Tu cały algorytm. Staram się to jakoś ogarnąć ale orłem w programowaniu nie jestem tym bardziej na pośpiechu 🙄

W załączeniu jeszcze dodatkowo schemat.

SCHEMAT MPPT.pdf

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.