Verwendung des Analog/Digital-Wandlers
Nutzen des Beispiels
- Erfassen eines Sensorsignals und dessen Ausgabe.
|
Verwendete Befehle und ihre Bedeutung
Befehl |
Bedeutung |
ADCSRA |
Register zur Konfigurierung des AD-Wandlers |
SFIOR |
Register zur Konfigurierung des AD-Wandlers |
ADMUX |
Auswahl des Pins. |
ADCH / ADCL |
Register auf denen die 10 Bit-Auflösung des AD-Wandlers verteilt ist. |
Tabelle 0-1: Befehlsübersicht
Beispielprogramm
#include <avr/io.h>
void initADwandler()
{
ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
//ADEN
// 1 AD-Wandler eingeschaltet
//ADSC
// 1 Konvertierung starten
//ADATE
// 0 Auto-Trigger aus
//ADIF (Interrupt-Flag)
//ADIE
// 0 Interrupt ausgeschaltet
//ADPS 2 1 0 Vorteilung der Taktrate (sollte zwischen 50..200kHz liegen, also bei 9,216MHz Teilung=92 ~ 128)
//ADPS 2 1 0 Vorteilung der Taktrate (sollte zwischen 50..200kHz liegen, also bei 9,216MHz 144kHz Teilung=64)
// 0 0 0 2
// 0 0 1 2
// 0 1 0 4
// 0 1 1 8
// 1 0 0 16
// 1 0 1 32
// 1 1 0 64 (ausgewählt)
// 1 1 1 128
//Freilaufmode auswählen:
SFIOR &= 255 - ((1<<ADTS2) | (1<<ADTS1) | (1<<ADTS0));
//ACHTUNG: verwendete Pins von PORTA als Eingang wählen!
//AD-Wandler einstellen und aktivieren:
//PA0,1,2,3 als Eingänge (DDRA=0b11110000)
//ADMUX = (0<<REFS1) | (0<<REFS0) | (0<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (1<<MUX1) | (1<<MUX0);
//REFS1 REFS0
// 0 0 externe Referenzspannung
//ADLAR
// 1 Ergebnis in ADCH und ADCL links ausgerichtet (so kann man leicht die höhren 8 Bits lesen)
//MUX 4 3 2 1 0
// 0 0 0 0 0 ADC0 //hier ausgewählt
// 0 0 0 0 1 ADC1
// 0 0 0 1 0 ADC2
// 0 0 0 1 1 ADC3
// 0 0 1 0 0 ADC4
// 0 0 1 0 1 ADC5
// 0 0 1 1 0 ADC6
// 0 0 1 1 1 ADC7
//AD0 / Pin 40 als Eingang wählen
ADMUX = (0<<REFS1) | (0<<REFS0) | (1<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
}
int main(void)
{
unsigned char akku,akku2;
int i,k;
long int x;
DDRC = 0b11111111; //PORTC alle Bits als Ausgang
DDRD = 0b00000000; //PORTD alle Bits als Eingang
initADwandler();
while(true)
{
x = 0;
for(i=0;i<100;i++)
{
akku2 = ADCH; //muss erst ausgelesen werden, damit ADCL verfügbar ist.
akku = ADCL;
x+=akku2;
for(k=0;k<100;k++);
}
x/=100;
PORTC = (unsigned char)x;
}
return 0;
}
Code 0-1: Beispiel
Projekt herunterladen
Übung 4a)
- Schreiben Sie ein Programm, mit dem Sie über Tastendruck zwischen zwei Entfernungssensoren hin und her schalten können.
- Schreiben Sie ein Programm, bei dem die Motorgeschwindigkeit über einen Entfernungssensor beeinflußt wird.
|