Sari la conținut
ELFORUM - Forumul electronistilor

voltampermetru cu pic 16f876


winston

Postări Recomandate

...daca curentul e in descrestere continua si crestere continua programul ruleaza perfect se aprind ledurile aferente, dar daca sa zicem creste 3 secunde si dupa nu mai creste curentul e constant se aprinde cel care indica ca e egal, e normal asa dupa cod ca tot actualizeaza valoarea temporala, ce as putea face este sa maresc timpul de la bucla.

Eu nu inteleg ce vrei sa faci? Poate ideea ta era sa compari cu o valoare programata dinainte, astfel vei stii ca creste/descreste in raport cu acea valoare.La sursa mea, am pus un potentiometru care programeaza curentul (intrare pe un ADC). Mereu ma raportez la acea valoare, si sursa deconecteaza sarcina daca ii care un curent superior. Asta cauti? Cu ledurile aprinse vreau sa zic, nu cu deconectarea.
Link spre comentariu

ai dreptate, am interpretat eu gresit, am discutat cu giongiu si a zis ca asa vroia.

 

eu ma refeream ca de exemplu sa indice ca in ultimele minute curentul a fost intr-o crestere, dar asta e alta mancare de peste, am testat si eu si merge bine, Multumesc!

Link spre comentariu

Eu l-am rugat pe Mihai,caruia ii multumesc inca o data,sa implementeze aceste functii.Sa explic ce vreau sa fac...Monitorizez curentul de incarcare,printr-un acumulator,incarcat de un generator eolian,printr-o sursa buck.Vreau astfel sa obtin maxim de putere,indiferent de viteza vantului,modificand umplerea sursei.Plec de la umplere zero,crescand cu pasi de 1%,sa zicem.Simultan e monitorizat curentul prin acumulator.Crescand umplerea,creste curentul,pana intr-un punct,cand va incepe iar sa scada.Acesta e punctul de putere maxima.Aici opresc cresterea umplerii.Daca la urmatoarea masuratoare,curentul prin acumulator creste,va creste iarasi umplerea,daca insa curentul e mai mic,scad umplerea.Si tot asa....Sunt doi pini ce comanda cresterea/scaderea umplerii.Ledurile ce semnalizeaza cresterea/scaderea curentului,vor fi inlocuite cu tranzistori ce vor comanda pinii de crestere/scadere a umplerii.De aceea ma intereseaza ca la fiecare masuratoare,curentul masurat sa fie comparat cu valoarea anterioara,asta in tot intervalul de masurare.Parca problema mea,nu se incadreaza aici.Imi cer scuze de off topic,daca e nevoie,deschid unul nou.

Link spre comentariu

Se lucreaza cu doua variabile, una cu masuratoarea veche si una cu cea noua. Dupa comparare continutul celei noi se muta in cea veche, etc. La pornire variabila "veche" are valoarea zero. Succes!

Link spre comentariu

Sunt doi pini ce comanda cresterea/scaderea umplerii.Ledurile ce semnalizeaza cresterea/scaderea curentului,vor fi inlocuite cu tranzistori ce vor comanda pinii de crestere/scadere a umplerii.

se va pierde timp pe chestiunea asta cu tranzistorii, cred ca se poate direct din soft asta. si cred ca trebuie implementat un agoritm de autoreglare, un fel de reactie cum e sursa in comutatie. si pentru asta trebuie folosit PID.
Link spre comentariu
  • 1 lună mai târziu...

salutam o intrebare trebuie modificat ceva la schema inprealabila de la prima cea publicata pe site-ul 320 volt,de la prima pagina asfel incat sa imi recunoasca mie un afisaj de 2x20 de caractere ,un afisaj winstar wh2002A-TMI-CT

Link spre comentariu

Fara sa analizez tipurile de LCD de comparat: daca au controllere compatibile (asta este treaba ta sa verifici) merge fara nici o modificare. Ca pui 2x20 in loc de 2x16 iar nu necesita schimbari in soft. Ultimele 4 caractere de pe ambele linii vor fi nefolosite, deci nici o problema.Si ca sa o luam invers: la doua LCD-uri cu controllere compatibile, daca pui un 2x16 dar ai 4x20 in soft, ai sa afisezi numai ceea ce era pe primele 2 linii de la caracterul 1 la 16. Nici PIC si nici LCD nu se vor supara, doar tu o sa fii frustrat ca nu vezi tot ce trebuie :da .

Link spre comentariu
  • 2 luni mai târziu...

Fara sa analizez tipurile de LCD de comparat: daca au controllere compatibile (asta este treaba ta sa verifici) merge fara nici o modificare. Ca pui 2x20 in loc de 2x16 iar nu necesita schimbari in soft. Ultimele 4 caractere de pe ambele linii vor fi nefolosite, deci nici o problema.Si ca sa o luam invers: la doua LCD-uri cu controllere compatibile, daca pui un 2x16 dar ai 4x20 in soft, ai sa afisezi numai ceea ce era pe primele 2 linii de la caracterul 1 la 16. Nici PIC si nici LCD nu se vor supara, doar tu o sa fii frustrat ca nu vezi tot ce trebuie :da .

Este vorba de acest watmetruhttp://homepages.paradise.net.nz/bhabbo ... meter.html
Link spre comentariu

cod:/*Afisaj digital multiplu-Afisare Tensiune 0-0V, Curent 0-0A, si Putere 0-0W*Configuratie:-PIC16F876A-Cristal 4 Mhz-LCD alfanumeric 16X2*Autor Marian@Elforum*///Conexiuni LCDsbit LCD_RS at RB1_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;sbit LCD_RS_Direction at TRISB1_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;//Declarare variabileunsigned char ch, ADCx;unsigned int Tensiune, Curent;unsigned long V, A, Pw;//Functie principalavoid main() {INTCON = 0; // Dezactivare intreruperiTRISA = 0x03; // RA0, RA1 setate ca intrariLcd_Init(); // Initializare LCDLcd_Cmd(_LCD_CURSOR_OFF); // Dezactivare cursorLcd_Cmd(_LCD_CLEAR); // Stergere EcranDelay_ms(1000); // Delay 1 secundaLcd_Out(1,2,"Afisaj Digital"); // Mesaj initial 1, prima linieLcd_Out(2,5,"Multiplu"); // Mesaj initial 1 linia 2Delay_ms(500);Lcd_Cmd(_LCD_CLEAR); // Stergere ecranLcd_Out(1,1,"V; A; W"); // Mesaj initial 2, prima linieLcd_Out(2,5," "); // Mesaj initial 2, linia 2Delay_ms(500);Lcd_Cmd(_LCD_CLEAR);while (1) {//Achizitie ADCTensiune = 0;Curent = 0;for (ADCx=0; ADCx<10; ADCx++) {Tensiune += ADC_Read(0); // Achizitie ADC pentru tensiuneCurent += ADC_Read(1); // Achizitie ADC pentru curentDelay_ms(10);}//TensiuneTensiune = Tensiune/ADCx; // Alocare valoare tensiuneV = (long)Tensiune*1000; // Converteste rezultat in milivoltiV = V/1023; // 0...1023 => 0...1000mVch = V/1000; // Extrage zeci 10.00Lcd_Chr(1,1,48+ch); // Afisare rezultat in format ASCII linia 1, coloana 1ch = (V/100) % 10; // Extrage unitati 01.00Lcd_Chr_CP(48+ch); // Afiseaza rezultat in format ASCIILcd_Chr_CP('.'); // Afiseaza caracter '.'ch = (V/10) % 10; // Extrage sutimi 00.10Lcd_Chr_CP(48+ch);ch = V % 10; // Extrage zecimi 00.01Lcd_Chr_CP(48+ch);LCD_Chr_CP('V'); // Afiseaza caracter 'V'Delay_ms(10);//CurentCurent = Curent/ADCx; // Alocare valoare curentA = (long)Curent*1000; // Convertire rezultat in milivoltiA = A/1023; // 0..1023 => 0-1000mVch = A/1000; // Extragere zeci 10.00Lcd_Chr(1,9,48+ch); // Scrie rezultatul in format ASCII linia 1, coloana 9ch = (A/100) % 10; // Extragere unitati 01.00Lcd_Chr_CP(48+ch); // Scrie rezultatul in format ASCIILcd_Chr_CP('.');ch = (A/10) %10; // Extragere sutimi 00.10Lcd_Chr_CP(48+ch); // Scrie rezultatul in format ASCIIch = A % 10; // Extragere zecimi 00.01Lcd_Chr_CP(48+ch);Lcd_Chr_CP('A'); // Afisare caracter 'A' la finalDelay_ms(10);//PuterePw = V*A/1000; // Seteaza valoare Puterech = Pw/1000; // Extrage sute 100.0Lcd_Chr(2,1,48+ch); // Scrie rezultatul in format ASCII linia 2, coloana 1ch = (Pw/100) % 10; // Extrage zeci 010.0Lcd_Chr_CP(48+ch);ch = (Pw/10) %10; // Extrage unitati 001.0Lcd_Chr_CP(48+ch);Lcd_Chr_CP('.');ch = Pw % 10; // Extrage sutimi 000.1Lcd_Chr_CP(48+ch);Lcd_Chr_CP('W'); // Afiseaza "W" la sfarsitDelay_ms(10);}}

 

 

Am modificat un cod(luat din topic) ,ce ar mai trebui modificat ca sa masoare 50.00V si 20.00A iar la putere 1000W( de fapt 999.9W).

Nu ma pricep sa-l simulez in proteus.

Multumesc anticipat.

Link spre comentariu

am modificat codul si am reusit ce vroiam si chiar sa "invat " cum e treaba cu proteus...

acum as vrea sa mai activez un port intrare ,dar inca nu am reusit sa ma prind cum se face, multumesc pentru sfaturi

Editat de aetius
Link spre comentariu
Vizitator nmihaic

Unde pot găsi și eu codul sursa schema electrica și dacă se poate codul sursa sa fie și comentat bine sa invat și eu un pic, va mulțumesc și va rog sa ma scuzați de posibilul post inutil, o zi bună.

Link spre comentariu

acum as vrea sa mai activez un port intrare 

Intai definesti inca o variabila (poti refolosi si una deja definita, da' la tine nu-s probleme cu spatiul)

unsigned int Tensiune, Curent, uiATreiaMarime;

Dupa aceea trebuie sa te asiguri ca al treilea port dorit  (sa zicem RA2) e intrare:

TRISA = 0x07; // RA0, RA1, RA2 setate ca intrari

Achizitionezi si a treia intrare:

//Achizitie ADCTensiune = 0;Curent = 0;uiATreiaMarime = 0;for (ADCx=0; ADCx<10; ADCx++) {   Tensiune += ADC_Read(0); // Achizitie ADC pentru tensiune   Curent += ADC_Read(1); // Achizitie ADC pentru curent   uiATreiaMarime += ADC_Read(2); // Achizitie ADC pentru a treia marime   Delay_ms(10);}

Prelucrezi datele astfel obtinute.

Spor!

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