Forum: Mikrocontroller und Digitale Elektronik ADC mit einem Wert 0-255 (Atmega16)


von Lukas P. (lzaman)


Lesenswert?

Guten morgen, also ich habe da so meine Probleme mit dem Verständnis der 
mikrocontroller. Ich befasse mich zur zeit mit dem Atmega16 am Stk500 
Board.
Nun wollte ich eine feste AnalogSpannung an einem PORTA ausgeben lassen.

Wie soll das gehen wenn ich doch nur Werte von 1 und Null zuweisen kann?

Ich müsste doch irgendwie Werte zwischen 0 und 255 an einen einzigen 
port senden, den der Mikrocontroller dann als AnalogSpannung zwischen 
0-5 Volt ausgibt.

Ich blicke da nicht so ganz durch. Das Tutorial enthält leider auch kein 
Beispiel dazu. Vielleicht könnt ihr eure Codes posten?

von Michael U. (amiga)


Lesenswert?

Hallo,

Du verwechselst da was: der ADC ist ein Analog-Digital-Converter, Du 
gibst also eine analoge Spannung zwischen 0...5V (als Beispiel!) in den 
Pin rein und bekommst einen Wert zwischen 0 und 1023 vom ADC geliefert.

Was Du meinst, wäre ein DAC, Digtal-Analog-Converter, sowas hat ein AVR 
nicht eingebaut.
Du kannst eine digtal-Analog-Wandlung beim AVR mit etwas Zusatzaufwand 
per PWM erreichen, wenn Du sowas brauchst, such mal unter PWM nach.

Gruß aus Berlin
Michael

von Johannes M. (johnny-m)


Lesenswert?

Du verwechselst einen ADC (Analog --> Digital) mit einem DAC (Digital 
--> Analog). Der ATMega16 hat nur einen ADC, und der macht aus einem am 
Pin anliegenden Analogwert einen digitalen Wert. Einen einfachen DAC, 
mit dem man analoge Spannungen ausgeben kann, kann man mit einer 
Pulsweitenmodulation (PWM) mit einem der Timer realisieren. Oder bei 
gehobenen Ansprüchen einen externen DAC benutzen.

von Lukas P. (lzaman)


Lesenswert?

Also ich will einfach einen Pin als Ausgang definieren und einen wert 
ausgeben lassen, der sich nicht ändert, z. B. 3V. Wie teile ich es dem 
Mikrocontroller denn mit?

Ich kann ja schlecht schreiben PORTD=3V

wobei hier das nächste Problem anfängt. PORTD sind 8 pins und nicht 
einer.

von spess53 (Gast)


Lesenswert?

Hi

Die einzigen AVR mit DAC sind die AT90PWM...-Typen. Mit allen anderen 
kannst du keine Analogspannung direkt ausgeben. Mögliche Wege sind: PWM, 
externer DAC oder R2R-Netzwerk.

MfG Spess

von Bauteiltöter (Gast)


Lesenswert?

Das geht so einfach nicht! Bei einem Analog-Digital-Converter must du 
einen Analogen Wert eingeben und du bekommst das Digitale Signal. 
Soetwas hat ein Atmega16 Eingebaut.
Bei einem Digital-Analog-Converter giebst du Digital ein und Bekommst 
ein Analogen Signal herraus. Soetwas hat kein Atmega!!!!!
Ein µC kann nur 5V oder 0V ausgeben!!!


MfG Bauteiltöter

von Lukas P. (lzaman)


Lesenswert?

Dankeschön , das hift mir weiter. Aber mit dem PWM habe ich das nicht 
hinbekommen, sitze schon zwei Tage dran! Oder ich kann es schlecht 
überprüfen? Wiekann ich denn messen ob was am PWM ausgegeben wird? Bin 
im Besitz eines 10MHz Oszis und Multimeter. Das Multimeter zeigt immer 
Spannungsschwankungen an aber keine feste Spannung.

Bei der K8055 kann ich doch auch einen festen Wert messen an dem PWM 
ausgängen, wenn ich mit der Software die Werte einstelle. z.B. 
entspricht der
eingestellte wert 127 ca. 2,5V.

von spess53 (Gast)


Lesenswert?

Hi

>Wiekann ich denn messen ob was am PWM ausgegeben wird?...

Oszi an das PWM-Pin und Kurve ansehen. Es sollte ein Rechteck mit 
einstellbaren Tastverhältnis zu sehen sein. Die Analogspannung bekommst 
du, wenn du ein RC-Filter nachschaltest.

MfG Spess

von Lukas P. (lzaman)


Lesenswert?

Wie ist der RC Filter dimensioniert? Welche werte sollen R und C haben?

von Daniel S. (daniels)


Lesenswert?

Hallo, mit welcher Frequenz arbeitet denn deine PWM? Danach richtet sich 
das, ich würde R und C so dimensionieren, dass ich um den Faktor 100 bis 
1000 unter der Frequenz lieg, also die Grenzfrequenz = 1/1000 * PWM 
Frequenz ist.

von Lukas P. (lzaman)


Lesenswert?

Juhu, ich habs geschafft, naja fast.

Ich kann meine PWM setzen und auf einen festen Wert einstellen

im Beispel 128 also ca. 2,5V

Aber wieso nur am Ausgang OCR1A, ich möchte PWM an OCR1B ebenfalls
realisieren.

Hat jemand eine Lösung?

Hier mein Code:

#include <avr/io.h>
#define F_CPU 8000000

int main  (void)
{

   DDRD=0b1111111;

// PWM Konfig.

   TCCR1B |= (1<<CS10);  //
   TCCR1A |= (1<<WGM10)|(1<<COM1A1); //PWM 8 Bit

       OCR1A=128;

       OCR1B=128;

  return 0;
}

von Philipp B. (philipp_burch)


Lesenswert?

Dann pack' halt COM1B1 auch noch in TCCR1A.

von Lukas P. (lzaman)


Lesenswert?

Danke klappt.

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.