Sari la conținut
ELFORUM - Forumul electronistilor

Aparat masura - voltmetru cu memorie


amudsen

Postări Recomandate

Apelez la colegii cu experienta privind realizarea unui voltmetru cu memorie, gama de tensiune sa fie 0 - 1v, clasa de precizie  1 (mediu), memoria sa fie timp de 10 sec. (sau sa fie cu un buton reset), 1 citire pe secunda, iar afisarea sa se faca pe un display led cu 3  digiti (poate pe viitor cineva doreste sa se extinda domeniul de masura).  Este posibil ca acest montaj sa fie un inceput pentru un clamp ampermetru ceva gen imaginea de mai jos.

O posibila idee ar fi aici>

 

http://www.best-microcontroller-projects.com/lcd-volt-meter.html

 

post-201678-0-01734500-1425292082_thumb.jpg

Link spre comentariu
  • Răspunsuri 17
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • amudsen

    11

  • sofian

    3

  • franzm

    3

  • Marius Rotundu

    1

Am gasit pe respectivul, saptamana asta sper sa fac montajul de test pentru schema din Tehnium, numai ca montajul se alimenteaza la o sursa diferentiala de 12v, vreau sa il fac portabil, alimentat de la 4 baterii 1,5v ... partea de afisare sa o fac cu led 3 digiti ........ ii dau eu de capat.

Link spre comentariu

Am facut pe o placa de test un voltmetru cu pic 16f676 dupa schema

Posted Image

cam asa arata functional

Posted Image

codul in C ar fi........

 

#include <16F676.h>
#device adc=10
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,BROWNOUT,NOMCLR
#use delay (clock=4000000) // 4MHz clock

#rom  0x3ff={0x3444}

#byte PORTA = 0x05
#byte PORTC = 0x07
#byte TRISA = 0x85
#byte TRISC = 0x87

#define SPORTA PORTA
#define SPORTC PORTC

#define  TICKS_BETWEEN_INTERRUPTS   5000 //5000
#define  INTERRUPT_OVERHEAD   35
#define  TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))

const char SegCode[11] = {0x40,0x57,0x22,0x06,0x15,0x0C,0x08,0x56,0x00,0x04,0xFF};
 // 0   1   2   3   4   5   6   7   8   9
const char Column[3] = {0x02,0x01,0x04};
static char Segment[3] = {0x7f,0x7f,0x7f};  
static unsigned char ColCount=0x00;

void CPU_SETUP(void);
void Display(void);
void HTO7S(unsigned int32 Num);

byte i;
unsigned int32 result;

#INT_TIMER1
void Timer1(void)
{  
 set_timer1(TMR1RESET);
 Display();  
}  

void main()
{    
 unsigned char i;
 
 CPU_SETUP();
 
 while(true)
 {      
   result=0;
   for (i=0;i<20;i++)
   {
     set_adc_channel(3);
     delay_ms(1);
     result=result+read_adc();
   }
     //result = 0x3fe;                  
   HTO7S(result/20);  
   delay_ms(200);      
 }
 
}

void CPU_SETUP()
{
   
setup_comparator(NC_NC_NC_NC);  // not use comparator module
setup_adc_ports( sAN3 | VSS_VDD);
setup_adc(ADC_CLOCK_DIV_64);
TRISA=0b00011000;
PORTA=0x27;
TRISC=0b00000000;
PORTC=0x37;
   
   
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
set_timer1(TMR1RESET);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);   
}

//-------------------------------------
// Display routine
//-------------------------------------
void Display()
{
 PORTA = 0b00100111; // off all digits column and Segment G
 PORTC = 0b00111111; // off segment a-f  
 delay_cycles(2);
 

 if (ColCount>=3)
 ColCount=0;
   
 SPORTC = Segment[ColCount];
 SPORTA = ((Segment[ColCount] & 0b01000000)>>1) | (Column[ColCount]^0x07);
 ColCount++;        
}  

//--------------------------------------
// Convet HEX 2 byte to 7-Segment code
//--------------------------------------
void HTO7S(unsigned int32 Num)
{

 unsigned int32 res;

 
 Segment[0]=SegCode[30*Num/10230];
 if (Segment[0]==0x40)
 Segment[0]=0xFF;
 
 res = 30*Num%10230;
 Segment[1]=SegCode[10*res/10230];
 res=10*res%10230;
 Segment[2]=SegCode[10*res/10230];
}  
 

Rog un coleg daca poate sa modifice programul astfel incat afisarea sa fie pana la 1V (adica maxim sa arate 999 mV) si daca ar fi posibil, citirea sa ramana "stand-by" (adica dupa ce luam testerele de la tensiune) cam 5 - 7 sec.

Cu multumiri.

Editat de amudsen
Link spre comentariu

Prima data trebuie scos divizorul rezistiv de la intrare in PIC 47k si 33k + 50k

atentie daca depasesti 5v pe intrare la PIC se poate arde

 

trebuie modificata functia asta

//--------------------------------------// Convet HEX 2 byte to 7-Segment code//--------------------------------------void HTO7S(unsigned int32 Num){    unsigned int32 res;// test pentru depasire 999mv// ADC are 10bit deci 1024 pentru 5v rezulta ca pentru 999mv in ADC o sa avem 203// 1024  / 5v = 203    if (Num >= 203) {    Segment[0] = 0x28;    // "E" de la ERROR    Segment[1] = 0x28;    // "E"    Segment[2] = 0x28;    // "E"   }    else {    Segment[2]=SegCode[Num%10];    Num = Num/10;    Segment[1]=SegCode[Num%10];    Num = Num/10;    Segment[0]=SegCode[Num];   }// test pentru "0" daca da digit off    if (Segment[0]==0x40)    Segment[0]=0xFF;}
Link spre comentariu

Deci fisierul ar trebui sa arate asa>

 

#include <16F676.h>#device adc=10#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,BROWNOUT,NOMCLR#use delay (clock=4000000) // 4MHz clock#rom  0x3ff={0x3444}#byte PORTA = 0x05#byte PORTC = 0x07#byte TRISA = 0x85#byte TRISC = 0x87#define SPORTA PORTA#define SPORTC PORTC#define  TICKS_BETWEEN_INTERRUPTS   5000 //5000#define  INTERRUPT_OVERHEAD   35#define  TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))const char SegCode[11] = {0x40,0x57,0x22,0x06,0x15,0x0C,0x08,0x56,0x00,0x04,0xFF};  // 0   1   2   3   4   5   6   7   8   9const char Column[3] = {0x02,0x01,0x04};static char Segment[3] = {0x7f,0x7f,0x7f};  static unsigned char ColCount=0x00;void CPU_SETUP(void);void Display(void);void HTO7S(unsigned int32 Num);byte i;unsigned int32 result;#INT_TIMER1void Timer1(void){    set_timer1(TMR1RESET);  Display();  }  void main(){      unsigned char i;    CPU_SETUP();    while(true)  {          result=0;    for (i=0;i<20;i++)    {      set_adc_channel(3);      delay_ms(1);      result=result+read_adc();    }      //result = 0x3fe;                      HTO7S(result/20);      delay_ms(200);        }  }void CPU_SETUP(){     setup_comparator(NC_NC_NC_NC);  // not use comparator module setup_adc_ports( sAN3 | VSS_VDD); setup_adc(ADC_CLOCK_DIV_64); TRISA=0b00011000; PORTA=0x27; TRISC=0b00000000; PORTC=0x37;    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); set_timer1(TMR1RESET); enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER1);   }//-------------------------------------// Display routine//-------------------------------------void Display(){  PORTA = 0b00100111; // off all digits column and Segment G  PORTC = 0b00111111; // off segment a-f    delay_cycles(2);    if (ColCount>=3)  ColCount=0;      SPORTC = Segment[ColCount];  SPORTA = ((Segment[ColCount] & 0b01000000)>>1) | (Column[ColCount]^0x07);  ColCount++;        }  //--------------------------------------// Convet HEX 2 byte to 7-Segment code//--------------------------------------void HTO7S(unsigned int32 Num){   unsigned int32 res;// test pentru depasire 999mv// ADC are 10bit deci 1024 pentru 5v rezulta ca pentru 999mv in ADC o sa avem 203// 1024  / 5v = 203   if (Num >= 203) {   Segment[0] = 0x28;   // "E" de la ERROR   Segment[1] = 0x28;   // "E"   Segment[2] = 0x28;   // "E" }   else {   Segment[2]=SegCode[Num%10];   Num = Num/10;   Segment[1]=SegCode[Num%10];   Num = Num/10;   Segment[0]=SegCode[Num]; }// test pentru "0" daca da digit off   if (Segment[0]==0x40)   Segment[0]=0xFF;}

 

Sa vad cum generez hex-ul........ sa iau o piatra in gura, e cam prima oara :nebunrau:

Chiar mi-am spart dintii :tryre  ...... ma puteti ajuta cu generarea hex-ului? Cand se poate, bineinteles.

Link spre comentariu
Imi apare eroarea la linia 37, 
 
*** Error 128 "VOLT METER.c" Line 37(1,5): A #DEVICE required before this line
      1 Errors,  0 Warnings.
 
 
{#include <16F676.h>
#device adc=10 
#fuses INTRC_IO,NOWDT,PUT,NOPROTECT,BROWNOUT,NOMCLR
#use delay (clock=4000000) // 4MHz clock
 
#rom  0x3ff={0x3444}
 
#byte PORTA = 0x05
#byte PORTC = 0x07
#byte TRISA = 0x85
#byte TRISC = 0x87
 
#define SPORTA PORTA
#define SPORTC PORTC
 
#define  TICKS_BETWEEN_INTERRUPTS      5000 //5000
#define  INTERRUPT_OVERHEAD            35
#define  TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))
 
const char SegCode[11] = {0x40,0x57,0x22,0x06,0x15,0x0C,0x08,0x56,0x00,0x04,0xFF};
   //                       0    1    2    3    4    5    6    7    8    9
const char Column[3]   = {0x02,0x01,0x04};
static char Segment[3] = {0x7f,0x7f,0x7f};
static unsigned char ColCount=0x00;
 
void CPU_SETUP(void);
void Display(void);
void HTO7S(unsigned int32 Num);
 
byte i;
unsigned int32 result;
// Device setup 
#include "16F676.h" 
#device *=16 
#device adc=10
#INT_TIMER1
void Timer1(void)
{
    set_timer1(TMR1RESET);
   
   Display();
}
 
void main()
{      
   unsigned char i;
   
   CPU_SETUP();
   
   while(true)
   {      
      result=0;
      for (i=0;i<20;i++)
      {
         set_adc_channel(3); 
         delay_ms(1); 
         result=result+read_adc();
      }
         //result = 0x3fe;                        
       HTO7S(result/20);
      delay_ms(200);          
   }
   
}
 
void CPU_SETUP()
{
 
   setup_comparator(NC_NC_NC_NC);   // not use comparator module
   setup_adc_ports( sAN3 | VSS_VDD); 
   setup_adc(ADC_CLOCK_DIV_64);
   TRISA=0b00011000;
   PORTA=0x27;
   TRISC=0b00000000;
   PORTC=0x37;
   
   
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   set_timer1(TMR1RESET);
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_TIMER1);
}
 
//-------------------------------------
// Display routine
//-------------------------------------
void Display()
{
   PORTA = 0b00100111;     // off all digits column and Segment G
   PORTC = 0b00111111;   // off segment a-f
   delay_cycles(2);
   
 
   if (ColCount>=3) 
   ColCount=0;
       
   SPORTC = Segment[ColCount];
   SPORTA = ((Segment[ColCount] & 0b01000000)>>1) | (Column[ColCount]^0x07);
   ColCount++;            
}
//--------------------------------------
// Convet HEX 2 byte to 7-Segment code
//--------------------------------------
void HTO7S(unsigned int32 Num)
{
 
    unsigned int32 res;
 
// test pentru depasire 999mv
// ADC are 10bit deci 1024 pentru 5v rezulta ca pentru 999mv in ADC o sa avem 203
// 1024  / 5v = 203
    if (Num >= 203) {
    Segment[0] = 0x28;    // "E" de la ERROR
    Segment[1] = 0x28;    // "E"
    Segment[2] = 0x28;    // "E"
   }
    else {
    Segment[2]=SegCode[Num%10];
    Num = Num/10;
    Segment[1]=SegCode[Num%10];
    Num = Num/10;
    Segment[0]=SegCode[Num];
   }
// test pentru "0" daca da digit off
    if (Segment[0]==0x40)
    Segment[0]=0xFF;
}
 
Editat de amudsen
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