Skip to main content

The ADC of the AVR

The ADC of the AVR

Analog to Digital Conversion

AVR SeriesMost real world data is analog. Whether it be temperature, pressure, voltage, etc, their variation is always analog in nature. For example, the temperature inside a boiler is around 800°C. During its light-up, the temperature never approaches directly to 800°C. If the ambient temperature is 400°C, it will start increasing gradually to 450°C, 500°C and thus reaches 800°C over a period of time. This is an analog data.
Signal Acquisition Process
Signal Acquisition Process
Now, we must process the data that we have received. But analog signal processing is quite inefficient in terms of accuracy, speed and desired output. Hence, we convert them to digital form using an Analog to Digital Converter (ADC).

Signal Acquisition Process

In general, the signal (or data) acquisition process has 3 steps.
  • In the Real World, a sensor senses any physical parameter and converts into an equivalent analog electrical signal.
  • For efficient and ease of signal processing, this analog signal is converted into a digital signal using an Analog to Digital Converter (ADC).
  • This digital signal is then fed to the Microcontroller (MCU) and is processed accordingly.
ADC Pins - ATMEGA16/32
ADC Pins – ATMEGA16/32

Interfacing Sensors

In general, sensors provide with analog output, but a MCU is a digital one. Hence we need to use ADC. For simple circuits, comparator op-amps can be used. But even this won’t be required if we use a MCU. We can straightaway use the inbuilt ADC of the MCU. In ATMEGA16/32, PORTA contains the ADC pins.

The ADC of the AVR

The AVR features inbuilt ADC in almost all its MCU. In ATMEGA16/32, PORTA contains the ADC pins. Some other features of the ADC are as follows:
ADC Features - ATMEGA16/32
ADC Features – ATMEGA16/32
Right now, we are concerned about the 8 channel 10 bit resolutionfeature.
  • 8 channel implies that there are 8 ADC pins are multiplexed together. You can easily see that these pins are located across PORTA (PA0…PA7).
  • 10 bit resolution implies that there are 2^10 = 1024 steps (as described below).
8 channel 10 bit ADC
8 channel 10 bit ADC
Suppose we use a 5V reference. In this case, any analog value in between 0 and 5V is converted into its equivalent ADC value as shown above. The 0-5V range is divided into 2^10 = 1024 steps. Thus, a 0V input will give an ADC output of 0, 5V input will give an ADC output of 1023, whereas a 2.5V input will give an ADC output of around 512. This is the basic concept of ADC.
To those whom it might concern, the type of ADC implemented inside the AVR MCU is of Successive Approximation type.
Apart from this, the other things that we need to know about the AVR ADC are:
  • ADC Prescaler
  • ADC Registers – ADMUX, ADCSRA, ADCH, ADCL and SFIOR

ADC Prescaler

The ADC of the AVR converts analog signal into digital signal at some regular interval. This interval is determined by the clock frequency. In general, the ADC operates within a frequency range of 50kHz to 200kHz. But the CPU clock frequency is much higher (in the order of MHz). So to achieve it, frequency division must take place. The prescaler acts as this division factor. It produces desired frequency from the external higher frequency. There are some predefined division factors – 2, 4, 8, 16, 32, 64, and 128. For example, a prescaler of 64 implies F_ADC = F_CPU/64. For F_CPU = 16MHz, F_ADC = 16M/64 = 250kHz.
Now, the major question is… which frequency to select? Out of the 50kHz-200kHz range of frequencies, which one do we need? Well, the answer lies in your need. There is a trade-off between frequency and accuracy. Greater the frequency, lesser the accuracy and vice-versa. So, if your application is not sophisticated and doesn’t require much accuracy, you could go for higher frequencies.

ADC Registers

We will discuss the registers one by one.

ADMUX – ADC Multiplexer Selection Register

The ADMUX register is as follows.
ADMUX
ADMUX Register
The bits that are highlighted are of interest to us. In any case, we will discuss all the bits one by one.
  • Bits 7:6 – REFS1:0 – Reference Selection Bits – These bits are used to choose the reference voltage. The following combinations are used.
Reference Voltage Selection
Reference Voltage Selection
ADC Voltage Reference Pins
ADC Voltage Reference Pins
The ADC needs a reference voltage to work upon. For this we have a three pins AREF, AVCC and GND. We can supply our own reference voltage across AREF and GND. For this, choose the first option. Apart from this case, you can either connect a capacitor across AREF pin and ground it to prevent from noise, or you may choose to leave it unconnected. If you want to use the VCC (+5V), choose the second option. Or else, choose the last option for internal Vref.
Let’s choose the second option for Vcc = 5V.
  • Bit 5 – ADLAR – ADC Left Adjust Result – Make it ‘1’ to Left Adjust the ADC Result. We will discuss about this a bit later.
  • Bits 4:0 – MUX4:0 – Analog Channel and Gain Selection Bits – There are 8 ADC channels (PA0…PA7). Which one do we choose? Choose any one! It doesn’t matter. How to choose? You can choose it by setting these bits. Since there are 5 bits, it consists of 2^5 = 32 different conditions as follows. However, we are concerned only with the first 8 conditions. Initially, all the bits are set to zero.
  • Thus, to initialize ADMUX, we write
    ADMUX = (1<<REFS0);

    ADCSRA – ADC Control and Status Register A

    The ADCSRA register is as follows.
    ADCSRA Register
    ADCSRA Register
    The bits that are highlighted are of interest to us. In any case, we will discuss all the bits one by one.
    • Bit 7 – ADEN – ADC Enable – As the name says, it enables the ADC feature. Unless this is enabled, ADC operations cannot take place across PORTA i.e. PORTA will behave as GPIO pins.
    • Bit 6 – ADSC – ADC Start Conversion – Write this to ‘1’ before starting any conversion. This 1 is written as long as the conversion is in progress, after which it returns to zero. Normally it takes 13 ADC clock pulses for this operation. But when you call it for the first time, it takes 25 as it performs the initialization together with it.
    • Bit 5 – ADATE – ADC Auto Trigger Enable – Setting it to ‘1’ enables auto-triggering of ADC. ADC is triggered automatically at every rising edge of clock pulse. View the SFIOR register for more details.
    • Bit 4 – ADIF – ADC Interrupt Flag – Whenever a conversion is finished and the registers are updated, this bit is set to ‘1’ automatically. Thus, this is used to check whether the conversion is complete or not.
    • Bit 3 – ADIE – ADC Interrupt Enable – When this bit is set to ‘1’, the ADC interrupt is enabled. This is used in the case of interrupt-driven ADC.
    • Bits 2:0 – ADPS2:0 – ADC Prescaler Select Bits – The prescaler (division factor between XTAL frequency and the ADC clock frequency) is determined by selecting the proper combination from the following.
    ADC Prescaler Selections
    ADC Prescaler Selections
    Assuming XTAL frequency of 16MHz and the frequency range of 50kHz-200kHz, we choose a prescaler of 128.
    Thus, F_ADC = 16M/128 = 125kHz.
    Thus, we initialize ADCSRA as follows.
    ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
    // prescaler = 128

    ADCL and ADCH – ADC Data Registers

    The result of the ADC conversion is stored here. Since the ADC has a resolution of 10 bits, it requires 10 bits to store the result. Hence one single 8 bit register is not sufficient. We need two registers – ADCL and ADCH (ADC Low byte and ADC High byte) as follows. The two can be called together as ADC.
    ADC Data Registers (ADLAR = 0)
    ADC Data Registers (ADLAR = 0)
    ADC Data Registers (ADLAR = 1)
    ADC Data Registers (ADLAR = 1)
    You can very well see the the effect of ADLAR bit (in ADMUX register). Upon setting ADLAR = 1, the conversion result is left adjusted.

    SFIOR – Special Function I/O Register

    In normal operation, we do not use this register. This register comes into play whenever ADATE (in ADCSRA) is set to ‘1’. The register goes like this.
    SFIOR Register
    SFIOR Register
    The bits highlighted in yellow will be discussed as they are related to ADATE. Other bits are reserved bits.
    • Bits 7:5 – ADC Auto Trigger Source – Whenever ADATE is set to ‘1’, these bits determine the trigger source for ADC conversion. There are 8 possible trigger sources.
    ADC Auto Trigerring Source Selections
    ADC Auto Triggering Source Selections
    These options are will be discussed in the posts related to timers. Those who have prior knowledge of timers can use it. The rest can leave it for now, we won’t be using this anyway.

Comments

Popular posts from this blog

PCB Design using EAGLE – Part 1: Introduction to EAGLE and Software Environment

Have you ever come across a situation where you prototyped a project on a solderless breadboard and liked it so much that you want it on a PCB? Well, read on! So far we have been writing software programs, building binaries out of them and executing them on micro-controllers. It’s time to get physical now! This post, and a couple of upcoming posts will deal with this very thing – how to realize your project in hardware. We’ll deal with PCBs, and also learn how to design and fabricate them. PCB of NI myRIO (Source: National Instruments) Introduction to PCB Design If you are an electronics hobbyist you might have probably designed many electronic circuits and even prototyped them on a breadboard. Now it’s time to step up to the next level. Let’s design the same on a PCB. This article and a couple more of them will be addressing the topic of PCB designing. There are many types of circuits that you can design on a PCB – like analog, digital, RF – and the PCB layout may make

Nvidia Announces New Drive CX And PX Automotive Tech At CES

Right after the company announced the new Tegra X1 mobile SoC at a press conference in Las Vegas, Nvidia's CEO, Jen-Hsun Huang, went on to announce the company's plans in the automotive space. As it turns out, actually, it will be doing quite a bit, and the way we see it, it may even be what the automotive industry needs. The first announcement in the category was the Nvidia Drive CX, which the graphics card maker calls a "Digital Cockpit Computer." The idea behind it is to be a single central computing system that takes care of all the displays inside the car. Nvidia believes that in the future, cars will have more and more screens built in, and having all of it managed from a central computer is what will make it shine. Today's high-tech cars have about 700 thousand pixels that need to be pushed, which isn't that much. Despite that, Nvidia built the Drive CX to be powerful enough to push up to 16.6 million pixels. This makes sense, though, as by addi