AN672
APPLICATION NOTE
OPTIMIZING THE ST6 A/D CONVERTER ACCURACY
INTRODUCTION
When using the internal Analog to Digital Converter of the ST62 family and maximum A/D converter accuracy is required, it is desirable to filter out any noise present on the analog input, but also noise present on the ground and VCC supply lines of the MCU as VCC is also the voltage reference of the A/D converter. Good decoupling must be made with capacitors on the analog input and between VCC and ground. It is also recommended to put the MCU in wait state while the conversion is in progress, so as to minimize noise injected into VCC by the operation of the micro-controller itself.
Finally, when enough time is available, it is highly recommended to make several successive A/D conversions and take an average of the results. This is the most effective way to get the most accuracy out of the ST6 family A/D converter.
The following code fragment demonstrates a burst of 256 successive measurements, after which the average is put into the accumulator. The whole routine takes approximately 30 milliseconds with an 8 MHz clock. When less time is available, it is of course possible to reduce the number of conversions: 8, 16 or 32 conversions also give good results, although the most conversions give the best results.
Rev. 2.0
AN672/1104 |
1/3 |
1
Optimizing The St6 A/d Converter Accuracy
;******************** SUBROUTINE AVERAGE ***********************
;description: measures ADC input 256 times and stores average |
* |
|
; |
of the 256 measures into accumulator |
* |
;*************************************************************** average
lid ior,10h |
; global enable interrupts |
clr aver_lo |
;aver_lo, aver_hi and count are RAM registers |
clr aver_hi |
|
ldi count,255 ; set for 256 measurements
aver1
ldi adcc,10110000b ; start conversion with interrupt wait
ld a,adc
;======================= two byte addition of adc to 16-bit word:
add a, aver_lo jrnc aver2 inc aver_hi
aver2 ld aver_lo,a
;======================= end of two byte addition
ld a,count |
|
jrz aver4 |
|
dec count |
|
jp aver1 |
;do it 256 times |
aver4 ld a,aver_lo |
|
cpi a,127 |
;round to next value if decimal part >0.5 |
jrc aver3 |
|
inc aver_hi
aver3 ld a, aver_hi ;store high byte of result into accumulator,
ret ;the low byte is not significant
;*********************** interrupt service routine *************
adcint
ldi adcc,10h reti
;*********************** interrupt vector **********************
.org 0ff0h jp adcint
2/3
2