LCD 2x16 Visualization using MCF51QE and Codewarrior 6.2

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

LCD 2x16 Visualization using MCF51QE and Codewarrior 6.2

1,650 Views
jreyes085
Contributor I

Hi again,

 

Im using the ADC with 12 bits, single measure, 4MHz. CPU speed 24Mhz. TPM1 to interrupt every 1ms.

LSB=732uV

 

Im in a trouble. Im planning to show the values that the ADC converts to digital values. I first measure power line voltage, later the current of the phase line, and then i calculate the instantaneous power and accumulate that power to have the energy. Every sine cycle i calculate th RMS voltage (Vrms) and the RMS current (Irms). I defined the variables of Vrms and Irms like "signed long" (That's 32 bit variable), i dont know to use the floating type variables so i decided to do this way.

 

What im doing is something like this:

 

*-**-**--**-*-*-*-

 

static unsigned long vrms,irms,buffer_energy,cont_unit_energy,max_unit;

 

static signed long inst_power,;

 

//every 1ms the TPM1 makes a interruption

 

Measure Voltage1;

Measure Current;

Measure Voltage2;

 

Voltage_mean=voltage1+voltage2>>1;    //to calc the mean voltage v_m=(v1+v2)/2

 

voltage_mean-=offset;      //substract offset value    1.5Volts=2048 LSBs

current-=offset;

 

voltage_mean*=gain_voltage;      //The gain that the sense circuit has

curretn*=gain_current;

 

voltage_pow2=voltage_mean*voltage_mean;       //the sum of voltage^2 of samples

current_pow2=current*current;

 

if(completed_one_sine_cycle){

   vrms=sqrt(voltage_pow2/numberofsamples_percycle);     //calculating the RMS voltage

   irms=sqrt(current_pow2/numberofsamples_percycle)

}

 

inst_power=voltage_mean*current;

 

buffer_energy+=inst_power;

 

if(buffer_energy>max_unit){

   cont_unit_energy++;

   buffer_energy-=max_unit;

}

 

-*-*-**-**-*-*-

 

That's what im doing.....I want to show the "Vrms", "irms" and the "cont_unit_energy" in the LCD.

 

* Irms is a long number....i was planning of first calculate how much digits in decimal it has, then show 5 Arms (Amperes RMS), 0.5 Arms, the MAX value would be 9 Arm.

 

* Vrms, the same, but with a MAX value of 135 Vrms.

 

* Cont_unit_energy, it's a counter and i think im going to make a lot of "IF" statements and display somethng like this...

 

10 Wh, 100Wh 1KWh, and a MAX value of 1000KWh

 

 

Thanks and appreciate your help!!!!!!!!!!!!!!!!!

Labels (1)
0 Kudos
1 Reply

504 Views
jreyes085
Contributor I

I forgot to specify:

 

I don't use floating point variables because i don't know about that. Then i have to do this:

 

* The ADC gives me the number of step (LSB) that the analog input has.

If i have 1.5 in my analog input then i would have an output of my ADC of 2048 in decimal.

 

* That value is multiply by the gain of the sense circuit that acquire the power line signal.

2048*100=204800

 

* Then i multiply the 204800*204800 to have the voltage^2.

 The result is 41.943.040.000

 ----------------------------->THAT'S AN ERROR! because my signed long supports max 2.147.483.648

 

I wil continue to expose what im using....but it's wrong! please help me!

 

* There's a accumulator that storage the voltage^2 of each sample every sine cycle...

 voltage_pow2+=voltage_prom^2

 

* Then I calc the Vrms and Irms

 vrms=sqrt(voltage_pow2/numberofsamples_percycke)

 

* My real value would be:

vrms=vrms*LSB;

 

This is one of the variables that i want to display on LCD.

 

The method that im using is wrong! do you know anything that can help me to do this efficiently?

 

Thanks!

0 Kudos