Lecture 5 EPMN201
Lecture 5 EPMN201
ADC in AVR
28 pin
(PCINT14/RESET) PC6 1 28 PC5 (ADC5/SCL/PCINT13)
(PCINT16/RXD) PD0 2 27 PC4 (ADC4/SDA/PCINT12)
(PCINT17/TXD) PD1 3 26 PC3 (ADC3/PCINT11)
(PCINT18/INT0) PD2 4 MEGA328 25 PC2 (ADC2/PCINT10)
(PCINT19/OC2B/INT1) PD3 5 24 PC1 (ADC1/PCINT9)
(PCINT20/XCK/T0) PD4 6 23 PC0 (ADC0/PCINT8)
VCC 7 22 GND
GND 8 21 AREF
(PCINT6/XTAL1/TOSC1) PB6 9 20 AVCC
(PCINT7/XTAL2/TOSC2) PB7 10 19 PB5 (SCK/PCINT5)
(PCINT21/OC0B) PD5 11 18 PB4 (MISO/PCINT4)
(PCINT22/OC0A/AIN0) PD6 12 17 PB3 (MOSI/OC2A/PCINT3)
(PCINT23/AIN1) PD7 13 16 PB2 (SS/OC1B/PCINT2)
(PCINT0/CLKO/ICP1) PB0 14 15 PB1 (OC1A/PCINT1)
1
3/20/2022
ADC Resolution
Vref n
stepSize Vin ADC Output
no.ofsteps (binary number)
Vin
output Vref
stepSize
2
3/20/2022
ADC in AVR
System clock
ADPS
Prescaler
ADCSRA
3
ADC0 0
ADC1 1 clock
5
ADC2 2
ADC3 3
ADC4 4
10
Input ADC ADCH ADCL
ADC5 5 MUX VIN
ADC6
6
ADC7 7
VREF
Temperature sensor 8
1.1V
GND REFS0
REFS1
MUX3
MUX0
MUX1
MUX2
3 2 1 0
0 ADMUX 3 6 7
Internal
AVCC
AREF
1.1V
3
3/20/2022
ADMUX
D7 D0
REFS1 REFS0 ADLAR - MUX3 MUX2 MUX1 MUX0
ADLAR:
ADC2 2
ADC3 3
ADC4
REFS1-REFS0:
Temperature sensor 8
1.1V
GND
Vref selection
MUX3
MUX0
MUX1
MUX2
0 ADMUX 3 6 7
ADMUX
D7 D0
REFS1 REFS0 ADLAR - MUX3 MUX2 MUX1 MUX0
REFS1-REFS0:
Internal
AVCC
AREF
1.1V
Vref selection
4
3/20/2022
ADMUX
D7 D0
REFS1 REFS0 ADLAR - MUX3 MUX2 MUX1 MUX0
-
- 0: right adjust the result
- - - - ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
ADMUX
5
3/20/2022
ADCSAR
ADC Prescaler
PreScaler Bits let us change the clock frequency of ADC
The frequency of ADC should not be more than 200 KHz
Conversion time is longer in the first conversion
6
3/20/2022
while(1)
{
ADCSRA |= (1<<ADSC);//start conversion
ADCSRA |= (1<<ADIF);
7
3/20/2022
#include <avr/io.h>
#define F_CPU 16000000UL
ADMUX
REFS0
int main (void) REFS1
{ 3 2 1 0
DDRB = 0xFF;//make Port B an output
DDRD = 0xFF; //make Port D an output
Internal
ADC0
AVCC
0
AREF
1.1V
ADCSRA= 0x87;//make ADC enable and select ck/128 ADC1 1
ADMUX= 0xC8;//1.1V Vref, temp. sensor, right-justified ADC2 2
ADC3 3
while(1)
{ ADC4 4
Input
ADCSRA |= (1<<ADSC);//start conversion ADC5 5 MUX
ADC6
6
while((ADCSRA&(1<<ADIF))==0);//wait for conversion to finish ADC7 7
Temperature sensor 8
ADCSRA |= (1<<ADIF);
1.1V
MUX3
MUX0
MUX1
MUX2
}
0 3 6 7
} ADMUX
Sensors
Sensor: Converts a physical signal (e.g.
light, temperature, humidity, etc.) to an
electrical signal (e.g. resistance, voltage,
current, capacitance, etc)
8
3/20/2022
Using LM35
//this program reads the sensor and displays it on Port B
#include <avr/io.h> //standard AVR header VCC
while (1){
ADCSRA |= (1<<ADSC);//start conversion
while((ADCSRA&(1<<ADIF))==0); //wait for end of conversion
ADCSRA |= (1<<ADIF); //clear the ADIF flag
PORTB = (ADCL|(ADCH<<8))*10/93;//PORTB = adc value/9.3
}
}
Note: 1.1 Volt input ----> 1023 ADC value
110 degree ----> 1023 ADC value
===> T = ADC value /1023 * 110 = ADC value /93 *10`
9
3/20/2022
Signal conditioning
The output of some sensors (e.g. PT100)
is in form of resistance
Some humidity sensor provide the result in
form of Capacitance
We need to convert these signals to
voltage, however, in order to send input to
an ADC. This conversion is called signal
conditioning.
10
3/20/2022
DAC
Vout
4
3
2
VREF 1
Step size = 0 input
Num of steps 00 01 10 11
Binary number n
(input) DAC VOUT
Vref
To scope
OUT –
VOUT = 0 to 10V
+ 1k
Comp
0.1uF
100 pF
PD7 D7
VEE -12V
GND
11