Skocz do zawartości

Yggas

Użytkownicy
  • Zawartość

    55
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O Yggas

  • Ranga
    4/10

Informacje

  • Płeć
    Mężczyzna
  1. Testowałem kod ten taki podstawowy bez żadnych bajerów w niedzielę, akurat było trochę słońca by coś działało na moim 3.5W panelu słonecznym float V_in = 0; float V_out = 0; float I_in = 0; float I_out = 0; float P_in = 0; float P_out = 0; float n = 0; float delta_V = 0; float delta_P = 0; float V_in_poprzednie = 0; float P_in_poprzednie = 0; uint8_t pwm = 30; uint8_t krok = 0; uint8_t last_pwm = 0; unsigned long czas = 0; void setup() { //Ustawienie sygnału prostokątnego na pin11 o częstotliwości 62500Hz pinMode(11, OUTPUT); OCR2A = 255; TCCR2A = _BV(WGM21) | _BV(WGM20) | _BV(COM2A1) | _BV(COM2A0); TCCR2B = _BV(CS20); //Uruchomienie komunikacji przez USART Serial.begin(9600); } //Funkcja przeładowania rejestru nową wypracowaną zmienną uint8_t ustaw_pwm (uint8_t pwm) { return (255 - pwm); } //Funkcja do pomiaru napięcia ogniwa float pomiar_napiecia_ogniwa () { float napiecie_ogniwa; napiecie_ogniwa = analogRead(A1) * 3.20862 * ( 5.0 / 1024.0 ); return napiecie_ogniwa; } void loop() { czas = millis(); //Przeliczenie wartości cyfrowych na analogowe V_in = analogRead(A1) * 3.20862 * (5.0/1024.0); V_out = analogRead(A3) * 3.2316 * (5.0/1024.0); I_in = analogRead(A0) * (1.04/1024.0); I_out = analogRead(A2) * (1.04/1024.0); //Obliczanie mocy i sprawności P_in = V_in * I_in * 1000; P_out = V_out * I_out * 1000; n = P_out / P_in * 100; delta_V = V_in - V_in_poprzednie ; delta_P = P_in - P_in_poprzednie ; if(delta_P >= 300) if(delta_V >= 0.01) krok = 2; else krok = -2; else if(delta_V >=0.01) krok = -2; else krok = 2; pwm = pwm + krok; if(V_out >= 4.18) pwm = last_pwm; if(pwm >= 160) pwm = last_pwm; OCR2A = ustaw_pwm(pwm); V_in_poprzednie = V_in; P_in_poprzednie = P_in; last_pwm = pwm; //Wyświetlanie wyników Serial.print(czas/1000); Serial.print(" "); Serial.print(V_in,3); Serial.print(" "); Serial.print(V_out,3); Serial.print(" "); Serial.print(I_in,3); Serial.print(" "); Serial.print(I_out,3); Serial.print(" "); Serial.print(P_in); Serial.print(" "); Serial.print(P_out); Serial.print(" "); Serial.print(n,1); Serial.print(" "); Serial.println(pwm); delay(1000); } Obciążeniem była 1W dioda LED, pewnie trochę lipa bo jest super nieliniowa i lepszy był by ten rezystor no ale jak zaczęło się zliczanie danych to zostawiłem. (zbyt długo to słońce nie świeciło). Napięcie wyjściowe ograniczyłem programowo do 4.18V oraz pwm by nie rosło nie wiadomo ile. Co zauważyłem to jak ograniczę pwm z góry to nigdy nie zejdzie poniżej 0 co da od razu 255 itp ale tego jeszcze nie jestem pewien potrzebne parę testów Pomiary były robione co sekundę. Jak słońce świeciło ostro to pwm był maksymalny lecz pod końcem trochę głupiał jak słońce się ledwo przebijało przez chmury. Testować układ mogę tylko weekendami :/ Może jakieś wskazówki co w ten weekend przetestować?
  2. Całą noc siedziałem nad tym ale nie dałem rady ogarnąć algorytmu. Od 4 rano postanowiłem przerobić prezentację na to co mam. Oddałem projekt w poniedziałek jako płytkę samodzielnie zrobioną z kodem poniżej. Potencjometrem sobie ustawiam napięcie potrzebne. Taki niby zasilacz lab lub coś. Teraz mam tydzień wolnego przed nowym semestrem to się obijam Wieczorem może coś wrzucę bardziej przemyślanego z algorytmem MPPT bo w sumie fajnie by było to mieć na lato. http://wklej.org/id/3372000/
  3. jak to jest z tymi zmiennymi i funkcjami? w deklaracji funkcji deklaruje się w nawiasie zmienne pobierane z zewnątrz czy nowe zmienne, które są tylko w tej funkcji? nie jestem pewien co do tego dlatego pomiary są w różnych miejscach... http://wklej.org/id/3370144/ W tej chwili zrobiłem coś takiego. Teraz MPPT leci mi ciągle do zera :/
  4. W sumie masz racje chyba przekombinowałem z pomiarem napięcia wejściowego :/ Tam był rezystor 47k, źle wpisałem przez pośpiech, już poprawiłem. Teraz poprawiłem kod i dodałem poprawkę na szybkość zmiany jeżeli krok będzie taki sam: //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) { wzrost=1; } else wzrost=-1; } else if(delta_V > 0) { wzrost=-1; } else wzrost=1; } if( wzrost == wzrost_poprzedni ) factor++; else factor = 1; krok = wzrost * factor; pwm += krok; ustaw_pwm(pwm); V_in_poprzednie = V_in ; P_in_poprzednie = P_in; wzrost_poprzedni = wzrost; Układ zasilany był z zasilacza: wydajność 500mA, zaczepy napięciowe 3V, 4.5V, 6V, 7.5V, 9V i 12V. Tak na wyjściu był rezystor 10 Ohm, 5W. Potem jeszcze sprawdzałem jak to zadziała na silniczku DC i też było elegancko. Jeszcze na baterii nie sprawdzałem (nie chcę jej popsuć jeżeli algorytm będzie zły). Próbowałem zasilać to z mojego ogniwa i oświetlać je lampką ale marny efekt. W domu jak byłem na wsi to oświetlałem żarówką 100W to dopiero jakiś tam efekt był widoczny. Tutaj mam tylko jakieś energooszczędne w lampce. Dlatego się zastanawiam czy z zasilacza wystarczy na "pokaz". Wypadało by jeszcze móc regulować prąd np jakimś potencjometrem ale to bez sensu bo mam same 10kR a tu raczej by był potrzebny jakiś potencjometr mocy w okolicach 10R. Możliwe, że uda mi się skorzystać z zasilacza laboratoryjnego w instytucie ale chyba jest mała szansa. Jeszcze jedna kwestia co do algorytmu. Po podłączeniu baterii, która nie może przekroczyć 4.2V napięcia ładowania to czy algorytm ten zauważy to czy trzeba jakoś go programowo ograniczyć? EDIT: Ogólnie algorytm nie startuje :/ 1.Podłączam zasilanie Arduino 2.Podłączam zasilanie wejściowe z PV (tutaj z zasilacza) I nie nie dzieje się nic :/ Zmienna pwm ani drgnie. Tutaj cały kod: http://wklej.org/id/3370009/ Dodatkowo jest jeszcze problem taki, że jak odejmuje pwm to trafić się może przypadek gdzie od 0 odejmie się 1 i wtedy do zmiennej się ładuje liczba 255 :/
  5. 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
  6. 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?
  7. 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
  8. 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?
  9. 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ż).
  10. 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<
  11. 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.
  12. 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?
  13. grg0, Dokładnie to Tylko dziwne bo teraz po aktualizacji w KiCad footprintów na SuperSOT-3 dalej wyskakuje mi takie samo połączenie w PCBNew :/ No nic, jutro dopiero na wieczór przysiądę nad tym i będę myślał co tu zrobić by to jakoś obejść...
  14. Znalazłem problem. Zły footprint wybrałem prawdopodobnie w KiCad i jest zamienione Drain z Source przez program, z czego źle jest wytrawione na płytce bo dioda nie jest zaporowo tak jak powinna być Teraz jak to obejść muszę wymyślić. Spokojnie mam jakąś podstawową kolbową stację lutowniczą z botlandu.
  15. Kupiłem 3, dwa mają przebicie został jeden. Nie sprawdziałem stanem niskim z arduino tylko podpiąłem bramkę bezpośrednio na masę. Podłączenie jest dokładnie takie jak na schemacie, te same oporniki itp. Sprawdziłem, wylutowane są dobre tzn pokazuje to napięcie tam około 0,525V - 0,625V... A sprawdzałem je tak też, że przyłożyłem 5V zasilacza (przez opornik i diodę LED) do Source oraz masę zasilacza do Drain i było zwarcie bez sterowania bramki. Tak samo jak bramkę wysterowałem masą (ale tylko jak układ był wlutowany bo tak to nie mam pięciu rąk ani żadnego trzmacza to trudno mi to sprawdzić). Może wlutuję jeszcze raz i sprawdzę na nowym lucie? Może zły lut był gdzieś? Temp lutowania takich elementów to około 250stopni co?
×
×
  • Utwórz nowe...