Digitalisierung

Gast #3587943
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ß
#3587962
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.
Gast #3587964
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
#3588003
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
#3588032
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.
Gast #3588046
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
#3588056
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
#3588083
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.
#3625784
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ß
#3630524
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
}
Gast #3630567
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
Gast #3630592
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
}
Gast #3637693
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ß
#3637705
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
#3637707
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
Gast #3637719
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.
#3637725
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.
#3637734
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.
Gast #3641685
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ß
Gast #3641715
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.

> ??

?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren