Forum: Mikrocontroller und Digitale Elektronik Problem mit R/2R DA- Wandlung


von Daniel (Gast)


Lesenswert?

Ich habe mir ein 8 Bit R/2R DA - Wandler gabaut. Es ist alles richtig 
angeschlossen. Er funktioniert nur zu einem Bstimmten Grad richtig:

Wenn ich an den Ausgang die Bits langsam hochzähle, kann ich eine 
ansteigende Spannung am Voltmeter erkennen. Ab einem bestimmten Wert 
~128, fällt die Spannung ab, auf die Hälfte der ref. Spannung (5V) und 
ab da wird weitergezählt.

Mfg Daniel

von Falk (Gast)


Lesenswert?

@Daniel

>Ich habe mir ein 8 Bit R/2R DA - Wandler gabaut. Es ist alles richtig
>angeschlossen. Er funktioniert nur zu einem Bstimmten Grad richtig:

>Wenn ich an den Ausgang die Bits langsam hochzähle, kann ich eine
>ansteigende Spannung am Voltmeter erkennen. Ab einem bestimmten Wert
>~128, fällt die Spannung ab, auf die Hälfte der ref. Spannung (5V) und
>ab da wird weitergezählt.

Klingt entweder nach vertauschten Bits in der Verdrahtung (MSB) oder 
Einer-Zweierkomplement Verwechselung.

MFG
Falk

von Daniel (Gast)


Lesenswert?

Die Verdrahtung stimmt, ich zähle einfach mit einer for -schleife hoch 
die Zahl, die hochgezählt wird, gebe ich an den Port aus.

Mfg. Daniel

von Falk (Gast)


Lesenswert?

@Daniel

>Die Verdrahtung stimmt, ich zähle einfach mit einer for -schleife hoch
>die Zahl, die hochgezählt wird, gebe ich an den Port aus.

In C? Ist deine Zählvariable als unsigned definiert? Zeig mal den Code.
Du kannst auch die Bits einzeln setzen und prüfen. Das LSB wackelt nur 
wenig, das MSB um VCC/2.

MfG
Falk

von Daniel (Gast)


Lesenswert?

Hier der Code
1
int main (void)
2
3
{
4
  uint16_t  j,l,m,i;
5
  
6
7
  DDRB = 0xff;
8
9
  while(1)
10
  {
11
    for( i = 0; i < 257; i = i + 1) //Abzählen der Ports aufwärts
12
    {  
13
    
14
      PORTB = i;
15
      
16
17
      for(j=0; j < 1; j = j+1);
18
        
19
            //Abwarten
20
    }
21
22
 for( l = 257; l > 0; l = l -1) //Abzählen der Ports abwärts
23
    {
24
      PORTB = l;
25
      
26
27
      for(m=0; m < 1; m = m+1);
28
        
29
            //Abwarten
30
    }
31
32
33
34
35
36
37
38
  }
39
40
41
42
43
  return 1;
44
}

von Obelix (Gast)


Lesenswert?

Verstehe ich da jetzt was falsch?

128 ist die Hälfte von 256 -> Halbe Referenzspannung am Ausgang

von Falk (Gast)


Lesenswert?

@Daniel

>Hier der Code

Soweit OK (naja ein paar Schnitzer sind drin), aber dein Abwarten wird 
rausoptimiert bzw. ist soo kurz, dass du da nichts sehen kannst. Womit 
misst du? Mit nem Oszi? Ich tippe immer noch auf verdrehte Verdrahtung. 
Hast du einen Schaltplan?
Hier mal die etwas aufgeräumte Version. Du brauchst dafür die include 
der delay Macros

#include <avr/delay.h>

int main (void)

{
  uint16_t  j,l,m,i;

  DDRB = 0xff;

  while(1)
  {
    for( i = 0; i < 256; i++) //Abzählen der Ports aufwärts
    {
      PORTB = i;
    _delay_us(1);
    }

 for( l = 255; l > 0; l--) //Abzählen der Ports abwärts
    {
      PORTB = l;
      _delay_us(1);
    }
  }
  return 1;
}

MFG
Falk

von Obelix (Gast)


Lesenswert?

Oder evtl irgendwo ein Widerstand mit falschem Wert?

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.