A/D převodník

•    Seznámení s funkcí AD převodníku – jeho základní vlastnosti (Rozlišení, rychlost převodu). Jako vstup do AD převodníku použijte potenciometr připojen na + 5V a GND.

Zadání

Příklad 1
Připojte potenciometr na +5V a GND. Jezdec připojte na příslušný pin AD převodníku. Na LCD zobrazte hodnotu AD převodu.

Příklad 2
Rozšiřte předchozí příklad o přepočet na napětí V . 

Nápověda

Princip AD převodníku
AD převodník je zařízení, které převádí analogový spojitý signál na digitální diskrétní hodnotu. Procesor ATmega 128 disponuje 10bitovým AD převodníkem což umožňuje využit procesor jako snímač elektrických veličin. U neelektrických veličin (teplota, tlak, vlhkost atd.) je nutný převod na elektrickou veličinu vhodným snímačem. Základní vlastnosti AD převodníku použitého v procesoru jsou následující:
Princip činnosti je patrný s následujícího blokového schématu. Měřená hodnota se porovnává s násobky referenčního napětí tak dlouho dokud se "nenalezne" hodnota  neznámého vstupního napětí. Měření na více kanálech se provádí multiplexně což má za následek prodlužování času potřebného pro měření.  Registry pro práci s AD převodníkem jsou:
AD.png
Inicializace AD převodníku:
ACSR=0x80;   /*Bit 7 – ACD: Analog Comparator Disable – nastavení
                tohoto bitu odpojí napájení komparátoru a slouží
                tedy k minimalizaci spotřeby. */
SFIOR=0x00;   //vynulování - vypnutí multiplexeru komparátoru
ADMUX=0x0;    /*Bit 7:6 = 1:1 - vybírá zdroj referenčního napětí
                dle kombinace bitů - 00-AREF, 01-AVCC, 11-vnitřní*/
ADCSRA=0x87;  /*0x87=10000111    první tři bity nastavují dělící poměr
              pro odvození hodinového signálu ADC převodníku z
              hodinového 
kmitočtu CPU (zde 128).
              7.bit povoluje funkci ADC převodníku*/


Funkce pro spuštění AD převodu read_adc:

unsigned int read_adc(unsigned char kanal)
{
ADMUX=kanal; //určí převáděný kanál
ADCSRA|=0x40; /*Bit 6 - spouští celou konverzi. Při ukončení převodu               je tento bit hardwarově nulován */
  
while ((ADCSRA & 0x10)==0); /*opakuj dokud 4.bit roven 0 (AND) -
                        po dokončení konverze 
se hardvarově nastaví
                         4.bit na 1*/

ADCSRA|=0x10;            //vynuluj 4. bit (OR)
return ADCW;          /*ADCW jsou spojene registry ADCL a ADCH
                        ve kterých je výsledek převodu*/
}

Řešení

#define F_CPU 14745600UL  

#include <avr/io.h>
#include <string.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdint.h>

#include "knihovnaLCD.c"

int ADprevod;
float napeti;
char tmp [20];

unsigned int read_adc(unsigned char kanal)
  {
          
  ADMUX=kanal;
  ADCSRA|=0x40;             
  while ((ADCSRA & 0x10)==0);         
  ADCSRA|=0x10;            
  return ADCW;                  
  }

int main(void)
{

  ACSR=0x80;            
  SFIOR=0x00;             
  ADMUX=0x0;                         
  ADCSRA=0x87;        

  LCD_Init();

  LCD_Clear();
  _delay_ms(2);

while (1)
      {
    ADprevod=read_adc(0);
    napeti= ADprevod*5;
    napeti= napeti/1024;

    LCD_Position(0 , 0);
    sprintf (tmp, "ADprevod= %4d", ADprevod);
    LCD_WriteString(tmp);
    LCD_Position(1 , 0);
    sprintf (tmp, "Napeti = %4.2f V", napeti);
    LCD_WriteString(tmp);

      };
}