DC/DC měnič PIC16F876 report naměřených dat (U a I) - chyba

Jsem rád, že to fachá :slight_smile:.

To už záleší na programu v mcu. Nedetekuje zvýšený napětí (když je LT zastaveno, napětí na panelu vyleze) a nezkusí měnič spustit?
Ostatně měl bys to bejt schopnej vyzkoušet. Přikrej panel a až se měnič zastaví, zas ho odkrej :slight_smile:.

Tak dneska jsem to otestoval. Připojil jsem měnič večer k panelu, a jakmile se rozednívalo, tak na panelu rostlo napětí. Tím se zapnul měnič, ale panel nedal ještě dostatek energie k nabíjení baterky, tím se rozsvítila žlutá LED a mcu vypl LTčko. Mám tam zapojený i ventilátor (z snímacím odporem proudu, takže vyhodnocuje proud, který teče i větrákem). Slunce už dodávalo víc energie, měnič byl však stále vypnut. Zkusil jsem přidat další zátěž, že snímacím oporem tekl větší proud, ale měnič na to nereagoval…

Bude tedy nutná úprava programu, potřeboval bych s tím však pomoci… Jak jsem psal dříve, programování není mou silnou stránkou…

přikládám program, co je v mcu.
program_PIC16F876_new const.c (6.14 KB)

Tak dneska jsem to otestoval. Připojil jsem měnič večer k panelu, a jakmile se rozednívalo, tak na panelu rostlo napětí. Tím se zapnul měnič, ale panel nedal ještě dostatek energie k nabíjení baterky, tím se rozsvítila žlutá LED a mcu vypl LTčko. Mám tam zapojený i ventilátor (z snímacím odporem proudu, takže vyhodnocuje proud, který teče i větrákem). Slunce už dodávalo víc energie, měnič byl však stále vypnut. Zkusil jsem přidat další zátěž, že snímacím oporem tekl větší proud, ale měnič na to nereagoval…

Bude tedy nutná úprava programu, potřeboval bych s tím však pomoci… Jak jsem psal dříve, programování není mou silnou stránkou…

přikládám program, co je v mcu.
program_PIC16F876_new const.c (6.14 KB)

Tak dneska jsem to otestoval. Připojil jsem měnič večer k panelu, a jakmile se rozednívalo, tak na panelu rostlo napětí. Tím se zapnul měnič, ale panel nedal ještě dostatek energie k nabíjení baterky, tím se rozsvítila žlutá LED a mcu vypl LTčko. Mám tam zapojený i ventilátor (z snímacím odporem proudu, takže vyhodnocuje proud, který teče i větrákem). Slunce už dodávalo víc energie, měnič byl však stále vypnut. Zkusil jsem přidat další zátěž, že snímacím oporem tekl větší proud, ale měnič na to nereagoval…

Bude tedy nutná úprava programu, potřeboval bych s tím však pomoci… Jak jsem psal dříve, programování není mou silnou stránkou…

přikládám program, co je v mcu.

Napadlo mě, že by mohlo stačit rozšířit podmínku na řádku 93-97 o případ, když bude větší, ať opět zapne LTčko a vypne žlutou LEDku, ale nevím jak to napsat…

p.s. omlouvám se za několik kopií přízpěvku, ale házelo mi to chyby…
program_PIC16F876_new const.c (6.14 KB)

S tím musíš počkat na picaře :slight_smile:.

Ok, díky. Tak mám otázku pro programátory, podívejte se na moji starší odpověď a chci se zeptat, když přidám do kódu tuto část - na řádek 99 za konec podmínky “if (amp100 < 0.05)” :

else if (amp100 > 0.05) {
output_low(PIN_C4); // if current is > .05 then turn on PPT turn on yellow led
output_high(PIN_C3); // turn on FETs driver
delay_ms(1000); // delay to turn on
}

bude to fungovat, nebo je třeba to napsat jinak? Děkuiji

melo by to vypatat takle if (amp100 < 0.05) { // while PWM is set to 100% duty check to see if no more sun output_high(PIN_C4); // if current is < .05 then turn off PPT turn on yellow led output_low(PIN_C3); // turn off FETs by clearing EN pin on FET driver delay_ms(1000); // delay to shut down } // this will shut system down if no more solar current else {output_low(PIN_C4); output_high(PIN_C3); delay_ms(1000);}

jenze pokud se ti to vypne tak uz ti tam proud nikdy nevztoste :bulb:
spis bych to zapinal pri poklesu napeti na treba 13V if (batvolts <13){output_low(PIN_C4); output_high(PIN_C3); delay_ms(1000);}
a to bych dal az na 105 radek protoze se to vsechno odviji od veliciny “boost_counter”
mam v tom trochu zmatek je tam na me moc velicin :unamused: (mozna placam nesmysly ), jeste chvilku radeji pockej s upravou jestli se nekdo nechytne …

PS: psat kod primo sem je des !

Super, díky za radu. Zkusím to tam fouknout a uvidíme. vypadá to logicky… Dal jsem tam spíš podmínku v závislosti napětí na panelu:

if (voltage > 12){ output_low(PIN_C4); output_high(PIN_C3); delay_ms(1000);}

a vnořil jsem to do podmínky boost counteru - na řádek 105 ale před závorku.
Tak to testnu a uvidíme :wink:

Ještě mám jeden dotaz, teď mi to loguje data po 500ms na základě času smyčky, potřeboval bych to po sekundě, můžeš mi ještě v tom poradit?

Uvědomil jsem si, že kód je v C, takže do něj mohu juknout také.
Podle programu a zapojení je to konstruováno tak, že když měnič usoudí, že došlo slunce, skončí ten den činnost. V noci panel nic nedá a procesor je bez napájení. Ráno naběhne napájení, procesor naskočí a pokusí se spustit nabíjení.

Celý měnič je navržen jako step-down. Zkusil bych tedy změnit ukončovací podmínku tak, že se měnič zastaví pouze když nebude na panelu alespoň o 0.2V vyšší napětí než na baterii.

Modifikovaný program je v příloze.

Jen tak mimochodem - používat float aritmetiku na tak malém procesoru navíc když je tam zcela zbytečná… Nemám slov.
program_PIC16F876_new const.c (6.48 KB)

delay_ms(500);               //delay before next loop

500=0.5 s / 1 s = :bulb: :question:

piityy: pokud bude baterie nabita tak se to vypne + napeti na panelu bude o 0.2V vyšší než na baterii.
nebude se to pak stale prepinat ? podminka if (voltage < batvolts + 0.2) to zapne a podminka if (amp100 < 0.05) vypne , za predpokladu ze bude i splnena opodminka if ((++boost_counter % 20) == 0), nejak sem tam nenasel cim se plni ten “boost_counter” ?

a zapnuti by melo bejt

output_low(PIN_C4); output_high(PIN_C3);

Ikdyby to mělo přepínat, tak to asi nevadí, není to relé :slight_smile:. Každopádně vypínání při nabité baterii je na začátku smyčky, tam se pravděpodobně dostane pwm až na nulu v případě nabité baterie.
Podmínka “if (amp100 < 0.05)” to nezapne - je zakomnetovaná (tedy aspoň jesli váš překladač chápe /* zakomentovaný text */ jako komentář, což by měl (tento způsob komentářů v C je starší než samotné ANSI C). Navíc její obsah má význam vypnutí zařízení.

“++boost_counter % 20” - boost_counter se plní sám. Nejprve se přičte 1. Pak se spočítá zbytek po dělení 20ti. Jinými slovy pokud smyška trvá 0.5s, tak obsah podmínky se provede každých 10s.

Dobře, tak zkusím obě varianty - s ověřováním napětí panelu (viz přiložený zdroják) a pak kontrolu napětí baterie a panelu (piityyho program)…

Můj překladač rozpozná, co je komentář, takže jsem to tam našel. :slight_smile:
Je fakt, že to vypínání na základě proudu je nedořešené - proud se nemá jak zvýšit, když je LTčko deaktivované…

Daleko lepší varianta je řídit ho kontrolou napětí…

A k plovoucím proměnným, nejsem programátor, a jsem rád, že to šlape :slight_smile: A samozřejmě díky Vám jsme vychytali i ty mouchy, co tam jsou :slight_smile:

Příští týden to skočím naprogramovat a otestuju to…
program_PIC16F876_napeti.c (6.2 KB)

samozrejme ze to pozna, chyba na me strane, koukal sem na to v praci otevreny v obicejnym textaku (cernobily), tet uz to mam v prekladaci barevne rozliseny… :slight_smile:

Ještě mám jednu otázku vzhledem k výpočtu konstant - autor tam psal, že jsou jedny v závislosti na nastavení DC/DC měniče a druhé v závislosti na hodnotách u aktuálního zařízení - panelu a baterky, nejde mi do hlavy, v čem je mezi nimi rozdíl, když jsem to počítal pro svoje hodnoty, tak ať jsem dosadil jakékoliv napětí, konstanta je pořád konstanta…

current = average_ad(AMP_CHAN)/40.885; // read current and voltage from solar panel and going to
voltage = average_ad(VOLT_CHAN)/18.2887; // battery, use average_ad function return average value
batamps = average_ad(BAMP_CHAN)/41.3428; // as a float, divide by constant to scale into actual
batvolts = average_ad(BVOLT_CHAN)/20.4831;// volts and amps. These constants were measured in the
// actual prototype hardware.
// current = average_ad(AMP_CHAN)/40.96; // These constants are calculated by the gain of the
// voltage = average_ad(VOLT_CHAN)/18.618; // hardware not actually measured.
// They are commented out
// batamps = average_ad(BAMP_CHAN)/40.96; // if not used. If volt and amp constants not measured
// batvolts = average_ad(BVOLT_CHAN)/18.618;// then use this code

Nevím, kde teda přišel na tu konstanty u svého harware, viz. výpočty na straně 8-9 z přiloženého pdf.
NolanPeakPanekTracker102-94.pdf (401 KB)

Moc jsem to nezkoumal, ale pokud jsi nezměnil děliče ani referenci AD, tak zůstanou konstatny stejné.
Tam jde o HW možnosti procesoru.
Zvýšíš-li napětí na panelech, je potřeba přepočítat, jesli se na výstupu děliče neobjeví vyšší napětí než je reference procesoru. Pokud ano, musíš upravit dělič a tedy změnit konstantu. Ve tvém případě (napětí panelu do 40V, dělič 1/11, Vref=5V - pokud tyto hodnoty platí) nebylo třeba dělič modifikovat, takže s konstantou se nehýbe.

Ok, tak díky. To mě nenapadlo, že se to bude týkat rozsahu napětí procesoru. Takže by to mělo být ok… Nechal jsem to zkontrolovat i učitelem a je to vpořádku… :slight_smile:

Do sekce programátory a tématu - Pogramátor pro PIC18F452 jsem přidal otázku skrze programování PICu 16F876A, tak se mi tam prosím podívejte, děkuji.

Ahoj, tak jsem se sem po delší době zastavil… :slight_smile:

Verze od pittyho je funční v případě, že mezi měničem a akumulátorem je dioda - po východu Slunce a dostatečné slunešní intenzitě se měnič zapne, pokud diodu vyřadím, tak měnič jede - semtam problikne žlutá LED, ale nevypne se.

Bohužel s přídáním příkazu zapnutí

if (voltage > 12){ output_low(PIN_C4); output_high(PIN_C3); delay_ms(1000);}
se měnič nezapne…

zalezi kam si to dal …

spatne , za zavorku

Dej nám sem kdyžtak preventivně aktuální schéma a program. Už jsem mimo mísu a nechce se mi to celý znova luštit a domejšlet si modifikace hw.

Tak to je škoda, že jsem to nevěděl dřív, že to mělo být za závorku…

Až budu moct, tak to pak přeprogramuju…
Tady posílám schéma (nejsou tam akorát hodnoty) a aktuální program.
schema+program.rar (292 KB)