Forum: Mikrocontroller und Digitale Elektronik Digitalisierung


von 9er (Gast)


Lesenswert?

Hallo,
Hab ein problem und zwar muss ich ein projekt machen, wo ich auf einem 
atmega8 uc analoge signale(dc) 0volt bis 10volt digitalisieren muss und 
diese auf einer 8bit led anzeigen stufenweise ausgeben muss, zusätzlich 
dazu muss der wert auf einem lcd display angezeigt werden. Wie kann ich 
das ganze realisieren da ich unter anderem auf meinem uc nur 5 volt 
habe, 3 ports mit jeweils 6 pins ....? Bitte um ausführliche hilfe.

Gruß

von Dennis (Gast)


Lesenswert?

9er schrieb:
> Bitte um ausführliche hilfe.

Beauftrage einfach ein Entwicklungsbüro in deiner Nähe. Die machen das 
dann für dich.

von René B. (reneb)


Lesenswert?

Moin 9er,
allzu ausführliche Hilfe kannst du erstmal nicht erwarten. Wir werden 
dir das Projekt natürlich nicht vorkauen.
Aber in der Regel wirst du hier wenigsten Links und ein paar 
Basis-Ansätze erhaletn, auf denen du selbst aufbauen musst.

10Volt an einem 5V-ADC sampeln ist gar kein Problem. Man teilt die 
Spannung über einen Widerstandsteiler herunter. Der Teiler ist bekannt 
und mit dem Äquivalent zu den 5V kannst du dann mit dem Teilerfaktor 
einfach wieder auf den Wert der Spannugn bis 10V schließen.
Wenn du aber möglichst sauber messen möchtest, solltest du gegen die 
interne Referenzsspannung deines Mikrocontrollers messen. Die ist beim 
atmega8 z.B. 2,56V. Daher also mindestens die 10V um den Faktor vier 
herunterteilen und mit dem ADC gegen die 2,56V sampeln.

Zur Ansteuerung eines LCD findest du hier im Forum auch genug. Such mal 
nach HD4470 LCD library für AVR. Wahrscheinlich bist du mit der Lib und 
Beschreibung von Peter Fleury am besten dran.

Um LEDs als Leuchtbalken am atmega anzuschließen bist du auch nicht der 
erste. Fang erstmal mit der klassischen Beschaltung an und wenn dir die 
Pins knapp werden, versuch es mit dem Stichwort LED-Multiplexing.

Alles in allem eine machbare Aufgabe als Schulprojekt oder Laborarbeit 
im Rahmen irgendeines E/I-Studiums.

von kif (Gast)


Lesenswert?

Das Auslesen geht mit dem ADC des Atmega über einen Spannungsteiler 
(http://de.wikipedia.org/wiki/Spannungsteiler)

von NurEinGast (Gast)


Lesenswert?

> und zwar muss ich

Sagt wer ? Der Lehrer ? Dann sollte er Euch doch etwas dazu erklärt 
haben ?

Viellicht hilft ja das folgende schon mal weiter .....

> muss der wert auf einem lcd display angezeigt werden
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

> 0volt bis 10volt digitalisieren .... uc nur 5 volt habe
http://www.mikrocontroller.net/articles/Spannungsteiler

> digitalisieren
http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

von hitgirl (Gast)


Lesenswert?


von 9er (Gast)


Lesenswert?

Leider ist der Unterricht viel zu oft ausgefallen deshalb habe ich sehr 
wenig Wissen in dem Thema aber trotzdem dank für die Infos, zwar nicht 
sehr ausführlich aber hilfreich

von Henny (Gast)


Lesenswert?

...nicht sehr ausführlich, weil du immer noch Arbeit - und keine fertige 
Lösung - hast?

von Karl H. (kbuchegg)


Lesenswert?

René B. schrieb:

> Wenn du aber möglichst sauber messen möchtest, solltest du gegen die
> interne Referenzsspannung deines Mikrocontrollers messen. Die ist beim
> atmega8 z.B. 2,56V.

Da steckt ein kleiner Irrtum drinnen.
Die interne Referenzspannung eines Mega8 ist hauptsächlich eines: sie 
ist in der Höhe sehr konstant und von der Versorgungsspannung 
unabhängig.
Was sie aber ganz sicher nicht ist: sie ist nicht 2.56V

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Henny schrieb:
> ...nicht sehr ausführlich, weil du immer noch Arbeit - und keine fertige
> Lösung - hast?

Wenn er die Links verfolgen und lesen würde, hätte er für den ADC Teil 
sogar das: eine zu 99% fertige Lösung.

von Conny G. (conny_g)


Lesenswert?

Karl Heinz schrieb:
> René B. schrieb:
>
>> Wenn du aber möglichst sauber messen möchtest, solltest du gegen die
>> interne Referenzsspannung deines Mikrocontrollers messen. Die ist beim
>> atmega8 z.B. 2,56V.
>
> Da steckt ein kleiner Irrtum drinnen.
> Die interne Referenzspannung eines Mega8 ist hauptsächlich eines: sie
> ist in der Höhe sehr konstant und von der Versorgungsspannung
> unabhängig.
> Was sie aber ganz sicher nicht ist: sie ist nicht 2.56V

Datenblatt Seite 198:

"Internal reference voltages of nominally 2.56V or AVCC are provided 
On-chip."

Habe gerade vor 3 Wochen damit was gemacht.

Bei den späteren, Atmega328 z.B. ist die Vref 1,1V.

: Bearbeitet durch User
von kif (Gast)


Lesenswert?

Conny G. schrieb:
> Datenblatt Seite 198:
>
> "Internal reference voltages of nominally 2.56V or AVCC are provided
> On-chip."
>
> Habe gerade vor 3 Wochen damit was gemacht.
>
> Bei den späteren, Atmega328 z.B. ist die Vref 1,1V.

Ich denke er meint, dass sie nicht genau 2.56V beträgt

von Karl H. (kbuchegg)


Lesenswert?

Conny G. schrieb:
> Karl Heinz schrieb:
>> René B. schrieb:
>>
>>> Wenn du aber möglichst sauber messen möchtest, solltest du gegen die
>>> interne Referenzsspannung deines Mikrocontrollers messen. Die ist beim
>>> atmega8 z.B. 2,56V.
>>
>> Da steckt ein kleiner Irrtum drinnen.
>> Die interne Referenzspannung eines Mega8 ist hauptsächlich eines: sie
>> ist in der Höhe sehr konstant und von der Versorgungsspannung
>> unabhängig.
>> Was sie aber ganz sicher nicht ist: sie ist nicht 2.56V
>
> Datenblatt Seite 198:
>
> "Internal reference voltages of nominally 2.56V or AVCC are provided
> On-chip."

Datenblatt, ATMega8, Seite 241 "ADC Characteristics"
1
VRef    Reference Voltage   Minimum: 2.3V, Typical: 2.56V, Maximum: 2.9V

von Alex W. (a20q90)


Lesenswert?

VRef kann über die Register VCC, VRefext, 2,65V oder 1,1V eingestellt 
werden

von Karl H. (kbuchegg)


Lesenswert?

Alex W. schrieb:
> VRef kann über die Register VCC, VRefext, 2,65V oder 1,1V eingestellt
> werden

Verwirr bitte den TO nicht noch mehr, als er ohnehin schon ist.

Beim Mega8 gibt es genau diese Möglichkeiten
1
REFS1 REFS0  Voltage Reference Selection
2
   0      0   AREF, Internal Vref turned off
3
   0      1   AVCC with external capacitor at AREF pin
4
   1      0   Reserved
5
   1      1   Internal 2.56V Voltage Reference with external capacitor at AREF pin

Wobei die Zahlenangabe 2.56V ein wenig mit Vorsicht zu geniessen ist und 
der tatsächliche Wert nachgemessen werden muss.

von Fatih Ö. (neuner)


Lesenswert?

Hallo Leute,

ich hab mich glaub durch alle Links durchgekämpft aber ich komm einfach 
mit dem Projekt nicht klar weil viele Programme in Assembler geschrieben 
sind und ich in C programmieren muss :( könntet ihr mir weitere Tipps 
geben wie ich das Projekt bis nächste Woche fertig bekommen kann.

Gruß

von DomeG (Gast)


Lesenswert?

> ich in C programmieren muss

Es gibt das AVR-Tutorial auch in der C-Variante:
AVR-GCC-Tutorial

Speziell ADC:
AVR-GCC-Tutorial/Analoge Ein- und Ausgabe

und LCD:
AVR-GCC-Tutorial/LCD-Ansteuerung

Gruß

von Fatih Ö. (neuner)


Lesenswert?

1
#include <avr\io.h>
2
#define F_CPU 3686400
3
#include <util\delay.h>
4
5
int main (void)
6
{
7
  ADMUX = 0b01000000;    
8
  ADCSRA = 0b10100101;          
9
  DDRB = 0b11111111;            
10
  
11
  while (10)
12
  {
13
    ADCSRA = ADCSRA | 0b01000000;    
14
    while (ADCSRA & 0b01000000)      
15
    {}
16
                if(ADC >=0 && ADC <128)
17
    {
18
      PORTB = 0b00000001;
19
    }
20
    if(ADC >=128 && ADC <256)
21
    {
22
      PORTB = 0b00000010;
23
    }
24
    if(ADC >=256 && ADC <384)
25
    {
26
      PORTB = 0b00000100;  
27
    }
28
    if(ADC >=384 && ADC <512)
29
    {
30
      PORTB = 0b00001000;
31
    }
32
    if(ADC >=512 && ADC <640)
33
    {
34
      PORTB = 0b00010000;
35
    }
36
    if(ADC >=640 && ADC <768)
37
    {
38
      PORTB = 0b00100000;
39
    }
40
    if(ADC >=768 && ADC <896)
41
    {
42
      PORTB = 0b01000000;
43
    }
44
    if(ADC >=896 && ADC <1024)
45
    {
46
      PORTB = 0b10000000;
47
    }
48
    
49
  } 
50
}

: Bearbeitet durch User
von Fatih Ö. (neuner)


Lesenswert?

Hallo Leute,

hab mal versucht ein Programm zu schreiben was leider nicht 
funktioniert. Das Programm soll die Spannung AVCC stufenweise (3Bit->8 
Zustände) auf den LED's anzeigen. Kann mir bitte jemand ein Tipp geben 
warum es nicht funktioniert. Danke für die Infos DomeG.

Gruß

von Uwe (Gast)


Lesenswert?

Weil du hier Bit 5 setzt:
>   ADCSRA = 0b10100101;

 Bit 5 – ADATE: ADC Auto Trigger Enable When this bit is written to on
e, Auto Triggering of the ADC is enabled. The ADC will start a con-
version on a positive edge of the selected trigger signal. The trigger
source is selected by setting the ADC Trigger Select bits, ADTS in SFIOR

und weil du hier die Spannung am Pin ADC0 mißt:
> ADMUX = 0b01000000;

UND weil du hier das Datenblatt lesen solltest (speziell von Seite 204 
bis 221 :
http://www.atmel.com/Images/doc2466.pdf

von 25.04.2014 13:01 (Gast)


Lesenswert?

Das Register ADC sollte nur einmal nach der Wandlung gelesen werden? 
hmmm.
Verwende doch die Bitbezeichnungen für die Register, außer da wo es 
offensichtlich ist. Macht den Coe für alle direkt lesbarer :)
1
// wähle erstmal ADC0 als Eingang
2
uint8_t ad_channel = 0;
3
4
// puffervariable für ADC-Register
5
uint16_t ad_buffer;
6
7
// Kanalwahl
8
ADMUX  = (1 << REFS1) | (1 << REFS0 ) | (ad_channel & 0x0f);
9
10
// ADC-Takt einstellen
11
// 3,686400 MHz / 64 = 57,600 kHz
12
// 200 kHz > 57,600 kHz > 50 kHz
13
// das ist also ok
14
ADCSRA = (1 << ADPS1) | (1 << ADPS2);
15
16
// AD einschalten
17
ADCSRA |= (1 << ADEN);
18
19
// erste Wandlung ist eine Dummy Wandlung
20
ADCSRA |= (1 << ADSC);
21
while (ADCSRA & (1 << ADSC)
22
{
23
  // wait for end of dummy conversion...
24
}
25
26
ad_buffer = ADC;
27
28
while(1)
29
{
30
  // mainloop wie bisher, nur solltest du ad_buffer prüfen...
31
}

von Fatih Ö. (neuner)


Lesenswert?

Uwe an welchem Pin sollte ich denn die Spannung messen, ich habe doch 6 
Pins zur Verfügung -> PC0-PC5 und ich habe mir die Dattenblätter sher 
oft durchgelesen:)!!! Wieso ich des so umständlich mache mit den 
if-Bedingungen ist weil wirs nicht anders gelernt haben:(

von Christian (Gast)


Lesenswert?

Du musst das Datenblatt nicht einfach nur lesen, sondern auch verstehen 
;-)
Im Unterricht wurde nie die Switch-Case-Abfrage behandelt?
Sollen die LEDs nacheinander aufleuchten oder immer eine dazukommen?

von 9er (Gast)


Lesenswert?

Hallo,
die Leds sollen stufenweise leuchten, je höher die Spannung desto mehr 
Bits Christian und Switch-Case-Abfragen haben wir nur kurz angesprochen.

Wie würdet ihr die Widerstände für den Spannungsteiler wählen? 
Hochohmig?

Gruß

von Karl H. (kbuchegg)


Lesenswert?

9er schrieb:
> Hallo,
> die Leds sollen stufenweise leuchten, je höher die Spannung desto mehr
> Bits Christian und Switch-Case-Abfragen haben wir nur kurz angesprochen.
>
> Wie würdet ihr die Widerstände für den Spannungsteiler wählen?
> Hochohmig?
>

So dass beide Widerstände zusammen in der Gegend von 10k haben.

Wenn du von 0 bis 10V messen sollst, als Referenzspannung die Versorgung 
mit 5V wählst, brauchst du also einen Spannungsteiler 2:1. Zwei 10k 
Widerstände in Serie. Oder 2 Stück 4k7 Widerstände

von Karl H. (kbuchegg)


Lesenswert?

Fatih Ö. schrieb:
> Hallo Leute,
>
> hab mal versucht ein Programm zu schreiben was leider nicht
> funktioniert.

Und jetzt erklärst du mir bitte noch, warum du dich partout weigerst, 
die ADC Routinen aus dem ACR-GCC-Tutorial zu verwenden. Die würden 
nämlich aus dem Stand heraus funktionieren.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe

: Bearbeitet durch User
von 9er (Gast)


Lesenswert?

Viele Dank erstmal.
Bei 2,56 V Referenzspannung mache ich dann R1 = 10K und R2 = 2,5K, passt 
des weil ich ja dann 0,6 V abweiche von Vref. Und muss ich einen 
Kondensator ranhängen, hab nämlich oft was mit Kondensator gelesen.

von Karl H. (kbuchegg)


Lesenswert?

9er schrieb:
> Viele Dank erstmal.
> Bei 2,56 V Referenzspannung mache ich dann R1 = 10K und R2 = 2,5K, passt
> des weil ich ja dann 0,6 V abweiche von Vref. Und muss ich einen
> Kondensator ranhängen, hab nämlich oft was mit Kondensator gelesen.

Ein Kondesantor, 100nF, vom ARef-Pin nach Masse.

So wie das in gefühlten 10 Millionen anderen Beiträgen hier im Forum, 
inklusive aller Tutorien und Datenblätter steht.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:
> 9er schrieb:
>> Viele Dank erstmal.
>> Bei 2,56 V Referenzspannung mache ich dann R1 = 10K und R2 = 2,5K, passt
>> des weil ich ja dann 0,6 V abweiche von Vref.

Nein das passt nicht.
Denn wenn ich deine Daten hernehme und da mal mit 10V durchrechne, dann 
komme ich drauf, dass aus dem Spannungsteiler dann 3.125V rauskommen.
Du bist also zu hoch. Und zwar prozentual schon ganz ordentlich zu hoch.

Nimm doch die 5V, die du am Mega8 sowieso zur Verfügung hast.
Kein Mensch erwartet von dir, dass du ein hochpräzises Messinstrument 
bauen kannst. Du hast ja ausserdem sowieso sicherlich nicht die 
hochpräzisen Widerstände im Einsatz. Dein 10k Widerstand hat keine 10k.

: Bearbeitet durch User
von 9er (Gast)


Lesenswert?

Wie kommst du auf die 3.125V?

von Karl H. (kbuchegg)


Lesenswert?

9er schrieb:
> Wie kommst du auf die 3.125V?

Hmm.
Gute Frage. Da muss ich mich wohl am Taschenrechner wo vertippt haben.

Nochmal gerechnet und siehe da. Da bist im zulässigen Bereich.

von 9er (Gast)


Lesenswert?

Da ich die analoge Spannung stufenweise auf 8 leds ausgeben will 
benötige ich ja beim atmega8 zusätzlich noch 5 leds. Ich würde diese 
leds jeweils mit 350ohm vorwiderstände beschalten, passt des??? Und 
schalte ich diese dann gegen masse bzw gnd oder +5V bzw Vcc???

Gruß

von Mike (Gast)


Lesenswert?

9er schrieb:
> Ich würde diese leds jeweils mit 350ohm vorwiderstände beschalten,
> passt des???

Wenn die LEDs nicht ganz funzelig sind, darf der Widerstand gerne 1kΩ 
haben. Probiers aus mit der Helligkeit.

> Und schalte ich diese dann gegen masse bzw gnd oder +5V bzw Vcc?

Das kannst du machen wie du möchtest. Du kannst auch die eine Hälfte 
gegen Gnd und die andere gegen VCC schalten, mußt sie nur passend 
ansteuern.

> ??

?

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.