[SOLVED] PIC Volt Meter and Battery Charging Techniques

Status
Not open for further replies.
I think i know your problem.
Your internal Resistance of fluke is much much higher than your pic circuit,so there is some drop out in the leads from batt to the pic.
So its extremly important that u get your readings on the fluke : pic input: with load ,at the same checking point and i mean exactly not a mm before or after and all checks should be done at the same time in parallel.
 

thanks pnjbtr and kg300. can u please post the hex code of ups card pic16F72 famous in Pak?
 

Hex file for 16F72 UPS (16MHZ crystal) F.2.0
 

Attachments

  • UPS_16F72_16MHZ_f2.rar
    2.9 KB · Views: 359
Reactions: kif123

    kif123

    Points: 2
    Helpful Answer Positive Rating
dear Imtiaz Sab(kg3oo),
thanks for upload the hex code for pic16f72. kindly share the the schematic and pcb design for this ups on my E-mail:javed4004 at yahoo dot com.

thanks

javed
 

Thanks for ur code but i will be more helpful is you post the schematics,
 

AoA
Please javed sahib publish here your schematics of charger and ups so that we can use it
 

here is modify files for 16f676 chg
 

Attachments

  • img-1.png
    89.6 KB · Views: 288
  • 16f676-chg.rar
    121.4 KB · Views: 505
Thanks kg300 for uploading the files. it will be very helpfull. if possible please share the schematic and pcb design for ups pic16f72.
best regards,

javed
 

Last edited:

PIC16F72 based LCD(16*2 digit) meter for up to 304v ac.
 

Attachments

  • 16f72meter_micro_c.rar
    13.6 KB · Views: 404
Reactions: dselec

    dselec

    Points: 2
    Helpful Answer Positive Rating
Thanks kg300 for uploading Pic16f676-chg.rar files. it will be very helpfull. if possible please share the Sourcecode, schematic and pcb design files. So we can alter it for our purpose.
best regards.
 

DC Voltmeter up to 30V with PIC16F676.

You can easily modify code and adjust to other voltage range.

Compiler is MPLAB XC8 Compiler.

You have circuit, source file, hex file, PCB files, photos, description,...







 

Attachments

  • 30V DC Voltmeter PIC16F676.RAR
    587.8 KB · Views: 385


i want it modified up to 60 !
so change in C code
change as
i'm doing right ?
 

0-99,9V Example :

Code:
#include <htc.h>
__CONFIG (FOSC_INTRCIO & MCLRE_OFF & BOREN_ON & CP_OFF & CPD_OFF & WDTE_OFF & PWRTE_ON ); 



#define SPORT PORTA
#define DPORT PORTC
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 int Num);
void delayMs(int x);

unsigned int result;
unsigned int readAdc(void);
void interrupt  timer1_isr(void)
{
if(PIR1bits.TMR1IF==1)
{
PIR1bits.TMR1IF = 0;
	TMR1H=0xDF;
Display();
}
}
void main()
{		
	unsigned char i;
	
	CPU_SETUP();
	while(1)
	{			
		result=0;
		for (i=0;i<3;i++)
		{
			
			delayMs(1); 
			result=result+readAdc();
		}
				HTO7S(result/3);								
		
		delayMs(200);		    
	}
	
}

void CPU_SETUP()
{
	CMCON =0x07;		//Turn off comparator module
	ANSEL =0x8;			//AN3 as analog input
	ADCON1 =0x60; 		//clock/64
	ADCON0 = 0x8D;
   	TRISA=0b00011000;
   	PORTA=0x27;
   	TRISC=0b00000000;
   	PORTC=0x37;
   
   T1CON= 0x00;
  	TMR1H=0xDF;
   	INTCONbits.GIE =1;
	INTCONbits.PEIE=1;
	PIE1bits.TMR1IE =1;
 	T1CONbits.TMR1ON=1;
}
unsigned int readAdc()
{
unsigned int res;
ADCON0bits.GO_DONE =1;
while(ADCON0bits.GO_DONE ==1);
res=ADRESL+(ADRESH*0x100);
return(res);
}
//-------------------------------------
// Display routine
//-------------------------------------
void Display()
{
	PORTA = 0b00100111;	  // off all digits column and Segment G
	PORTC = 0b00111111;   // off segment a-f	

	

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

//--------------------------------------
// Convet HEX 2 byte to 7-Segment code
//--------------------------------------
void HTO7S(unsigned int adcstep)
{
	
	unsigned int res;
	
	// First digit (X)X,X
	res = adcstep * (unsigned long)9900 / 1023;
	Segment[0]=SegCode[res/1000];				// max Vin 99V. Result is ADV voltage (0-5V).
												// Example: Vin 25,3V result is 2,53 and takes 2
	if (Segment[0]==0x40) 						// If first digit is 0 then 
		Segment[0]=0xFF;						// do not show nothing.
		
	// Second digit X(X),X
	res = adcstep * (unsigned long)9900 / 1023;
	Segment[1]=SegCode[(res/100)%10];	// The same as first digit, but %10 takes 5	

	// Third digit XX,(X)
	res = adcstep * (unsigned long)9900 / 1023;
	Segment[2]=SegCode[(res/10)%10];	  
	
}	

void delayMs(int x)
{
int i;
for (x ;x>0;x--)
{
for (i=0;i<=110;i++);
}
}




0-9,00V Example :

Code:
#include <htc.h>
__CONFIG (FOSC_INTRCIO & MCLRE_OFF & BOREN_ON & CP_OFF & CPD_OFF & WDTE_OFF & PWRTE_ON ); 



#define SPORT PORTA
#define DPORT PORTC
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 int Num);
void delayMs(int x);

unsigned int result;
unsigned int readAdc(void);
void interrupt  timer1_isr(void)
{
if(PIR1bits.TMR1IF==1)
{
PIR1bits.TMR1IF = 0;
	TMR1H=0xDF;
Display();
}
}
void main()
{		
	unsigned char i;
	
	CPU_SETUP();
	while(1)
	{			
		result=0;
		for (i=0;i<3;i++)
		{
			
			delayMs(1); 
			result=result+readAdc();
		}
				HTO7S(result/3);								
		
		delayMs(200);		    
	}
	
}

void CPU_SETUP()
{
	CMCON =0x07;		//Turn off comparator module
	ANSEL =0x8;			//AN3 as analog input
	ADCON1 =0x60; 		//clock/64
	ADCON0 = 0x8D;
   	TRISA=0b00011000;
   	PORTA=0x27;
   	TRISC=0b00000000;
   	PORTC=0x37;
   
   T1CON= 0x00;
  	TMR1H=0xDF;
   	INTCONbits.GIE =1;
	INTCONbits.PEIE=1;
	PIE1bits.TMR1IE =1;
 	T1CONbits.TMR1ON=1;
}
unsigned int readAdc()
{
unsigned int res;
ADCON0bits.GO_DONE =1;
while(ADCON0bits.GO_DONE ==1);
res=ADRESL+(ADRESH*0x100);
return(res);
}
//-------------------------------------
// Display routine
//-------------------------------------
void Display()
{
	PORTA = 0b00100111;	  // off all digits column and Segment G
	PORTC = 0b00111111;   // off segment a-f	

	

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

//--------------------------------------
// Convet HEX 2 byte to 7-Segment code
//--------------------------------------
void HTO7S(unsigned int voltage)
{
	
	unsigned int res;
	
	// for 10bit ADC, using Vref=5000mV, result in mV
	res = ((voltage * (unsigned long)5000 / 1023)) / 5;   
	res = res * 9;

	// First digit (X),XX
	Segment[0]=SegCode[res/1000];
	
	// Second digit X,(X)X
	Segment[1]=SegCode[(res/100)%10];	

	// Third digit X,X(X)
	Segment[2]=SegCode[(res/10)%10];	  
	
}	

void delayMs(int x)
{
int i;
for (x ;x>0;x--)
{
for (i=0;i<=110;i++);
}
}
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…