Wordvariable - receives the adc reading.
Calibrate the microcontrollers internal ADC by measuring a fixed internal fixed voltage reference.
0.6V 20M, 28X1, 40X1 1.2V 28X2-3V, 28X2-3V 1.024V All other parts that support this command
Note that this command is not available on 28X2-5V/40X2-5V.
The reference voltage used by the PICAXE microcontrollers ADC reading (readadc/ readadc10) commands is the supply voltage. In the case of a battery powered system, this supply voltage can change over time (as the battery runs down), resulting in a varying ADC reading for the same voltage input.
The calibadc/calibadc10 commands can help overcome this issue by providing the ADC reading of a nominal internal reference. Therefore by periodically using the calibadc command you can mathematically calibrate/compensate the readadc command for changes in supply voltage.
calibadc can be considered as 'carry out a readadc on a fixed reference'.
Note that the voltage specified is a nominal voltage only and will vary with each part. Microchip datasheet AN1072 provides further details on how to software calibrate and use this advanced feature.
At clock speeds >= 32MHz it is necessary to use two consecutive 'calibadc' commands together to ensure the Vref has time to settle.
Theory of operation
Calibadc10 will give a result (Nref) which will depend on the reference voltage (Vref) and the PICAXE power supply voltage (Vpsu) as follows -
Nref = Vref * 1023 / Vpsu
This can be rearranged to determine the power supply voltage (Vpsu) from the calibadc10 result (Nref) -
Vpsu = Vref * 1023 / Nref
If the Vref were 1.024 volts then this will be -
Vpsu = 1.024 * 1023 / Nref
Vpsu = 1047.552 / Nref
Rounded to the nearest whole number -
Vpsu = 1048 / Nref
This will give the voltage in 1V units.
To obtain a voltage in millivolts (mV) -
Vpsu = 1.024 * 1023 * 1000
Vpsu = 1047552 / Nref
Which, accounting for PICAXE numerical constraints -
Vpsu = 52378 / Nref * 20
This program reads the 10-bit 'calibadc10' value into the word variable 'w1' and then reports what that reading is.
Determine the PICAXE supply voltage
This code demonstrates how to determine the PICAXE supply voltage. For example it may be that a vital peripheral chip must run at >=3.15 volts or else it will be unpredictable in function.
- Code Example:
Symbol Nref = w2 ; Word variable for the calibadc10 reading Symbol Vpsu = w3 ; Word variable for the supply voltage Main: calibadc10 Nref ; Take the reference reading Vpsu = 52378 / Nref * 2 ; Work out supply voltage if Vpsu > 315 then ; Is greater than 3.15 volts ; Battery is above 3.15 ; Yes ; volts so it is OK. gosub SafeToWork else ; No ; Shut down this project ; safely now, because the ; battery is going flat! gosub Shutdown end if goto Main ; Continue ; Notes ; ; Calibadc10 will give a result (Nref) which will depend on the reference ; voltage (Vref) and the PICAXE power supply voltage (Vpsu) as follows - ; ; Nref = Vref * 1023 / Vpsu ; ; This can be rearranged to determine the power supply voltage (Vpsu) from ; the calibadc10 result (Nref) - ; ; Vpsu = Vref * 1023 / Nref ; ; This will give Vpsu in units of volts (1000mV). To give Vpsu in units ; of 10mV we can multiply by 100 - ; ; Vpsu = Vref * 1023 * 100 / Nref ; ; For a Vref of 1.024 volts this will be - ; ; Vpsu = 1.024 * 1023 * 100 / Nref ; ; Vpsu = 104755.2 / Nref ; ; Unfortunately 104755.2 is larger than the maximum value which can be ; held within a 16-bit word value (65535), however we can divide ; 104755.2 by 2 and later multiply the result by 2 and still have the ; same answer albeit with a little less accuracy - ; ; Vpsu = 104755.2 / Nref ; ; Vpsu = ( (104755.2/2) / Nref ) * 2 ; ; Vpsu = ( 52377.6 / Nref ) * 2 ; ; Rounding to the nearest whole number as the PICAXE does not do decimals ; and taking into account the left to right nature of PICAXE calculations ; gives - ; ; Vpsu = 52378 / Nref * 2Copy Code Submit an Example
Battery voltage percentage indicator
This will determine the percentage of a battery voltage available when the PICAXE is powered by that battery. 'Vpsu100' should be set to the battery mV which indicates 100%. 'Vpsu0' should be set to the battery mV which indicates 0%.
- Code Example:
#picaxe 20X2 #terminal 9600 symbol Vpsu100 = 5000 ; 5000mV = 100% symbol Vpsu0 = 4000 ; 4000mV = 0% symbol Nref100 = 1047552 / Vpsu100 ; 1024 * 1023 / Vpsu100 symbol Nref0 = 1047552 / Vpsu0 ; 1024 * 1023 / Vpsu0 symbol NrefDif = Nref0 - Nref100 symbol Nref = w0 ; b1:b0 symbol Vpsu = w1 ; b3:b2 symbol percent = b4 do calibadc10 Nref percent = Nref min Nref100 - Nref100 * 100 / NrefDif max 100 percent = 100 - percent Vpsu = 52378 / Nref * 2 sertxd( #Vpsu, "0mV", tab, #percent, "%", cr, lf ) pause 1000 loopCopy Code Submit an Example
Submit Your Own Code!
You must be logged in to submit code examples. Login now.