Sari la conținut
ELFORUM - Forumul electronistilor

voltampermetru cu pic 16f876


Postări Recomandate

Cel mai bun simulator este... un breadboard! Este bine sa lucrezi pe parti, adaugand un alt pas odata cel precedent functional.Nu lucrez in MikroC (sunt obisnuit in Basic), dar inteleg ce scrii. Si programul de mai sus, pus de Marian, nu zice cum setezi intrarile analogice. Posibil ca ADCONx sa fie deja initializat cu 0x00. Programul tau (din PDF) nu foloseste decat AN0, 1 si 2. AN3 nu este prezent.Intrebare: daca nu calculai Puterea, iti citea AN3 corect? Lasa calculele de puteri pentru mai tarziu, intai fa-i sa mearga citirile de U si I. Fa acelasi tip de citire la curent ca la tensiune, uita de mediere pentru moment (tu masori 6 valori in approx. 10us, nu este prea util zic eu).Sugestie: Ia programul functional al lui Marian si dubleaza citirile de tensiune si curent. Asigneaza intrarile analogice si apoi faci calculele de puteri.

Link spre comentariu

Daca inteleg, cu 2 tensiuni si 2 curenti (adica 4 intrari ADC) merge bine. Asa este?Cand adaugi calculul puterii, se blocheaza. Asa este?Ce mesaj ai la compilare? Poti afisa? Daca nu mai ai memorie (m-as indoi insa!) sau depasesti cei 2kB de program compilabili in varianta free de la MikroC (asta mai probabil) sigur ai un mesaj de eroare de la compilator.Scuze, nu e ca sunt lenes ca sa compilez programul tau ca sa vad acest mesaj de eroare, dar nu am idee ce ai tu in configurarea PIC-ului (vezi Edit Program).Altfel, ar trebui sa mearga.

Link spre comentariu
  • 1 lună mai târziu...

Salut toti pasionatii de microcontrolere!Marturisesc ca sunt paralel cu acest domeniu,asa ca va rog sa-mi clarificati urmatoarea dilema.Cu un PIC16F876 si LCD 2X16,ce tensiune/curent/putere maxime se pot afisa.As fi interesat de 0-100V,0-50A,0-5000W .Mi-ar fi suficienta o singura zecimala,pentru fiecare,maxim doua pentru tensiune,daca se poate.Multumesc anticipat pentru orice raspuns!

Link spre comentariu

Poti afisa maximum 32 de caractere (2x16). Deci limitarea este numarul de caractere LCD si cum le aranjezi pe LCD. Atata vreme cat aia 100V si 50A sunt convertiti intr-un semnal 0-Vdd sau 0-Vref, poti afisa ce vrei tu.Sper ca este clar acuma ce poti face. Daca mai ai alte intrebari, stii ce ai de facut.

Link spre comentariu

Intr-adevar nu prea exista limita la ce poti afisa decat insasi numarul de caractere disponibil, orice parametru se doreste a se monitoriza, se poate face asta in cam orice gama dorita atata vreme cat monitorizarea in sine converteste variatiile acelui parametru, intr-o tensiune variabila intre 0 si 5V ( sau referinta, depinde cum se implementeaza ).O sa imi fac timp sa scriu eu azi o ciorna de cod pentru ceea ce s-a specificat si pe care o voi testa in proteus, mergand pe ideea de 0-5V pe ADC-uri, si daca veti fi de acord cu ea o vom optimiza pentru @giongiu, daca nu, atunci modific cum sugerati.

Link spre comentariu

Cam asta ar fi codul bazat pe PIC16F876A, cristal de 4Mhz si LCD 16x2:

//Conexiuni LCDsbit LCD_RS at RB7_bit;sbit LCD_EN at RB6_bit;sbit LCD_D4 at RB5_bit;sbit LCD_D5 at RB4_bit;sbit LCD_D6 at RB3_bit;sbit LCD_D7 at RB2_bit;sbit LCD_RS_Direction at TRISB7_bit;sbit LCD_EN_Direction at TRISB6_bit;sbit LCD_D4_Direction at TRISB5_bit;sbit LCD_D5_Direction at TRISB4_bit;sbit LCD_D6_Direction at TRISB3_bit;sbit LCD_D7_Direction at TRISB2_bit;//Declarare variabileunsigned char ch, ADCx;unsigned int Tensiune, Curent;unsigned long V, A, Pw;//Functie principalavoid main() {     INTCON = 0;                             // Dezactivare intreruperi     TRISA = 0x03;                           // RA0, RA1 setate ca intrari     Lcd_Init();                             // Initializare LCD     Lcd_Cmd(_LCD_CURSOR_OFF);               // Dezactivare cursor     Lcd_Cmd(_LCD_CLEAR);                    // Stergere Ecran     Delay_ms(1000);                         // Delay 1 secunda     Lcd_Out(1,2,"Afisaj Digital");          // Mesaj initial 1, prima linie     Lcd_Out(2,5,"Multiplu");                // Mesaj initial 1 linia 2     Delay_ms(3000);     Lcd_Cmd(_LCD_CLEAR);                    // Stergere ecran     Lcd_Out(1,1,"100V; 50A; 5000W");        // Mesaj initial 2, prima linie     Lcd_Out(2,5,"Giongiu");                 // Mesaj initial 2, linia 2     Delay_ms(3000);     Lcd_Cmd(_LCD_CLEAR);      while (1) {            //Achizitie ADC            Tensiune = 0;            Curent = 0;            for (ADCx=0; ADCx<10; ADCx++) {            Tensiune += ADC_Read(0);         // Achizitie ADC pentru tensiune            Curent += ADC_Read(1);           // Achizitie ADC pentru curent            Delay_ms(10);            }            //Tensiune            Tensiune = Tensiune/ADCx;        // Alocare valoare tensiune            V = (long)Tensiune*1000;         // Converteste rezultat in milivolti            V = V/1023;                      // 0...1023 => 0...1000mV            ch = V/1000;                     // Extrage sute 100.00            Lcd_Chr(1,1,48+ch);              // Afisare rezultat in format ASCII linia 1, coloana 1            ch = (V/100) % 10;               // Extrage zeci 010.00            Lcd_Chr_CP(48+ch);               // Afiseaza rezultat in format ASCII            ch = (V/10) % 10;                // Extrage unitati 001.00            Lcd_Chr_CP(48+ch);               // Afiseaza rezultat in format ASCII            Lcd_Chr_CP('.');                 // Afiseaza caracter '.'            ch = (V/1) % 10;                 // Extrage sutimi  000.10            Lcd_Chr_CP(48+ch);            ch = V % 10;                     // Extrage zecimi  000.01            Lcd_Chr_CP(48+ch);            LCD_Chr_CP('V');                 // Afiseaza caracter 'V'            Delay_ms(10);            //Curent            Curent = Curent/ADCx;            // Alocare valoare curent            A = (long)Curent*5000;            // Convertire rezultat in milivolti            A = A/1023;                      // 0..1023 => 0-5000mV            ch = A/1000;                     // Extragere zeci 10.00            Lcd_Chr(1,9,48+ch);              // Scrie rezultatul in format ASCII linia 1, coloana 9            ch = (A/100) % 10;               // Extragere unitati 01.00            Lcd_Chr_CP(48+ch);               // Scrie rezultatul in format ASCII            Lcd_Chr_CP('.');            ch = (A/10) %10;                 // Extragere sutimi 00.10            Lcd_Chr_CP(48+ch);               // Scrie rezultatul in format ASCII            ch = A % 10;                     // Extragere zecimi 00.01            Lcd_Chr_CP(48+ch);            Lcd_Chr_CP('A');                 // Afisare caracter 'A' la final            Delay_ms(10);            //Putere            Pw = V*A/1000;                   // Seteaza valoare Putere            ch = Pw/1000;                    // Extrage mii 1000            Lcd_Chr(2,1,48+ch);              // Scrie rezultatul in format ASCII linia 2, coloana 1            ch = (Pw/100) % 10;              // Extrage sute 0100            Lcd_Chr_CP(48+ch);            ch = (Pw/10) %10;                // Extrage zeci 0010            Lcd_Chr_CP(48+ch);            ch = Pw % 10;                    // Extrage unitati 0001            Lcd_Chr_CP(48+ch);            Lcd_Chr_CP('W');                 // Afiseaza "W" la sfarsit            Delay_ms(10);      }}
Si simularile in proteus:

Mesaj initial 1

Posted Image

 

Mesaj initial 2

Posted Image

 

Afisare rezultat

Posted Image

 

In cazul in care principiul te multumeste atunci se poate trece la eventuale personalizari si/sau optimizari.

Link spre comentariu
Vizitator Vasile1968

D-le Iora, as dori sa -mi fac un astfel de volt-ampermetru, numai ca dispun de un pic16F883 .in speranta ca si alti utilizatori ai acestui forum ar fi interesati, credeti ca ati putea face portarea softului de la pic16F876 la pic16F883 ?Va multumesc!p/s. bineinteles, si alti colegi forumisti care se pricep sunt invitati !

Link spre comentariu

@nel65 imi cer scuze pentru intarziere, am fost plecat toata ziua, abea acuma am ajuns acasa. In cazul in care configuratia in sine va multumeste atunci gama de masurare se poate ajusta oricum doriti, o sa modific codul pentru 100A ceruti restul inteleg ca poate ramane la fel, si revin apoi cu o arhiva in care pun si codul sursa si hex-ul pentru Dvs.

 

@giongiu ceea ce am atasat este doar codul sursa, este inutil pentru programare, daca ti se pare ok asa cum este atunci o sa atasez si hex-ul, daca mai doresti ceva ajustari spune-mi si modific dupa cum preferi. In alta ordine de idei, parca stiam ca ai nr meu de mobil... in fine iti las mesaj privat indata.

 

@Vasile1968 arhiva respectiva contine din cate vad doar hex-ul si simularea in proteus, fara codul sursa totul trebuie refacut de la capat, da-mi ceva specificatii te rog, inteleg ca doresti doar un voltmetru 0-35V si ampermetru 0-10A? uC-ul PIC16F883, oscilatorul cum sa fie, intern sau cristal extern, si la ce frecventa? Da-mi datele astea si voi incerca eu sa-mi fac timp sa-l scriu si revin apoi.

Link spre comentariu
Vizitator Vasile1968

@Marian....mai intai tin sa-ti multumesc pentru bunavointa.Da., as vrea sa fie pina in 35 volti, pina in 5 amperi, cu cristal de 4 Mhz, pe acelasi cablaj din pdf-ul existent in arhiva de mai sus....practic sa ramana la fel, numai tipul procesorului sa fie schimbat, respectiv pic16F883 , ca din astea am....te rog si iti multumesc mult !

 

p/s ca o curiozitate > nu poti desface hexul (cu picdisasm) si sa-l salvezi ca asm ? oricum, eu nu am nici rabdare, nici nu ma pricep

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