Forum: Mikrocontroller und Digitale Elektronik Atmega16 zwei analogsignale einlesen mit dem ADC


von Jens (Gast)


Lesenswert?

Hallo Freunde,

ich möchte gerne mit einem Atmega16 zwei verschiedene Analogsignale an
den Pins PA0 und PA1 abtasten.
Leider bin ich noch Anfänger und muss noch viel herum probieren und
lesen dazu. Aber jetzt komme ich wirklich nicht mehr weiter.
Vielleicht kann mir ja mal einer einen Tip geben und sagen, was an dem
unten aufgeführten Code nicht richtig ist. Was muss ich genau machen um 
die Kanäle umzuschalten? Ich hatte das irrtümlicherweise schon über 
Admux versucht, was ja aber für die Referenzspannung zuständig ist, 
worauf mich in meinem vorigen Beitrag netterweise jemand drauf 
aufmerksam gemacht hat.

Danke im Voraus.
Jens






#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 4000000UL
#define ADATE 5
#endif
#include <util/delay.h>



int main(void)
{

uint16_t wert1;
uint16_t wert2;


  DDRB |= (1 << DDB3);      // Setup PB0 as output

  while(1)
  {

//erstes Abtasten

  ADMUX |= (1<<REFS0);
  ADCSRA |= (1<<ADEN)|(1<<ADATE)|(1<<ADPS2)|(1<<ADSC);

  while(!(ADCSRA&(1<<ADSC))); // Wait until a conversion is finished

  wert1 = ADC;

//zweites Abtasten

  ADMUX |= (1<<REFS0);
  ADCSRA |= (1<<ADEN)|(1<<ADATE)|(1<<ADPS2)|(1<<ADSC);

  while(!(ADCSRA&(1<<ADSC))); // Wait until a conversion is finished

  wert2 = ADC;

//über PWM Timer1 ausgeben


  DDRD |= (1 << DDB4);
  DDRD |= (1 << DDB5);


  TCCR1A = (1<<WGM10)|(1<<WGM11)|(1<<COM1A1)|(1<<COM1B1);

  TCCR1B = (1<<WGM12)|(1<<CS11)|(1<<CS10);

  OCR1A = wert1;
  OCR1B = wert2;


  }

  return 0;

}

von chris (Gast)


Lesenswert?

wo wird denn der kanal umgeschaltet?

von chris (Gast)


Lesenswert?

Jens schrieb:
> Admux versucht, was ja aber für die Referenzspannung zuständig ist

nö schau mal auf seite 215 im Datenblatt du hast da noch nen paar bits 
die du nutzen solltest.

kanal 0 aktiv
1<<REFS1 | 0<<REFS0 | 0<<ADLAR | 0<<MUX4 | 0<<MUX3 | 0<<MUX2 | 0<<MUX1 
|0<<MUX0

kanal 1 aktiv
1<<REFS1 | 0<<REFS0 | 0<<ADLAR | 0<<MUX4 | 0<<MUX3 | 0<<MUX2 | 0<<MUX1 
|1<<MUX0

von Mike (Gast)


Lesenswert?

Jens schrieb:
> #ifndef F_CPU
> #define F_CPU 4000000UL

So ein blindes definieren von F_CPU im Code ist eine böse Falle, wenn du 
vergißt, F_CPU zu definieren und dein Board nicht mit 4MHz arbeitet.
Das spuckt dir dann, ohne dass du damit rechnest, in dein gesamtes 
Timing rein.

Bei deinem Wandler sollte man dem Multiplexer nach der Umschaltung etwas 
Zeit für die Pegelanpassung geben, bevor man die Wandlung startet. Sonst 
führt das zu Übersprechen zwischen den Kanälen.

von Jens (Gast)


Lesenswert?

Hallo Chriss, ja genau das ist ja mein Problem, wo soll die 
kanalumschaltung hin? Wie macht man das?

von Jens (Gast)


Lesenswert?

Hallo Chris, danke für die Antwort. Das wollte ich wissen. Ich schau mir 
mal Seite 215 an.

von Jens (Gast)


Lesenswert?

Hallo Mike. Ich hab da kein spezielles Board. Die Schaltungen, 
Versorgung, taktgebung USW habe ich selbst auf nem Steckboard zusammen 
aufgebaut. Für den Fall, dass du das meintest. Und das läuft mit 4 MHz.
Also blind definieren tuh ich sowas nicht. Trotzdem bin ich offen dafür 
es noch zu verbessern, bzw. kleinere Fehler zu vermeiden.

Wie meintest Du das mit dem Multiplexer?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.