Вы находитесь на странице: 1из 58

Microprocessors and Microcontrollers

Analog-to-Digital Conversion
EE3954

by
Maarten Uijt de Haag, Tim Bambeck, Harsha Chenji

ADC.1

Data
Bus
8
Timer0

Timer1

Timer2

ADC

PORTE
CCPs

Comparators

Synchronous
Serial Port

USARTs

Other
Modules

Parallel
Slave Port

LCD
Drivers

RE0
RE1
RE2
RF3
RE4
RE5
RE6
RE7

PORTA
Voltage
Reference

Figure 4-2 in the Reference Manual

Data
EEPROM

RA0
RA1
RA2
RA3
RA4
RA5
RA6
RA7

ADC.2

Analog-to-Digital Conversion (ADC)


Example

Microcontroller
Electric
Circuit

Transducer

RA1/AN1
(ADC)

Signal Conditioner
PIC16F877

x(t)

Analog Signal

ADC.3

Analog-to-Digital
Conversion

v(t)

Analog Signal

x[k]

Discrete-Time Signal

t
v(t)

Discrete-Amplitude Signal

x[k]

Digital Signal

ADC.4

Digital-to-Analog Conversion (DAC)


Example

Microcontroller
DAC

Transducer
PIC16F877

x(t)

Analog Signal

x[k]

Digital Signal

PIC Microcontroller does NOT have a built-in DAC!!!

ADC.5

ADC

Comparator
Basic Component:
Input signal, Vin
Reference Voltage, Vref

+
_

Output, Vout

If Vin > Vref , Vout = 5VDC (Logic 1)


If Vin Vref , Vout = 0VDC (Logic 0)

ADC.6

ADC

1-bit Example
5V

Vin > 2.5V: Signal is 1

Vin 2.5V: Signal is 0

2.5V

0V

1-bit => 21 = 2 levels => 1 threshold

ADC.7

ADC

2-bit Example

2-bit => 22 = 4 levels => 3 thresholds

5.00 v

5 v / 4 levels = 1.25 each increment


(thresholds)
3.75 < Vin 5.00V : Signal is 11

3.75 v

2.50 < Vin 3.75 V : Signal is 10


2.50 v

1.25 < Vin 2.50 V : Signal is 01


1.25 v

0.00 V Vin 1.25 V : Signal is 00


0.00 v
ADC.8

ADC

5.00 V
4.375 V
3.750 V
3.125 V
2.500 V
1.875 V
1.250 V
0.625 V
0.000 V

4.375V < Vin 5.00V: Signal is 111


3.750V < Vin 4.375V: Signal is 110
3.125V < Vin 3.750V: Signal is 101
2.500V < Vin 3.125V: Signal is 100
1.875V < Vin 2.500V: Signal is 011
1.250V < Vin 1.875V: Signal is 010
0.625V < Vin 1.250V: Signal is 001
0.000V Vin 0.625V: Signal is 000

111
110
101
100
011
010
001
000

A/D Converter
Binary Output

Input Voltage
To A/D Converter

3-bit Example

3-bits => 23 = 8 levels => 7 thresholds (5v/8 = 0.625)


ADC.9

ADC

3-bit Example
Examples:

Examples:

Analog Input Voltage:

Digital Output:

2.8756V

100

-0.234V

000

4.9876V

111

1.1V

001

3.2V

101

ADC.10

ADC
The PIC16F877 Microcontroller
10-bits:
210 = 1024 levels => 1023 thresholds
Resolution = 5V/1024 = 0.0048828125 V
Thresholds:
0.0048828125 V
0.009765625 V
0.0146484375 V
Etc.
ADC.11

ADC

Implementation: Parallel-Encoded or Flash ADC


Vref = 5V
4.375V
3.750V

Example:
3-bit ADC

Vin
I7
I6

3.125V
I5

O0

2.500V
I4
1.875V
I3
1.250V
0.625V

Priority
Encoder

O1

Digital Value out

O2

I2
I1
I0

ADC.12

Digital Logic Revisited (?/)


Priority Encoder

I7

I6

I5

I4

I3

I2

I1

I0

O2

O1

O0

Note: if one uses active low, LLH = 110

ADC.13

ADC

Implementation: Parallel-Encoded or Flash ADC


Vref = 5V
4.375V
3.750V

Example:
3-bit ADC

Vin
I7
I6

3.125V
I5

O0

2.500V
I4
1.875V
I3
1.250V
0.625V

I2
I1
I0

Priority
Encoder

O1

Digital Value Out

O2
Major drawback:
An n-bit ADC Requires 2n-1 comparators,
thus expensive
Advantage:
Highest speed ADC available

ADC.14

ADC in 16F877

- Successive Approximation ADC


Clock
Oscillator

Vin

Successive
Approximation
Register

Clear

Data ready End of conversion


D7
D6
D5
D4
D3
D2
D1
D0

Start

DFlip
Flops
(Latche)s

Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0

Digital
Output

8-bit
D/A converter

Note: for an n-bit ADC it will take n clock-cycles to find an output.


ADC.15

ADC

Successive Approximation HW Flowchart


Set all bits
D7D0 to 0

Set D7 to 1
and compare
V to Vin

V < Vin
N
Clear D7

Set D6 to 1
and compare
V to Vin

V < Vin
N
Clear D6

Set D5 to 1
and compare
V to Vin

Set D0 to 1
and compare
V to Vin

V < Vin

V < Vin

N
Clear D5

Clear D0

ADC.16

Successive Approximation
Example 4.3V Step 1 Bit 7 (D7)

5V
4.3V
D7 = 1

(1XXX XXXX)
Threshold = 2.5V

D7 = 0

(0XXX XXXX)

0V
D7 = Most Significant Bit

Result: 1XXX XXXX

ADC.17

Successive Approximation
Example 4.3V Step 2 Bit 6 (D6)

5V
4.3V

D6 = 1

(11XX XXXX)

D6 = 0

(10XX XXXX)

Threshold = 3.75

0V
D7 = Most Significant Bit

Result: 11XX XXXX

ADC.18

Example
Voltage input range: 0V 5V
Number of bits: 8 => 28 = 256 levels (= 255 thresholds)
Resolution = 5V / 256 = 0.01953125 V
Thresholds at : 0.01953125 V
2x0.01953125 V = 0.0390625 V
3x0.01953125 V = 0.05859375 V

4.3V / resolution = 220.16 => 220 = binary value = 1101 1100

ADC.19

ADC

As part of the microcontroller

Reference Manual:
Section 21 & 22 (8-bit ADC),
Section 23 (10-bit ADC)

Datasheet:
Section 11 (10-bit ADC)

ADC.20

ADC

As part of the microcontroller


Timer0

Timer1

Timer2

ADC*

Data
Bus
8

CCPs

Comparators

Synchronous
Serial Port

USARTs

Other
Modules

Parallel
Slave Port

LCD
Drivers

PORTF
RF0
RF1
RF2
RF3
RF4
RF5
RF6
RF7

PORTG
Voltage
Reference

*or A/D

Data
EEPROM

RG0
RG1
RG2
RG3
RG4
RG5
RG6
RG7

ADC.21

ADC

The configuration

ADC.22

ADC.23

ADC Register (SFR) settings

ADC.24

ADC Register (SFR) settings

ADC.25

Digital input:
the standard
input as we used
it before!!

ADC.26

ADC

The result

ADC.27

ADC

The result

ADC.28

ADC

Outside & Inside

ADC.29

ADC

Timing

ADC.30

Sample/Hold Acquisition Time


Tacq = Amplifier Settling Time (Tamp)
+ Holding Capacitor Charging Time (Tc)
+ Temperature Coefficient Time (Tcoff)

Tacq = Tamp + Tc + Tcoff


Tamp = 2 s for PIC 16F877

Next few slides find Tc & Tcoff:


ADC.31

Calculations for Tc:


Capacitor Charges through Series Resistances:
Rs = External signals source resistance (use 10,000 in lab)
Ric = Interconnect Resistance (Ric 1,000 ohm)
Rss = Sample Switch Resistance (function of Vdd)
(for Vdd = 5v, Rss = 7,000 ohm)

CHOLD = Capacitor = 120 * 10-12 farads

So Time for capacitor to charge:


Tc = - CHOLD*( Rs + Ric + Rss) * ln (1/2047)
ADC.32

Calculations for Tc (continued):


Tc = - CHOLD( Rs + Ric + Rss) * ln (1/2047)
Tc = - (120 * 10-12)( 10,000 + 1,000 + 7,000) * ln (1/2047)
Tc = - (120 * 10 -12)*(18,000)*(-7.624)
Therefore:

Tc = 16.5 s

ADC.33

Finding Time for Temperature Coefficient Term (Tcoff) :

Tcoff = (Operating Temp in C - 25C)*(0.05s/C)


Lets assume worst case Operating Temperature is 50C (= 122F)

Tcoff = (50C - 25C)*(0.05s/C)


Therefore: Tcoff

= 1.25 s

ADC.34

So total Acquisition time Tacq =


Tacq = Tamp + Tc + Tcoff
Tacq = 2 s + 16.5 s + 1.25 s

Tacq = 19.75 s
With our 4 MHz PICs in lab (1 s instruction cycle)
We would delay 20 s before we start conversion (GO is set)
ADC.35

ADC

Timing

19.75 s
(example)

ADC.36

ADC Conversion Time for


Successive Approx. Converter

Takes 11.5 TAD for conversion

Successive Approximation

TAD must be 1.6s

ADC.37

Selecting TAD Clock Source Value


Using PICs in Lab:
Minimum TAD must be 1.6 s
PICs in Lab use 4 MHz oscillator, so Tosc = 0.250 s
We need to set ADCS1, ADCS0 bits in ADCON0 to select TAD:
ADCS1,ADCS0
0
0
0
1
1
0
1
1

Operation
2 * Tosc
8 * Tosc
32 * Tosc
use internal RC

TAD Time
0.50 s
2.00 s
8.00 s
( 2 6 s )

Select ADCS1, ADCS0 to 0,1 since this gives 2.0 s time for TAD.

So A/D conversion Time = 11.5 * 2.0 s = 23 s

ADC.38

Time for A/D Conversion - Summary

19.75 s
(example)

11.5 * TAD
= 23 s

Note You must wait at least 2 * TAD before next acquisition is started.
ADC.39

ADC

The configuration

ADC.40

ADC

Use Flow Chart


Configure A/D Module
Configure A/D Interrupt*

Wait for TACQ

Configure analog pins/


voltage reference and
digital I/O (ADCON1)
Select ADC input
channel (ADCON0)
Select ADC conversion
clock (ADCON0)
Turn on ADC module
(ADCON0)

Start Conversion (set GO)


Wait for conversion
to complete
Read A/D Result
Wait for at least 2TAD
before next acquisition

*if desired

ADC.41

ADC

Use Flow Chart


Configure A/D Module
Configure A/D Interrupt*
Wait for TACQ

Clear ADIF bit


Set ADIE bit
Set PEIE bit
Set GIE bit

Start Conversion (set GO)


Wait for conversion
to complete
Read A/D Result
Wait for at least 2TAD
before next acquisition

*if desired

ADC.42

ADC

The interrupt

ADC.43

ADC

Use Flow Chart


Configure A/D Module
Configure A/D Interrupt*
Wait for TACQ
Start Conversion (set GO)
Wait for conversion
to complete

Use POLLING:
Keep checking the DO/DONE
bit, if it is cleared the
conversion is done.
Use INTERRUPTS:
Wait for the ADC interrupt

Read A/D Result


Wait for at least 2TAD
before next acquisition

*if desired

ADC.44

ADC

An Example

RA1/AN1

PIC16F877

Write a program that makes


continuous measurements of
the output voltage of the microphone
and writes the results to TEMPH (0x20)
and TEMPL (0x21)
Assume that the Oscillator
frequency clock is 4MHz

ADC.45

Example
Configure A/D Module
Configure A/D Interrupt*
Wait for TACQ
Start Conversion (set GO)
Wait for conversion
to complete
Read A/D Result
Wait for at least 2TAD
before next acquisition
ADC.46

Example

Configure ADC Module

Conversion clock
4MHz < 5MHz thus
ADCS1:ADCS0 = 01

Result is Right Justified


thus ADFM = 1

Turn on Module:
ADON = 1

RA1/AN1 thus
CHS2:CHS0 = 001

RA1/AN1 thus
PCFG3:PCFG0 = 0000

ADC.47

Code

Configure ADC Module


ADCON0
ADCON1
INIT_ADC:

equ
equ
org
movlw
movwf
bsf
movlw
movwf
bcf

0x1F
0x1F
0x000
B01001001
ADCON0
STATUS, RP0
B10000000
ADCON1
STATUS, RP0

; Configure ADC via ADCON0


; Access bank 1
; Configure ADC via ADCON1
; Switch back to bank 0

ADC.48

Example
Configure A/D Module
Configure A/D Interrupt*
Wait for TACQ
Start Conversion (set GO)
Wait for conversion
to complete
Read A/D Result
Wait for at least 2TAD
before next acquisition
ADC.49

Example

Wait for TACQ


Need a delay for about/at least 20seconds:

DELAY:
NXT:

movlw
movwf
decfsz
goto
return

0x05
COUNT
COUNT
NXT

;1
;1
; 1/2
;2
;2

DELAY duration including call and return: 5 + 3*COUNT


5 + 3*COUNT = 20 => 3*COUNT = 15 => COUNT = 5
ADC.50

Code

Main Loop
MAIN:
CHECK:

*GO/DONE = 0

call
DELAY
bsf
ADCON0,2
btfsc
ADCON0,2
goto
CHECK
movf
ADRESH,W
movwf
TEMPH
bsf
STATUS,RP0
movf
ADRESL,W
bcf
STATUS,RP0
movwf
TEMPL
nop
nop
goto MAIN

; Wait for TACQ


; Start conversion (set GO)
; Wait for conversion to complete*
; use POLLING
; Read A/D result (high byte)
; Write to TEMPH
; Read A/D result (low byte)
; Write to TEMPL
; 1 Wait for 4 instruction cycles
;1
;2

2TAD = 2*8TOSC = 2*8*0.25s = 4s = 4 instruction cycles


ADC.51

Code

Main Loop - Sample Period


MAIN:
CHECK:

call
DELAY
bsf
ADCON0,2
btfsc
ADCON0,2
goto
CHECK
movf
ADRESH,W
movwf
TEMPH
bsf
STATUS,RP0
movf
ADRESL,W
movwf
TEMPL
bcf
STATUS,RP0
nop
nop
goto MAIN

; 20
;1
; ~12 Tad = 24
;
;1
;1
;1
;1
;1
;1
;1
;1
;2

Sample Period = Ts 20 + 1 + 24 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 2 = 55TCY= 55sec


Sample Frequency = 1/Ts 1/55sec = 18,182Hz 18kHz
ADC.52

Nyquist Criterion

Why is this Sample Frequency Important?


The Nyquist criterion states that, in order to prevent undesired aliasing, one
must sample a signal at a rate equal to at least twice its bandwidth.

fs > 2B
Sample
frequency

Signal
bandwidth

ADC.53

Nyquist Criterion
Example

RA1/AN1

PIC16F877

Range of human hearing:


20 to 20,000 Hz

Must sample at
fs > 2*(20,000 20) = 39,960Hz 40kHz
For example:

CD 44.1kHz sampling rate


DVD up to 96 kHz/192kHz
Blu-ray 192kHz

And
CD 16 bits per sample

ADC.54

ADC

Example Using Interrupts


ADCON0 equ
ADCON1 equ

INIT_ADC:

INIT_IRQ:

0x1F
0x1F
org
goto
org
goto
movlw
movwf
bsf
movlw
movwf
bcf
bcf
bsf
bsf
bcf
bsf
bsf

0x000
INIT_ADC
0x004
AD_ISR
B01001001
ADCON0 ; Configure ADC via ADCON0
STATUS, RP0
; Access bank 1
B10000000
ADCON1 ; Configure ADC via ADCON1
STATUS, RP1
PIR1, ADIF
; Clear the ADIF flag (bit 6)
STATUS,RP0
; Access bank 1
PIE1, ADIE
; Enable AADC interrupt
STATUS, RP0
; Access bank 0
INTCON, PEIE
; Enable peripheral interrupts
INTCON, GIE
; Enable global interrupts
ADC.55

Code

Main Loop & Interrupt Service Routine

MAIN
AD_ISR:

*GO/DONE = 0

call
bsf
goto

movf
movwf
movf
movwf
call
bsf
bcf
retfie

DELAY
ADCON0,2
MAIN

; Wait for TACQ


; Start conversion (set GO)

ADRESH,W
TEMPH
ADRESL,W
TEMPL
DELAY
ADCON0,2
PIR1, ADIF

; Read A/D result (high byte)


; Write to TEMPH
; Read A/D result (low byte)
; Write to TEMPL
; Wait for TACQ
; Start conversion (set GO)
; Clear the interrupt

ADC.56

ADC

VDD

An Example with Push-button

RA5/AN4
RA1/AN1

Vss

PIC16F877

NOTE that in this case RA5 is a DIGITAL input and RA1 is an ANALOG input
ADC.57

INIT_ADC:

movlw
movwf
bsf
movlw
movwf
movlw
movwf
bcf

B01001001
ADCON0 ; Configure ADC via ADCON0
STATUS, RP0
; Access bank 1
B10000100
ADCON1 ; Configure ADC via ADCON1
B11111111
; Configure RA5 as an input pin
TRISA
STATUS, RP1

ADC.58