Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

ACvoltage and current measuring with PIC18F452

Status
Not open for further replies.

BoBX

New Member
Hello,everybody.I want to measure Ac currents and voltages with the following specifications;

My circuit & program code specifications;

Applied AC voltage 100Vpeak via a 1/20 resistor network attenuator to AN0/pin2 of PIC18F452/XTAL;20MHZ.

I wrote a program to show 25000Vrms/35355Vpeak,so we have a factor of;250x20x0.707xVadc=3535Vadc.[The followings are all detailes; my software].

But it shows only 0 on the LCD.For diagnosis I added this instruction to my program;
adclong0 =25000;then it showed on the LCD correctly.I even test my prog with LTC1966 chip[DC to RMS converter] or bridge or super rectifire[op-amp rectifier] or op-amp for voltage signal input conditioning but it does not work and just shows 0000000V.

Would you please tell me what is wrong with my program?

**My program;
/*
MCU: PIC18F452.

Oscillator: HS, 20.0000 MHz

GLCD: PG24064F [ T6963C driver/display 240x64 pixels ].

SW: mikroC PRO for PIC.
*/
#include "__T6963C.h"

unsigned long int adclong0=0,adclong1=0;
unsigned int ti=0,tn=0,t0=0,t1=0;
unsigned int xp,xl,yp,yl,xpos=0,ypos=0;
unsigned char ch0=0,ch1=0;
char *message;

//Voltage input calculations

void Display_Adcz(unsigned char ch0) {

extern unsigned int ypos;//To use a Zener at input so we have half wave
//and two zero points possibilities for Ac wave input.


//Get Vpeak from input voltage wave.

LADCV1:ti=ADC_Read(0);//Get ADC value from channel0;read until ti=0.
if(ti==0)goto LADCV2
else goto LADCV1
LADCV2:ti=ADC_Read(0);//1st sample;initial[previous].
tn=ADC_Read(0);//2nd sample;next.
if(tn>ti)goto LADCV2
else t0=ti;


adclong0 = (long)t0 * 5000;//Convert adc reading to milivolts.
adclong0 = adclong0 / 1023;// 0..1023 -> 0-5000mV.

//20=resistor network of input attenutor.
//Vrms = 0.707 Vpeak,[1/1.4142=0.707.].
//Input Transformer conversion index;[250=25000/100.].
//Peak input voltage= 35355v [2500Vrms.] at the primary
//converted to 141.42Vpeak[100Vrms.] peak at the secondary.

adclong0 = adclong0 * 3535;//0.707x20x250=3535.
...
....


Thanks & Regards,
 
Your not setting the chip up to read the adc pin

Here a sample I was using
Code:
#include <built_in.h>
unsigned int adc_rd;
void main() {

  
  ADCON1 |= 0x0D;            // Set AN0 and AN1 channel pin as analog
  TRISA0_bit = 1;            //   input
  TRISA1_bit = 1;            //   input
  TRISD = 0x00;              // Set PORTD as output

  while (1) {
    adc_rd = ADC_Read(0);    // get ADC value from 0nd channel
  }
}
 
Last edited:
Status
Not open for further replies.

Latest threads

New Articles From Microcontroller Tips

Back
Top