Sari la conținut
ELFORUM - Forumul electronistilor

voltampermetru cu pic 16f876


winston

Postări Recomandate

@bratueduard cu placere oricand, ma bucur ca programul scris de mine functioneaza asa cum preferi, astept noutati, mult succes.

 

@Nel65 Revin cu modificarea codului pentru 876, mai precis adaugirea ledului, pentru care au trebuit adaugate liniile astea la ultima varianta de cod pentru tine:

TRISC = 0;PORTC = 0;//LEDif (Tensiune>314 && Curent<40) {PORTC.F3 = 1;}else {PORTC.F3 = 0;}
Asa cum ai cer5ut, in momentul in care tensiunea depaseste 27,5V si simultan, curentul scade sub 4A, ledul care este conectat pe pinul 14, se aprinde, pragurile exacte sunt 27,7V si 3,8A:

Posted Image

 

Hex-ul:

[attachment=0]Nel65#4.rar[/attachment]

 

Astept confirmarea daca este ok asa pentru a trece la portarea codului asta si pentru 88x...

Link spre comentariu

merge perfect,multumesc ,raman dator desi nu stiu cum o sa ma achit de datorie.Inca o rugaminte am ,pune-mi si mie codul complet aici, ca la ultima varianta de cod care a mers bine ,cea de 90V-100A cu zecimi nu ai pus codul .ma uit si eu prin el ,poate pricep ceva de unul singur

Link spre comentariu

Ei lasa ca si eu am fost ajutat la randul meu de altii, nu m-a costat nimic sa scriu cateva randuri de cod, poate doar ceva timp, dar din asta am.

 

Codul sursa complet pentru ultimul hex:

/*Afisaj digital multiplu -Afisare Tensiune 0-90V, Curent 0-100A, si Putere 0-9000W *Configuratie: -PIC16F876A -Cristal 4 Mhz -LCD alfanumeric 16X2 *Autor Marian@Elforum *Beneficiar @Nel65 Elforum *///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;     TRISA = 0x03;     TRISC = 0;     PORTC = 0;     Lcd_Init();     Lcd_Cmd(_LCD_CURSOR_OFF);     Lcd_Cmd(_LCD_CLEAR);      while (1) {            //Achizitie ADC            Tensiune = 0;            Curent = 0;            for (ADCx=0; ADCx<10; ADCx++) {            Tensiune += ADC_Read(0);            Curent += ADC_Read(1);            Delay_ms(50);            }            //Tensiune            Tensiune = Tensiune/ADCx;            V = (long)Tensiune*900;            V = V/1023;            ch = V/100;            if (ch==0) {                Lcd_Chr(1,1,32);                }            else {                Lcd_Chr(1,1,48+ch);                }            ch = (V/10) % 10;            Lcd_Chr_CP(48+ch);            Lcd_Chr_CP('.');            ch = (V/1) % 10;            Lcd_Chr_CP(48+ch);            LCD_Chr_CP('V');            Delay_ms(10);            //Curent            Curent = Curent/ADCx;            A = (long)Curent*1000;            A = A/1023;            ch = A/1000;            if (ch==0) {                LCD_Chr(1,9, 32);               }            else {                LCD_Chr(1,9,48+ch);            }            ch = (A/100) % 10;            Lcd_Chr_CP(48+ch);            ch = (A/10) % 10;            Lcd_Chr_CP(48+ch);            Lcd_Chr_CP('.');            ch = (A/1) % 10;            Lcd_Chr_CP(48+ch);            Lcd_Chr_CP('A');            Delay_ms(10);            //Putere            Pw = V*A/100;            ch = Pw/1000;            Lcd_Chr(2,1,48+ch);            ch = (Pw/100) %10;            Lcd_Chr_CP(48+ch);            ch = (Pw/10) %10;            Lcd_Chr_CP(48+ch);            ch = (Pw/1) %10;            Lcd_Chr_CP(48+ch);            Lcd_Chr_CP('W');            Delay_ms(10);                        //LED            if (Tensiune>314 && Curent<40) {            PORTC.F3 = 1;            }            else {            PORTC.F3 = 0;            }      }}
Link spre comentariu
Vizitator Vasile1968

@Marian...Ave maestre ! confirm ce a spus si @Nel65 , codul e bun, functional 100%. Am atasat poze cu "realizarea" practica.Ma bucur ca i-am putut da o utilizare la acest tip de MCU - 16F883, cand va fi si reglat va echipa un incarcator baterie auto, home-made :freaza: . Multumesc lui Marian pentru disponibilitatea si timpul acordat, am bea o bericica sau cafea icon_jook dar e distanta prea mare intre noi .

p/s. scuze pentru slaba calitate a pozelor dar vad ca e limitat nr. de KB....

post-80713-139829708832_thumb.jpg

post-80713-139829708844_thumb.jpg

post-80713-139829708854_thumb.jpg

Link spre comentariu

@Vasile1968 chiar ca te misti repede, felicitari, ma bucur sa vad ca ceva ce am facut eu e util cuiva. Referitor la poze, eu rar urc poze aici pe forum, de obicei le incarc pe contul meu de pe immageshack si aici pun doar link, acolo exista limita la 5Gb pentru upload total cumulat care este tare greu de atins din poze penca de obicei eu le modific cu ACDS pentru a nu avea imagini mai mari de 1Mb.

@Nel65 nu am uitat de 886, vin cu ultimul cod ce-l postasem pentru tine, portat si pentru PIC16F886:

/*Afisaj digital multiplu-Afisare Tensiune 0-90V, Curent 0-100A, si Putere 0-9000W*Configuratie:-PIC16F886-Cristal 4 Mhz-LCD alfanumeric 16X2*Autor Marian@Elforum*Beneficiar @Nel65 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 intreruperiANSEL = 0x03; // AN0 si AN1 activateANSELH = 0; // Celelalte canale ADC dezactivateTRISA = 0x03; // RA0 si RA1 setate ca intrari, restul sunt iesiriTRISC = 0; // Portul C setat ca iesirePORTC = 0; // Resetare port CLcd_Init(); // Initializare LCDLcd_Cmd(_LCD_CURSOR_OFF); // Dezactivare cursorLcd_Cmd(_LCD_CLEAR); // Stergere ecranwhile (1) {//Achizitie ADCTensiune = 0;Curent = 0;for (ADCx=0; ADCx<10; ADCx++) { // Achizitie ADCTensiune += ADC_Read(0);Curent += ADC_Read(1);Delay_ms(50);}//TensiuneTensiune = Tensiune/ADCx; // Alocare valoare tensiuneV = (long)Tensiune*900; // Comverteste rezultatul in milivolti ( Setare gama de afisaj )V = V/1023; // 0...1023 => 0...900mVch = V/100; // Extrage zeci 10.0if (ch==0) { // Bucla conditionala "if" afiseaza spatiu liber daca cifra zecilor este 0Lcd_Chr(1,1,32); // pe linia 1, coloana 1}else {Lcd_Chr(1,1,48+ch);}ch = (V/10) % 10; // Extrage unitati 01.0Lcd_Chr_CP(48+ch); // Afiseaza rezultatul in format ASCIILcd_Chr_CP('.'); // Afiseaza caracter "virgula"ch = (V/1) % 10; // Extrage zecimi 00.1Lcd_Chr_CP(48+ch); // Afiseaza rezultatul in format ASCIILCD_Chr_CP('V'); // Afiseaza "V" la finalDelay_ms(10);//CurentCurent = Curent/ADCx; // Alocare valoare curentA = (long)Curent*1000; // Converteste rezultatul in milivolti ( seteaza gama de afisaj )A = A/1023; // 0...1023 => 0...1000mVch = A/1000; // Extrage sute 100.0if (ch==0) { // Bucla conditionala "if" afiseaza spatiu liber daca cifra sutelor este 0LCD_Chr(1,9, 32); // pe linia 1, coloana 9}else {LCD_Chr(1,9,48+ch);}ch = (A/100) % 10; // Extrage zeci 010.0Lcd_Chr_CP(48+ch); // Afiseaza rezultatul in format ASCIIch = (A/10) % 10; // Extrage unitati 001.0Lcd_Chr_CP(48+ch); // Afiseaza rezultatul in format ASCIILcd_Chr_CP('.'); // Afiseaza "virgula"ch = (A/1) % 10; // Extrage zecimi 000.1Lcd_Chr_CP(48+ch); // Afiseaza rezultatul in format ASCIILcd_Chr_CP('A'); // Afiseaza caracter "A" la finalDelay_ms(10);//PuterePw = V*A/100; // Alocare valoare puterech = Pw/1000; // Extrage mii 1000Lcd_Chr(2,1,48+ch); // Afiseaza rezultatul in format ASCII, linia 2, coloana 1ch = (Pw/100) %10; // Extrage sute 0100Lcd_Chr_CP(48+ch); // Afiseaza rezultatul in format ASCIIch = (Pw/10) %10; // Extrage zeci 0010Lcd_Chr_CP(48+ch); // Afiseaza rezultatul in format ASCIIch = (Pw/1) %10; // Extrage unitati 0001Lcd_Chr_CP(48+ch); // Afiseaza rezultatul in format ASCIILcd_Chr_CP('W'); // Afiseaza caracter "W" la finalDelay_ms(10);//LEDif (Tensiune>314 && Curent<40) { // Bucla conditionala "if" activeaza LED pe portul C3PORTC.F3 = 1; // daca tensiunea si curentul indeplinesc simultan} // conditiile stabiliteelse {PORTC.F3 = 0;}}}

Am adaugat si comentarii la liniile mai importante pentru a usura intelegerea codului. Comportamentul este identic cu cel dinainte, modificarea fiind doar uC-ul folosit adica PIC16F886, in rest acelasi cristal de 4Mhz, acelasi LCD, etc... imagine cu simularea in proteus care zice ca ar fi ok, dar stii vorba aia tot practica e sfanta:
Posted Image

Si hex-ul:

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

Am si eu o intrebare/sugestie.Nu s-ar putea renunta la amplificarea caderii de tensiune de pe sunt?Daca s-ar programa PIC-ul,ca pentru 5V pe intrarea de curent,sa afiseze 1000,0A atunci la 0,1V ar afisa 20,0A.Adica s-ar putea masura 0-20A,cu o zecimala,cu maxim 100mV,cadere pe sunt.Sau in portiunea 0-100mV,liniaritatea nu e prea buna?

Link spre comentariu

Pentru un maxim afisat de 1000A raportati la maximul de 5V pe intrare adc, ar presupune ca pentru o variatie de 10mV afisajul sa se modifice cu 2A, pentru 1mV 200mA... etc, daca o rezolutie asa slaba te satisface atunci da, se poate.

Link spre comentariu

Sunt aplicatii,unde curentul nu trebuie citit cu mare precizie.De exemplu,un incarcator pentru acumulatori auto,sau aplicatii in care curentul se modifica rapid,intr-un interval scurt de timp.

Link spre comentariu

Pai in exemplul tau shuntul ar trebui sa fie de 5m Ohm, nu stiu ce precizie poti avea ca probabil cablurile/traseele de legatura au o rezistenta mai mare sau cel putin comparabila... in fine daca salturi atat de mari in afisare nu ti se par o problema, roaga-l pe @Mihai sa-ti modifice softul pentru asta ca-i simplu, amintesc de el penca deja are softul cu pwm-urile adaugate.

Link spre comentariu

Eu masor caderea de tensiune pe rezistenta de 5miliohmi,nu pe cabluri.Precizia e dictata doar de precizia suntului;caderile de tensiune pe cabluri,inerente de altfel,nu influenteaza precizia asuratorii.In paranteza fie spus,un sunt de 20A/75mV,are mai putin de 5 miliohmi.O sa testez mai intai liniaritatea ADC,pana la 100mV,sa nu munceasca Mihai degeaba.Daca liniaritatea nu e buna,renunt la idee si amplific caderea de tensiune de pe sunt,cu un AO.Off topic,ce oscilocop folosesti?

Link spre comentariu

Nu cred ca o sa ai probleme cu liniaritatea, mie mi s-a parut destul de ok 876-le.PS: Eu folosesc o chinezarie de pe la miv... ala la 10Mhz cu un singur spot, ca altceva nu mi-am permis, stiu ca tu ai ceva suuuuuper, dar ma multumesc si eu cu ce am :da

Link spre comentariu

eu am pic18f45k80 care are rezolutie adc pe 12bit (adica citeste 4096 de valori fata de 1024 cat are pe 10bit)e undeva la 30 de lei de pe adel.aida. daca folosim referinta interna cea de 5V de la alimentare vom avea o precizie de de 5v/4096= 1.2mV, si apoi daca se mai foloseste si referinta externa sa zicem 4.096V(este integrat special pentru asta) atunci vom avea prezicie de 1mV. si apoi daca modificam referinta se poate modifica si preciza(2.048, 1.024, 0.512V etc.).La lucrarea mea de licenta monitorizam curentul de incarcare al unui laptop folosind un sunt de 0.1R/3W pus pe masa, citeam de pe el de vreo 6 ori pe secunda, faceam media aritmetrica si afisam cu o zecimala si eram multumit de afisare.

Link spre comentariu

salut ma bate gandul sa fac si eu acest voltampermetru cu pic 16f876A am vazut ca este un cablaj unde lm385 este alimentat de la un stabilizator de 8v si iesirea lm este legata la intrarea pin3 aveti schema? pic16f876A .nu inteleg iesirea operationalului nu este la jumatea tensiuni de alimentare adica 4 v din cei 8 cu care este alimentat lm358 .? adica lm385 nu vine alimentat diferential?

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