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í:
- Doba převodu 13 – 260 us
- Rychlost až 15 kSPS
- 8 kanálů (až 7 diferenciálních )
- u 2 kanálů možnost programovatelného
zesílení 1,10,200 (za cenu snížení
rozlišovací schopnosti)
- maximální pracovní frekvence 200kHz,
možnost zvýšit jen za cenu snížení
rozlišovací schopnosti (předdělička)
- vnitřní referenční napětí 2,56V
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:
- ADMUX - výběr kanálu a výběr referenčního napětí
- ADCSRA - nastavení rychlosti AD převodu, start převodu, řízení přerušení atd.
- ADCH a ADCL - dva registry obsahující výslednou hodnotu, ADCW je
dvojregistr složený z těchto registrů (pozor má 10bitů - nelze použít
typ CHAR)
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);
};
}