PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem DA-Wandler



Olle_Filzlaus
28.01.2007, 14:34
Hallo,

habe einen R2R-DA Wandler gebaut und jetzt an meinen Atmega 16 angeschloßen.

Link zur Erklärung: http://www.mikrocontroller.net/articles/DA-Wandler

Da das Teil vielseitig anwendbar ist, wollte ich den halt mal ausprobieren.

Die Hardware ist so easy, die muss richtig sein. habe ich auch nach gemessen. die stimmt.

Habe dann ein kleines Programm geschrieben um eine Zahl in einen Binärwert umzusetzten.

Ach als Widerstände habe ich 4,7k und 10k Ohm verwendet.



$regfile = "m16def.dat"
$crystal = 8000000
$baud = 9600


'******************* LC Display ************************************************
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Porta.6 , Rs = Portb.0
Config Lcdbus = 4
Config Lcd = 16 * 2

Dim A As Byte , B1 As Byte , C As Byte , D As Byte , B2 As Byte , B3 As Byte
Dim B4 As Byte , B5 As Byte , B6 As Byte , B7 As Byte , B8 As Byte , B0 As Byte
Dim H0 As Byte , H1 As Byte , H2 As Byte , H3 As Byte , H4 As Byte , H5 As Byte,
Dim H6 As Byte , H7 As Byte,

Config Porta.1 = Input
Config Porta.0 = Input


Config Porta.2 = Output
Config Porta.3 = Output
Config Portd.7 = Output
Config Portd.6 = Output

'Werteübergabe an die einzelnen Pins
Da0 Alias Portc.1 'Z0
Da1 Alias Portc.0 'Z1
Da2 Alias Portd.7 'Z2
Da3 Alias Portd.6 'Z3
Da4 Alias Portd.5 'Z4
Da5 Alias Portd.4 'Z5
Da6 Alias Portd.3 'Z6
Da7 Alias Portd.2 'Z7

Portd = &B11000000
Portb = &B11111111
Porta = &B11001111
Portc = &B11111111

Declare Sub Umrechnen()

A = 163 'ca. 2,5V

Do
Cls

'Taste für Hochzählen
If Pina.0 = 0 Then 'Tastenabfrage der Powertaste

Waitms 50 'entprellen

If Pina.0 = 0 Then

Incr A

End If

End If

'Taste für Runterzählen
If Pina.1 = 0 Then 'Tastenabfrage der Powertaste

Waitms 50 'entprellen

If Pina.1 = 0 Then

Decr A

End If

End If

'eingestellter Wert auf lcd ausgeben
Locate 1 , 1
Lcd ; A;

'Zahl umrechnen in binärwert
Call Umrechnen

'ausgabe des Binärwerts
Locate 2 , 1

Lcd ; H7;
Lcd ; H6;
Lcd ; H5;
Lcd ; H4;
Lcd ; H3;
Lcd ; H2;
Lcd ; H1;
Lcd ; H0;

'Übergabe des Binärwerts zu den Ports
Da0 = H7
Da1 = H6
Da2 = H5
Da3 = H4
Da4 = H3
Da5 = H2
Da6 = H1
Da7 = H0

Print A

Loop

End


'*************** Umrechnen ************************************************** ***
Sub Umrechnen()

B0 = A / 2
B1 = B0 / 2
B2 = B1 / 2
B3 = B2 / 2
B4 = B3 / 2
B5 = B4 / 2
B6 = B5 / 2
B7 = B6 / 2

H0 = A Mod 2
H1 = B0 Mod 2
H2 = B1 Mod 2
H3 = B2 Mod 2
H4 = B3 Mod 2
H5 = B4 Mod 2
H6 = B5 Mod 2
H7 = B6 Mod 2

End Sub


Das Problem dabei ist aber das die eingestellt Spannung bei mir immer sehr stark springt.

Also bei einem Wert von 1 kann ich am DA Wandler 1,79V messen. bei 2 = 1,57V. bei 5 = 2,4V und so weiter.
Habe die Ausgabeports schon ein paarmal angepasst, aber es funzt immer noch nicht.

jetzt vermutet ich ein fehler in meinem Decimal in Binär umwandlungsprogramm.

Könnt ihr bitte mal schaun ob ich mich irgendwo vertan habe. Rein theoretisch sollte die Differenz zwischen den DA Wandler werten bei 20mV liegen. Ic probiere schon seit 2 Tagen rum.

thx Arno

Olle_Filzlaus
29.01.2007, 20:37
ok, habs hinbekommen.

Michael 123
29.04.2007, 11:39
Hallo,

kannst du mal sagen wie du das hinbekommen hast?
Habe nämlich einen ähnliche fehler.

mfg
Michael

Olle_Filzlaus
29.04.2007, 17:40
Hallo,

das Programm was ich geschrieben habe war irgendwo falsch gewesen. Ausserdem gibt es in BASCOM eine vie einfachere Variante der Umwandlung.




Declare Sub Write_Port
...
Write_port Dac 'Wertübergabe an DA Wandler
...


Sub Write_port(x As Byte)

Portd.2 = X.7
Portd.3 = X.6
Portd.4 = X.5
Portd.5 = X.4
Portd.6 = X.3
Portd.7 = X.2
Portc.1 = X.1
Portc.0 = X.0

End Sub


Das ist nur ein Auszug aus dem Programm. Du gibst also ein Wert für den DAC vor. Den Übergibst du in das Unterprogramm was dann die einzelnen Ports richtig setzt.

Hoffe das Hilft dir weiter.

cu Arno