Sari la conținut
ELFORUM - Forumul electronistilor

Lucreaza cineva cu FLOWCODE ?


bercioiu

Postări Recomandate

In exemplul cu ceasul digital se foloseste intrerupere generata de timer 0, intrerupere care se produce la 256 cicli mașina(adica la fiecare 52,083 microsecunde).

La un quartz de 19660800Hz, avem viteza de execuție a instrucțiunilor de 4915200 Hz(19660800/4), deci durata unei instrucțiuni este de 0,2035 microsecunde.
La fiecare 52,083 us vom avea o intrerupere, adica 19200 de intreruperi pe secunda.
Folosind prescaler 256 inseamna ca o sa avem 19200/256=75 de intreruperi pe secunda, asa cum ai intuit si tu.
In schema ta ai cuart de 12Mhz si daca prescalerul ramane la 256, atunci o sa ai intr-o secunda 45,776 intreruperi.

Aceasta valoare nefiind una intreaga o sa ai abatere in minus daca incrementezi secunda la 45, in plus daca incrementezi la 46.
O solutie, care sa te ajute, ar fi sa pui un cuart care sa-ti permita sa obtii o valoare intrega cand folosesti timer0 (ex.19660800 Hz).

Alta soltie ar fi sa lasi cuartul pe care il ai si sa folosesti intreruperea generata de timer2 cu prescaler rate= 1:16, postscaler rate=1:3 si rollover value =20, caz in care o sa ai fix 3125 de intreruperi pe secunda.
Exista si multe alte solutii, eu le-am dat pe cele mai simple.

Link spre comentariu

Am observat ca bateriile nu se incarca uniform, mai ales cand sunt de diferita capacitate si mai ales daca unele sunt un pic sulfatate. Din acest motiv vreau sa introduc o bucla de selectare a bateriei cu nivelul tensiunii cel mai mic si sa o incarc. Se va incarca mereu doar bateria cea mai descarcata si tot asa pana va ajunge valoarea unei baterii incarcate apoi se opreste incarcarea. Cand acea baterie va avea un voltaj mai mare decat alta, automat se va trece la incarcarea urmatoarei vaterii cu cel mai mic voltaj.

Am incercat cu puncte de legatura dar mi-am dat seama ca vor avea loc 16 comparai tensiune daca folosesc puncte de trimitere. Exista o ecuatie mai simpla care sa determine cea mai mica valoare citita sau va trebui sa includ metoda cea mai stufoasa?

Link spre comentariu

Am inteles cum sta treaba cu intreruperile si cum le pot folosi. Ce nu am inteles este cum ai calculat timpii in care se executa cicli si durata lor.Daca poti te rog sa imi explici sau ceva formule, ca nu pot sa imi dau seama. Multumesc!

LE: Acum am inteles! Se imparte secunda la frecventa si se afla cat dureaza o instructiune iar apoi se inmulteste cu 256 si se afla cat este timpul intre intreruperi. Matematica pura! :nas:

Editat de mikella
Link spre comentariu

Astazi de 2 ori am incercat sa o scot la capat cu compararile valorilor bateriilor si alegerea valorii minime pt incarcare rad nu am reusit. Pe langa faptul ca este un soft stufos mai rezulta un  labirint de trimiteri care la un moment dat ma baga  in balarii si se rupe firul..Am nevoie de o formula care sa determine si sa aleaga  valoarea minima.. Am cautat pe net dar nu am gasit.. In limbaje de programare exista asa ceva dar aici nu stiu..

Link spre comentariu

@aurellu67

Ca sa determini minimul dintr-un sir , ai nevoie de o variabila(minim) care pentru inceput devine egala cu valoare primul element al șirului,  apoi  o compari cu fiecare din restul elementelor.

Dacă variabila minim este mai mare decât elementul i al șirului, atunci variabila  minim va lua valoarea acelui element.Nu-i chiar atat de complicat.

Sa zicem ca ai patru ADC-uri, la primul pas atribui variabilei minim valoarea primului ADC,apoi o compari cu urmatorul ADC, daca e mai mare ca  variabila minim atunci minim ramane neschimbat,daca e mai mica atribui aceasta valoare variabilei minim s.a.m.d pana la ultimul ADC.Daca nu intelegi cum se face spune-mi si te ajut cu un macro care sa faca ce vrei tu, dar nu in weekend.

Trebuie vazut si cat de stabila este tensiunea masurata, e posibil ca minimul acela sa se schimbe foarte des.

Editat de Elison
Link spre comentariu
  • 2 săptămâni mai târziu...

Intre timp mi sa ars invertorul. Am atinsinvertorul de o banda de aluminiu pe acoperis si a facut flama. Apoi a murit, si deci nu am reusit sa testez programul nou cu incarcarea si egalizarea bateriilor. Dar pana imi vine noul invertor sinus pur de 2000wati din China voi folosi iarasi invertorul cu sinus modificat iar panourile vor fi orientate dupa soare. Deci am nevoie de tracker. Am finalizat programul in Folwcode, urmand sfaturile tuturor colegilor insa la simulare prima secventa functioneaza impropriu/ Adica in loc sa arda continuu ledul el la mine clipeste. Aceiasi secventa, pe verticala functioneaza corect. Precizez ca e acelasi cod, cu variabilele modificate doar, deci ar trebui sa functioneze identic. Va rog sa verificati daca aveti posibilitatea daca si la dvs functioneaza la fel.

solar tracker 887.rar

Link spre comentariu

In primul rand, primele iconuri cu portA, portB, portC, portD si portE=0, trebuiau scoase din bucla principala, alea le faci o singura data la inceputul programului.

In al 2-lea rand, pe la conditii pe jos ai incurcat iesirile, ceva de genul IF med4 > med3  then 1C5 , else 0A5 (in loc de 0C5).

 

Ti-am refacut exemplul. Am mai explicat in topicul asta cum se face o medie mai simplu. Am redus variabilele de la 25 la 5...

Ti-am mai pus o conditie la compararea variabilelor pentru a realiza un histeresis intre cele doua ADC-uri, modificand valoarea adaugata la ADC-ul comparat, modicici histeresisul, acum este de 5.

solar tracker 887_Bercioiu.rar

Editat de bercioiu
Link spre comentariu

Acum am observat difderenta intre programele Dvs si incercarile mele de a programa ceva. Am vazut sus, langa meniu ADC2-ADC3 si ADC0-ADC1. Am dedus ca sunt rutine care functioneaza concomitent si independent una fata de alta? Daca da cum pot adauga aici secventa de controler incarcare?

Link spre comentariu

Da, citirea ADC-urilor se face independent dar nu se face concomitent, pentru ca acolo ai niste bucle care fac media ultimelor zece citiri.

Atat timp cat programul sta intr-o bucla nu se executa altceva.

O bucla in care se citeste o intrare analogica se executa in in aproximativ 51 ms.Durata unei citiri a unui ADC fiind de 40 de cicli program(81,4us).

Poti sa mai reduci acest timp daca vrei ,modificand durata acelui delay(100 us) sau il poti lasa asa.

Poti sa adaugi secventa de incarcare intr-un nou macro pe care il apelezi in main, in acest fel iti este mai usor sa depanezi eventuale erori.

Se mai poate citi media ADC cu functia ADC_RAW_Average_Channel_Int, care are ca parametri numarul de citiri(NumSamples) si durata dintre doua citiri in microsecunde(DelayUs).E cam la fel cu bucla pe care o ai numai ca aici parametrii functiei pot fi variabile usor de modificat,in plus fiind si un mod mai rapid de a scrie programul in sine.

Editat de Elison
Link spre comentariu

Elison A punctat foarte bine, macrourile te ajuta sa-ti organizezi programul in asa fel, incat sa-l poti urmari si depana mai usor. Asa cum ti-a spus si colegul, macrourile sunt niste rutine pe care le apelezi din main si se executa in ordinea apelarii lor. Acel delay se poate micsora (chiar exclude) daca timpul dedicat citirii ADC-urilor este esential, adica daca in acel timp se poate intampla ceva cu acumulatorii, atunci poti modifica acel delay si chiar poti micsora si numarul citirilor.

Totusi l-as corecta pe colegul Elison in privinta buclelor, daca in timpul cat se afla in bucla, se declanseaza o intrerupere, atunci programul lasa balta bucla, rezolva rutina intreruperii, dupa care revine in bucla si reia rutina din locul de unde l-a parasit.

Link spre comentariu

am o problema in aplicatia mea mult iubita:

i-am adaugat o intrare ADC, prin intermediul careia masor tensiunea pe bateria automobilului, in felul acesta vreau sa detectez motorul pornit; atunci cand motorul este pornit sa nu-mi ia in considerare anumite comenzi.

toate bune si frumoase, am facut partea hardware, cu un divizor rezistiv, un Zenner pentru a nu permite ca tensiunea sa creasca(desi nu are cum ca divizorul rezistiv este de 47K intre 12V si pinul uC si de la pinul uC la masa mai este un rezistor de 10K)...

 

problema e in felul urmator:

cu motor oprit fara consumatori, ADC masoara 0x8E adica 142 decimal;

cu motor oprit si cu multi consumatori, valoarea ADC este 0x83 131 decimal;

cu motor pornit fara consumatori avem 0x96 150 decimal;cu motor pornit si toti consumatorii, ADC masoara 0x8E 142 decimal;motor oprit fara cansumatori dupa 5 min de la oprirea motorului ADC masoara: 0x86;

 

problema e ca se confunda motorul oprit fara consumatori cu motorul pornit cu consumatori(faruri aprinse, aeroterma), in ambele situatii ADC este 0x8E, adica 142decimal, si ma trezesc ca am functia respectiva activa ceea ce nu vreau!

 

Va rog frumos sa-mi dati un sfat, o sugestie!

 

LE: cumva sa fie vinovat divizorul rezistiv, mai exact rezostorul de 10k? sa-l inlocuiesc cu unul de 1K, intervalul in care ar varia tensiunea cand motorul este pornit-oprit, fiind unul mai mic? 

Editat de ardiles
Link spre comentariu

Chiar daca modifici divizorul cred ca povestea se va repeata.

Tensiunea pe baterie e posibil sa varieze si in functie de turatia motorului.

Mai elegant ar fi sa poti lua semnal de pe senzorul de pe volanta aborelui cotit sau si mai simplu bobina releului pompei de benzina in felul asta esti sigur ca motorul e pornit.

Probabil mai sunt posibilitati dar comanda releului pompei de benzina cred ca e cea mai accesibila.

Link spre comentariu
  • 2 săptămâni mai târziu...

Va rog sa ma ajutati sa imblanzesc Folwcode al meu REBEL! Face totul pana la compilare.

Am reinstalat pe alt calculator cu XP si acelasi lucru se intampla. O sa atasex fisierele rezultate poate va lamureste care este cauza. Nu pot apoela la altii pentru chestii atat de marunte ca schimbarea unui parametru in program..

flowcode.rar

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări