Bandi Szasz Postat Septembrie 5, 2015 Partajează Postat Septembrie 5, 2015 Am facut un circuit pentru a roti un panou solar dupa soare cu ajutorul unui motor de 12V. In simulare merge foarte bine, pus in practica face un lucru cam enervant de care nu scap nici cum. Softul zice ca pana cand unul dintre fotorezistente are valoare mai mica de ADC sa comande releul si sa se rotesca, in simulare merge perfect. Pus in practica face urmatorul lucru : - isi da seama ca trebuie sa se roteasca - porneste rotatia - face sleep 1s ( delay din loop aflat in main) - dupa delay intra in "processData" unde ar trebuii sa vada ca inca nu este rotit complet si sa lase rotirea pronita dar de fapt el face stop. - delay 1s -> intra in "processData" vede ca in pasul anterior sa oprit aiurea si incepe sa roteasca din nou. Deci optin ceva de gen "rotire"->"pauza 1s"->"rotire"->"pauza 1s"->"oprire in pozitia corecta" in loc sa se roteasca fara oprire pana la pozitia corecta. In schema nu vad vro lipsa care sa afecteze functionarea corecta, dupa cum cred eu este ca in momentele cand releul este pornit, citirea ADC se face cam aiurea si de aici vine concluzia ca ar fii o lipsa in partea de electronica dar nu imi dau seama care ar fii. Soft: #define LDR1 1 #define LDR2 2 #define maxTol 25 #define shutDown 200 #define HorMotLeft PORTC.F2 #define HorMotRight PORTC.F3 char isNightShutDown; int readLDRInput(char chanel) { int temp = 0; int i; for(i=0;i<10;i++) temp+= ADC_Get_Sample(chanel); temp/=10; return temp; }void stopHor() { HorMotLeft = 0; HorMotRight = 0; delay_ms(500);}void rotateHorLeft() { HorMotRight = 0; delay_ms(500); HorMotLeft = 1;}void rotateHorRight() { HorMotLeft = 0; delay_ms(500); HorMotRight = 1;}void processData() { int lt = readLDRInput(LDR1); // top left int rt = readLDRInput(LDR2); // top right if(abs(lt-rt) > maxTol) if(lt<rt) rotateHorLeft(); else rotateHorRight(); else stopHor();}void startUp() {rotateHorLeft();delay_ms(3000);rotateHorRight();delay_ms(3000);stopHor();}void main() {OSCCON = 0x6A;TRISC = 0x00;PORTC = 0x00;TRISA = 0xFF;ANSELA = 0x6;ADC_Init(); startUp(); while(1) { processData(); delay_ms(1000); }} Schema electronica : ( am un regulator LM7805, output ul este filtrat de un condensator 10uF si chiar langa scolul pic-ului este un ceramic de 100nF intre Vdd si Vss, totul este alimentat dintr-o baterie de 12V , 56Ah) Link spre comentariu
Stefan Postat Septembrie 5, 2015 Partajează Postat Septembrie 5, 2015 Pai ti-au dar raspunsul singur, adica "freaca menta 1s" (delay din bucla principala ce se executa la infinit). Din processData() trece in main() si tot asa. Link spre comentariu
Bandi Szasz Postat Septembrie 5, 2015 Autor Partajează Postat Septembrie 5, 2015 (editat) Pai da , dar din momentul in care a intrat de ex. la "rotire stanga", si releul este actionat trece inapoi in "void main" face delay 1s si dupa care cand intra in processData() in loc sa vada ca mai trebuie rotit ii da un stop(). Explic mai detaliat. In simulare functioneaza asa : cat timp trebuie rotit se roteste fara oprire si se opreste doar in momentul in care ambi fotorez. sunt egale. In practica: intra in processData vede ca trebuie rotit ii da comanda si se intoarce in main face delay 1s se duce inapoi in processData dar de data asta ii da un stop() in loc de rotire() pentru ca inca nu este pozitionat. Deci la fiecare apel de processData odata da comanda rotire ( cum este normal ) si la a doua apelare ii da un stop() in loc sa dea din nou la rotire() fiindca inca nu este pozitionat. processData(rotire)->delay 1s -> processData(stop)->delay 1s -> processData(rotire). Si asa obtin o rotire sacadata 1s se roteste dupa care 1s sta si asa mai departe in loc de o rotire continua pana la pozitionare. De acea am spus ca am impresia ca dupa ce a fost actionat releul si face delay 1s si merge inapoi in processData ( de data asta releeul este actionat ) citeste eronat ADC-ul si intra in : else cu functia de stop(). Dupa care la apelarea urmatoare cum releul a fost decuplat de functia stop(), ADC ul este citit corect si ii da din nou functia de rotire() Imagini Gif : Cum ar trebuii sa se roteasca : http://giphy.com/gifs/transparent-26BkMUrhunJq21iWk?message=uploaded ( rotire fluenta pana cand este rotit in pozitie) Si cum se roteste : http://giphy.com/gifs/transparent-l41lQJq9yY2nUyMKc?message=uploaded ( si cum se roteste cu sacadari 1s rotire - 1s pauza , etc ... ) Editat Septembrie 5, 2015 de bandi12 Link spre comentariu
Stefan Postat Septembrie 6, 2015 Partajează Postat Septembrie 6, 2015 Am inteles cum face insa abia acum am vazut ca doar la functia stop faci iesirile 0. In cazul acesta verifica ce sa intampla cu releele daca nu ai cuplat motorul in circuit, nu ai spus ce motor este dar e foarte posbil sa-ti bage paraziti pe ADC sau chiar sa iti reseteze microcontrolerul. Ai rezistorul de pull-up la MCLR si condensator 100nF? Pe intrarile ADC ai condensator de 100nF (cat mai aproape de pinii microcontrolerului)? Ai diode pe bobina releelor? Ai condensator pe bobina motorului sau dioda supresoare bidirectionala? Link spre comentariu
Bandi Szasz Postat Septembrie 6, 2015 Autor Partajează Postat Septembrie 6, 2015 MCLR e oprit din configuratii si e setat ca input normal. Am cond. 100nF la intrarea in pic chiar in fata soclului ( prima data l-am avut dupa regulator si PIC ul se reseta cand se cupla releul) dupa ce l-am lipit direct pe soclu nu mai face resetare, am si pe intrarile ADC cond de 100nF este adevarat ca nu este chiar langa PIC si mai degraba langa mufa unde se conecteaza cablul de la fotorez.( eventual incerc sa le lipesc si pe acelea direct pe soclu sa vad daca se schimba ceva). Motorul este unul de 12V , montajul in sine e un suport rotativ pentru antene parabolice dar un model cu rotatie si nu acele cu actuator. Am legat releul ce comanda motorul pe o baterie si montajul pe o alta baterie dar tot asa facea , deci nu este motorul in sine. Cel mai probabil este bobina releului, am pus si diode 1N4007. Link spre comentariu
Stefan Postat Septembrie 6, 2015 Partajează Postat Septembrie 6, 2015 Am inteles ca ai incercat cu alimentare separata dar fara motor ai incercat? Sau chiar si fara alimentare (deloc) la partea de motor si relee? pui niste leduri pe iesirile spre relee. Link spre comentariu
Bandi Szasz Postat Septembrie 6, 2015 Autor Partajează Postat Septembrie 6, 2015 (editat) Am incercat si fara alimentare la releu, nu am pus LED-uri findca se aude clar sunetul de "click" cand releul este actionat, dar face la fell, porma am lipit pe cablaj la intrarile de ADC inca un rand de cond. 100nF dar fara succes. Daca nu ii dau de cap, probabil ar merge marit delay-ul de 1s undeva la 5s, si atunci cand trebuie rotit , acele 5s o sa fie destule pentru a se rotii din nou in pozitia corecta. O sa incerc sa anulez total partea de relee si sa masor cu multimetru iesirile din PIC. Montajul arata cam asa. (putin murdar cablajul, inca nu am apucat sa curat pasta ramasa dupa lipire) , componentele lipsa sunt pentru urmarire verticala, pe care momentan nu-l folosesc, intai vreau sa vad cum o sa se comporte cu o singura axa si daca merge poate o sa fie implementat si pe verticala ( pentru care inca nu am nici partea mecanica) EDIT : am pus led-uri in loc de a comanda releul si se intampla aceleasi lucru : 1s on , 1s off. O fii o eroare in soft care nu se observa in simulare ? Editat Septembrie 6, 2015 de bandi12 Link spre comentariu
Bandi Szasz Postat Septembrie 6, 2015 Autor Partajează Postat Septembrie 6, 2015 (editat) Am gasit problema este legata de soft. Cand este apelata metoda de rotire se face : PORTC.F2 = 0 ( se decupleaza primul releu) -> delay 500ms - > PORTC.F3 = 1 ( se cupleaza releul de directie si se incepe rotirea ), am lasat un delay sa aiba releul timp sa decupleze sa nu nimereasca ambele cuplate in acelas timp. In simulare merge fara probleme. In realitate se pare ca PORTC.F2 = 0 reseteaza si pe F3 la 0 se face delay de 500ms dupa care se seteaza F3 din nou la 1 in loc ca F3 sa ramana intodeauna 1 cum se intampla in simulare si de acolo a rezultat problema. Pana la urma am facut o modificare sa nu se apeleze functia de rotire de 2 ori consecutiv ci doar dupa ce a fost dat si o comanda de stop si a rezultat ceva de genul void processData() { int lt = readLDRInput(LDR1); // top left int rt = readLDRInput(LDR2); // top right if(abs(lt-rt) > maxTol) { if(lt<rt && isRotLeft == 0) { rotateHorLeft(); isRotLeft = 1; } else if(lt>rt && isRotRight == 0) { rotateHorRight(); isRotRight = 1; } } else { stopHor(); isRotRight = 0; isRotLeft = 0; }} Cu led-uri in loc de releu merge cum ar trebuii urmeaza sa dau jos led-ul si sa montez la loc rezistenta de comanda la releu , dar cred ca nu o sa am probleme. Editat Septembrie 6, 2015 de bandi12 Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum