Marian Postat Noiembrie 14, 2013 Partajează Postat Noiembrie 14, 2013 @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: 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
nel65 Postat Noiembrie 14, 2013 Partajează Postat Noiembrie 14, 2013 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
Marian Postat Noiembrie 14, 2013 Partajează Postat Noiembrie 14, 2013 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
nel65 Postat Noiembrie 15, 2013 Partajează Postat Noiembrie 15, 2013 ok ,multumesc inca o data Link spre comentariu
Vizitator Vasile1968 Postat Noiembrie 15, 2013 Partajează Postat Noiembrie 15, 2013 @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 . 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.... Link spre comentariu
Marian Postat Noiembrie 15, 2013 Partajează Postat Noiembrie 15, 2013 @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:Si hex-ul: Link spre comentariu
nel65 Postat Noiembrie 15, 2013 Partajează Postat Noiembrie 15, 2013 merge si Nel65#5.rar,e ok ,multumesc Link spre comentariu
giongiu Postat Noiembrie 27, 2013 Partajează Postat Noiembrie 27, 2013 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
Marian Postat Noiembrie 27, 2013 Partajează Postat Noiembrie 27, 2013 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
giongiu Postat Noiembrie 27, 2013 Partajează Postat Noiembrie 27, 2013 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
Marian Postat Noiembrie 27, 2013 Partajează Postat Noiembrie 27, 2013 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
giongiu Postat Noiembrie 27, 2013 Partajează Postat Noiembrie 27, 2013 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
Marian Postat Noiembrie 28, 2013 Partajează Postat Noiembrie 28, 2013 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 Link spre comentariu
Vlad Mihai Postat Noiembrie 28, 2013 Partajează Postat Noiembrie 28, 2013 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
remus2509 Postat Noiembrie 30, 2013 Partajează Postat Noiembrie 30, 2013 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
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