Sari la conținut
ELFORUM - Forumul electronistilor

voltampermetru cu pic 16f876


Postări Recomandate

Multumesc, si multumesc in special pentru ajutorul cu scrierea codului, reusita proiectului ti se datoreaza tie in principal.Inca n-am facut cablajul, vroiam intai sa testez jucaria pe breadboard ca sa fiu sigur ca-i ok si apoi sa realizez practic placa, ce spui ti se par ok testele facute? sau mai bine zis rezultatele despre care am vorbit?

Link spre comentariu

Marturisesc ca nu am pus si LED-ul dar o voi face ca sa vad daca se aprinde ( eu unul sunt destul de sigur ca da ). Cat despre spatiul ramas liber sincer sa fiu inca nu m-am decis ce sa pun pe el, banuiesc ca as putea monitoriza si ramura negativa din punct de vedere al tensiunii cu un eventual AO inversor, sau poate temperatura radiatorului de la regulatoare... sau altceva... momentan insa prefer sa il las asa ca imi este arhisuficient. :da O sa fac cablajul de cum pot si atunci vor mai urma si alte teste.

Link spre comentariu

Felicitari domilor proiect fain cu PIC16F876. Eu am facut unul gasit pe net, caut si pun aici cand ajung acasa. Panelmetru care masoara Volt+Amper+Temberatura cu LM35+Limitare la curent setat cu declansare releuDar asta e mai simpatic ca are rezulutia mai buna(Calculeaza W si R) decat al meu, si mai compact decat proiectul de pe forum cu PIC16F877.Cam cat e tensiunea si curentul maxim?

Link spre comentariu

http://vasileelettronic.altervista.org/ ... 20news.htm

 

Eu am inlocuit operationalele cu un singur TL047 se comporta excelent mai complicat partea de alimentare cu o tensiune negativa dar merita se comporta frumos.

Problema e cu rezulutia ampermetrului 100mA(nu ma pricep la programare) cam mult pentru proiectul meu urmator o sursa dubla stabilizata :freaza:

 

Al vostru pare mai versatil felicitari pentru domnu @Vlad Mihai pentru soft! :aplauze

A-si dori sa folosesc al vostru cu intrarea de la italian.

Nu stiu nu vreau sa terorizez pe domnu @Vlad Mihai dar era cumva grea o modificare de soft pentru curent maxim 10A si tensiune max 50V?

 

Ps:@marian@ la ultima poza postata nu calculeaza rezistenta?

Atasezi cablajul realizat de mine pentru Volt Ampermetrul Italianului

Volt.pdf

Link spre comentariu

nu e grea modificarea, să îmi spui ce pic folosești, ce fel de cuarț, să îmi spui ce tensiune maximă dorești și ce curent maxim și modificăm.

zimi la curent cum e treaba.. la 5A pe port sa afisezi 10A sau cum?

 

 

@Marian atasez o noua versiune ca sa calculeze si rezistenta de sarcina, e acelasi cod doar ca am adaugat asta. daca ai timp poate testezi si hexul asta. simulat functioneaza corect.

// LCD module connectionssbit LCD_RS at RB2_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 TRISB2_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;// End LCD module connections  unsigned int Tensiune,curent1,curent2,curent3,curent4,curent5,curent6,curent_medie,val1;  unsigned long u,i,power,res;unsigned char ch;void main(){  TRISA      = 0xFF;                       // designate PORTA as input  //INTCON = 0;                              // Disable all interrupts  //IRP_bit = 1 ;   TRISC.F3 = 0;      //declaram un port la iesire  pentru buzzer   TRISC.F4 = 0;   //declaram un port la iesire  pentru led   PORTC.F4=0; //starea initiala a portului setata in 0 logic, ledul e stins  Lcd_Init();                        // Initialize LCD  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off  Lcd_Cmd(_LCD_CLEAR);               // Clear display  Delay_ms(100);  LCD_Out(1,2,"*****VoltAmpermeter*****");  LCD_Out(2,2,"*******By Marian********");  Delay_ms(1500);  Lcd_Cmd(_LCD_CLEAR);  LCD_Out(1, 1,"V:");  LCD_Out(2, 1,"I:");  LCD_Out(1, 12,"R:");  LCD_Out(2, 12,"P:");  while (1)  {      // Citire Tensiune      Tensiune=ADC_read(0);                // get ADC value for U from channel 1      u=(long)Tensiune*3500;               // covert adc reading to milivolts      u=u/1023;                            // 0..1023 -> 0-3500mV      ch=u/1000;                           // extract 10.00 U digit      if (ch==0)        {          LCD_Chr(1,3, 32);                // write empty space if digit is 0        }      else        {          LCD_Chr(1,3,48+ch);              // write ASCII digit at 1st row, 2nd column        }      ch=(u/100) %10;                      // extract 01.00 U digit      LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point  LCD_Chr_CP('.');                     // write '.' at cursor point    ch=(u/10) %10;                       // extract 00.10 U digit     LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point      ch=u %10;                            // extract 00.01 U digit      LCD_Chr_CP(48+ch);                  // write ASCII digit at cursor point      ch=10u %10;                            // extract 00.001 U digit      LCD_Chr_CP(48+ch);                  // write ASCII digit at cursor point      LCD_Chr_CP('V');                     // write 'V' at cursor point   //Curent          curent1=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent2=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent3=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent4=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent5=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent6=ADC_read(1);                // get ADC value for U from channel 1          Delay_ms(50);          curent_medie=(curent1+curent2+curent3+curent4+curent5+curent6)/6;                i=(long)curent_medie*602;               // covert adc reading to milivolts      i=i/1023;                            // 0..1023 -> 0-3500mV      ch=i/1000;                           // extract 10.00 U digit      if (ch==0)        {          LCD_Chr(2,3, 32);                // write empty space if digit is 0        }      else        {          LCD_Chr(2,3,48+ch);              // write ASCII digit at 1st row, 2nd column        }      ch=(i/100) %10;                      // extract 01.00 U digit      LCD_Chr_CP(48+ch);    LCD_Chr_CP('.');                     // write '.' at cursor point    ch=(i/10) %10;                       // extract 00.10 U digit    LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point     ch=i %10;                            // extract 00.01 U digit      LCD_Chr_CP(48+ch);                  // write ASCII digit at cursor point      ch=10*i %10;                            // extract 00.001 U digit      LCD_Chr_CP(48+ch);                  // write ASCII digit at cursor point      LCD_Chr_CP('A');      //putere      power=u*i/1000;      ch=power/1000;      if (ch==0)        {          LCD_Chr(2,14, 32);                // write empty space if digit is 0        }      else        {          LCD_Chr(2,14,48+ch);              // write ASCII digit at 2nd row, 2nd column        }      ch=(power/100) %10;                  // extract 01.00 P digit      LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point      ch=(power/10) %10;                   // extract 0.10 P digit      LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point      LCD_Chr_CP('.');                     // write '.' at cursor point       ch=(power/1) %10;                   // extract 0.10 P digit      LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point      LCD_Chr_CP('W');                     // write 'W' at cursor point      // Resistance Calculation      if(power==0)        {          LCD_Out(2,10,"  ");              // write empty space          LCD_Chr_CP(243);                 // write 'infinity' at cursor point          LCD_Out(2,13,"  ");              // write empty space          LCD_Chr_CP(244);                 // write 'ohm' at cursor point        }      else        {          res=u*100/i;          if(res>=10000)            {              LCD_Out(1,14," > 1K");       // write " > 1K"              LCD_Chr_CP(244);             // write 'ohm' at cursor point            }          else            {              ch=res/1000;                 // extract 100.0 R digit              if (ch==0)                {                  LCD_Chr(1,14, 32);       // write empty space if digit is 0                }              else                {                  LCD_Chr(1,14,48+ch);     // write ASCII digit at 2nd row, 10th column                }              ch=(res/100) %10;            // extract 010.0 R digit              if (ch==0 && res<=99)                {                  LCD_Chr_CP(32);          // write empty space if digit is 0                }              else                {                  LCD_Chr_CP(48+ch);       // write ASCII digit at cursor point                }              ch=(res/10) %10;             // extract 001.0 R digit              LCD_Chr_CP(48+ch);           // write ASCII digit at cursor point              LCD_Chr_CP('.');             // write '.' at cursor point              ch=res %10;                  // extract 000.1 R digit              LCD_Chr_CP(48+ch);           // write ASCII digit at cursor point              LCD_Chr_CP(244);             // write 'ohm' at cursor point            }        }     //Buzzer          val1=ADC_read(1);      if (val1 > 1022) {          Sound_Init(&PORTC, 3);          Sound_Play(500, 1000);             // Play sound at 500Hz for 1 second       PORTC.F4=1; //led on       Delay_ms(100);       }       else   PORTC.F4= 0;}}

post-65525-139829637795_thumb.jpg

Link spre comentariu

O sa testez si chestia asta, ( intrebare de nub: stergeri si rescrieri repetate de hex in microcontroller il pot afecta? adica ma tem ca tot stergandu-l si reprogramandu-l sa nu-l stric... am zis, e intrebare de nub ca nu stiu, daca va straneste rasul asta e...), dar @Vlad am o nelamurire, in imaginea simularii tale pentru 35V si 2,4A apare o rezistenta de 145 Ohm, care-i logica? gandesc ca ar trebui sa fie 35/2,4=R... :nas:

Link spre comentariu

referitor la cod dar era o mica eroare care mi-a scapat(se inmultea rezultatul cu 10 pe undeva), acum am rezolvat, atasez noul hex.Picul are flash, astea cu F, se comporta ca un stick de memorie, poti sa il scrii pana te saturi, s-ar putea sa mori tu si picul inca sa mearga. Parca avea circa 10000 de stergeri si scriere, dar eu nu imi fac griji de asa ceva.

post-65525-139829637848_thumb.jpg

Link spre comentariu

@Vlad inainte sa testez, te stresez cu cateva chestiuni ( si-mi cer scuze dar sunt curios ):

 

-Limbajul in care scrii codul este C daca nu ma insel, nu?

-Apoi cu ce compilezi codul sursa dupa ce il scrii ( si de ce nu, cu ce il si scrii )? la softuri ma refer...

-Si intr-un final ceva legat de ultimul cod postat de tine, sectiunea asta de pe la inceput:

Lcd_Init();                        // Initialize LCD  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off  Lcd_Cmd(_LCD_CLEAR);               // Clear display  [b]Delay_ms(100)[/b];  LCD_Out(1,2,"*****VoltAmpermeter*****");  LCD_Out(2,2,"*******By Marian********");  [b]Delay_ms(1500)[/b];  Lcd_Cmd(_LCD_CLEAR);  LCD_Out(1, 1,"V:");  LCD_Out(2, 1,"I:");  LCD_Out(1, 12,"R:");  LCD_Out(2, 12,"P:");
Am bolduit 2 parametrii delay de care sunt interesat, primul cel de 100mS reprezinta cumva timpul cat dureaza pana apare textul ala generic? apoi cel de 1500mS ar fi timpul cat textul generic sta pe display ( corecteaza-ma te rog daca gresesc ). Daca am inteles corect atunci ar putea fi modificate astfel incat primul sa fie spre exemplu 500mS iar ce de-al 2-lea 3000mS? Asta ar presupune ca textul ala sa apara la 0,5S dupa alimentarea dispozitivului si apoi sa ramana pe ecran 3 secunde...
Link spre comentariu

Folosesc mikroC Pro for pic, are librarii vaste si pricep bine ceea ce fac, limbajul e C.deci secventa face asa:initialzeza LCD, opreste cursorul, sterge LCD(in caz ca apare ceva pe el la initializare), dupa ii da o mica intarziere, cu cat e mai mare cu atat apar mai greu cele 2 texte ce urmeazaal doilea delay face o intarziere mai mica sau mai mare de intrarea in paine a programului(adica afisarea tensiunii, curentului etc.) daca maresti intarzii practic.Da, valorile pot fi modificate cum vrei tu.am modificat eu valorile la delay. atasez hex.

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