Welcome!
cool Welcome PIC fans!
(to Pascal language fans too!)
Technical

Close General documentation

Close How to support PMP

Close Manuals

Close Tips

Other stuff

Close Documentation

Close How to support PMP

Close Off Topic

Close Today's favourites

Search




Downloads
Tips - How to measure Vdd without any pin!

If we want to know what is the Vdd voltage to say, elaborating a "low battery" condition, the normal way would be to measure it with a resistive divider on an analog input pin. This uses two resistors and a pin.

Fortunately, on most devices, there is the possibility to measure the internal VRef, and if we use Vdd as the analog range, the result is reverse proportional to Vdd:

function Low_Bat : boolean; // Check battery

    { Note: Battery sense uses VP6 reference so we always measure 0.6 V,
            so a/d value is depending to VDD with the law: n = 0.6 * Max / Vdd,
            so the a/d value is reverse proportional to Vdd;
            so we can compute Vdd = 0.6 * Max / n;

            Power is from a 3.6 V lithium battery.
            We fix a low bat value to 3.1 V.
    }

  const
    Max_Ana = 1023;                                        // 10 Bits analog max value
    VP6_Ref = 600;                                         // 0.6 V = 600 mV

    VP6_Ref_Error = - 25;                                  // -25 mV error on vref (manual adjustement for fine tuning)
    Low_Bat_Voltage = 3100;                                // 3.1 V = 3100 mV

   
// Low battery trigger value in analog raw binary value
    Low_Bat_Trigger = (VP6_Ref + VP6_Ref_Error) * Max_Ana div Low_Bat_Voltage;

  var
    V : word;
  begin
    { A/D init: may be done once at program start-up }
    ANSEL := 0;                   { Set selected channels mask }
    ANSELH := 0;                  { Set selected channels mask }
    ADCON1.ADCS := 5;             { Set clock selection to FOsc/16 }
    ADCON0 := [ADFM, ADON];       { Configure for 10 bits right justified, turn on the A2D module }
    VRCON.VP6EN := true;          { Activate A/D VP6 reference for Vdd measurement }

    // Normally we have to wait a while here for settle time...

    ADCON0.CHS := 13;             { Select VP6 channel }
    delay(5);                     { Wait 5 µS for A2D amp to settle and capacitor to charge }

    ADCON0.GO := true;            { Start conversion }
    while ADCON0.GO_DONE do;

    V := (word(ADRESH) shl 8) or ADRESL;
    ADCON0.ADON := false;         { Turn off AD to save power }

    Low_Bat := V >= Low_Bat_Trigger;     
  end;

 


Creation date : 2009.06.12 0:07 PM
Last update : 2013.08.05 11:23 AM
Category : Tips
Page read 23466 times


Print the article Print the article


react.gifReactions to this article


Connection...
 Members List Members : 75

Your Username:

Password:

[ Password lost ? ]


[ Join us ]


Member online :  Member online :
Anonymous online :  Anonymous online : 26

Total visits Total visits: 1679877  

Most ever online
Most ever onlineTotal : 170

The 01/01/2021 @ 17:50


Webmaster - Infos

Ip: 44.220.184.63

Search




Friends News
Where are you from?

Sentence to think about :  If it works, it's obsolete.   Marshall McLuhan
^ Top ^