PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PCF8591 Analogspannungsausgabe



mat-sche
08.03.2008, 10:51
He Jungs!

Mein Problem ist die analoge Spannungsausgabe bei einem PCF8591.
Das proggen ist nicht das Prob, wie lässt sich ein Analogwert z.Bsp.: 3,45V in Hex wandeln (8Bit) das ich dies dann zum PCF schicken kann?

Danke & Gruß
MAT

mat-sche
08.03.2008, 11:29
Bin schon ein stückchen weiter gekommen:

Vout=Vref*(D7/2+D6/4+D5/8+D4/16+D3/32+D2/64+D1/128+D0/256)

soweit zur Formel..... D7-0 stehen für die Bits des Analogwertes der zum PCF gesendet wird.
Nur leider suche ich eine Möglichkeit aus einer Kommazahl die Bits D7-D0 herauszubekommen. Hat jemand ne Idee?

mat-sche
08.03.2008, 20:13
Sooo habsch selber herausgefunden! \:D/

Also: in der obrigen Formel bekomme ich für 10101011 (171/256)*5=3,33V heraus und daraus folgt:

1. gewünschte Spannung: 3,25/5=0,56
2. mit 256 multiplizieren und danach runden oder alles mit dem Windowsrechner rechnen => dort kann man sich gleich das Ergebnis in HEX oder BIN umwandeln lassen

3. kompilieren und es stimmt...fast :)

Bei mir lese ich mit einem Multimeter 3,23V und nach Wandlung mit dem Chip 3,248V, was will man(n) mehr :)




'************************************************* *********

'Programm : I2C-Ansteuerung PCF8591
'By : mat-sche@web.de
'Compiler : BASCOM-AVR 1.11.9.1
'Hardware : Mega läuft als Master holt
' Daten über I2C vom ADC
'
'Board : kleines
'Chip type : MEGA32

'************************************************* *********

$regfile = "m32def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 150 ' default use 32 for the hardware stack
$swstack = 150 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
'$sim
$lib "i2c_twi.lbx"


'-----------------2x16 LCD Display an Port c =>Conector -------------------------------------------------------------------------------------------------
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2 ' Pinbelegung "LCD-Port)"
' SV8 6 5 4 3 7 8 ' Pinbelegung SV9 Board


Config Lcd = 16 * 2
Config Porta = Output
Config Lcdbus = 4
Initlcd
Print "Start"

Cursor Off Noblink ' Cursor und Blinken abschalten.
Cls

'------------------------------------------------------------------------------- Config TWI
Config Twi = 100000 ' Init TWBR und TWSR
' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
Twcr = &B00000100 ' nur TWEN setzen

Config Sda = Portc.1 'SDA und SCL als Hardware-TWI definieren
Config Scl = Portc.0
Const Pcf8591write = &H90 'PCF TWI Adresse zum schreiben des Controlbyts
Const Pcf8574read = &H91 'PCF TWI Adresse zum Auslesen der Datenbyts

Ddra = &B00000000 ' PortA wird als Eingang verschalten
'------------------------------------------------------------------------------- Config Variablen
Dim U_wert As Single ' Variablen
Dim Dat As Byte
Dim Lcd_text As String * 5

'------------------------------------------------------------------------------- Config Controllbyte PCF
I2cstart
I2cwbyte Pcf8591write 'Schreibadresse senden
I2cwbyte &B00000000 'Kontrollbyte
'1. immer null
'2. 1= Analog Out enable '
'3-4. Messwahl: 00= single input; 01= 3 differential input; 10= kanal 0&1= single end, kanal 2&3= differential; 11= 2 differntial inputs
'5.immer null
'6. 1= Autoincrement Flag an (nach jedem Acknowled wird eine Wandlung vom nächsten Kanalangestoßen)
'7-8.A/D Kanalnummer: 00=cha0; 01=cha1; 10=cha2; 11=cha3
I2cstop 'TWI Übertragung abgeschlossen


Do
'------------------------------------------------------------------------------- A/D Kanal 0 auslesen nach Tastendruck
If Pina.7 = 1 Then 'nach jeden Tastendruck PCF8591 Analogwert auslesen

I2cstart
I2cwbyte Pcf8574read ' Leseadresse übermitteln
I2crbyte Dat , Ack 'Dummy => benötigt da ja nach jedem Ack erst die vorhergehende Wandlung gesendet wird; Ack bedeutet dass noch weitere Datenbyts abgefragt werden
I2crbyte Dat , Nack 'Messwert von kanal0, Nack=> es wird kein weiteres Datenbyte abgefragt
I2cstop '
Print " Wertdat = " ; Dat
Print Err 'TWI übermittlung OK? 1= nein, 0= i.O.

End If

U_wert = Dat * 5
U_wert = U_wert \ 254
Lcd_text = Fusing(u_wert , "#.###") 'FUSING returns a formatted string of a single value.

'Cls
Locate 1 , 1
Lcd " U-Wert " ; Lcd_text
Locate 2 , 1
Lcd " Wert_Dat= " ; Dat

'------------------------------------------------------------------------------- D/A Kanal Spannung ausgeben auf Tastendruck
If Pina.6 = 1 Then
I2cstart
I2cwbyte Pcf8591write 'Schreibadresse senden
I2cwbyte &B01000000 'Kontrollbyte
'1. immer null
'2. 1= Analog Out enable '
'3-4. Messwahl: 00= single input; 01= 3 differential input; 10= kanal 0&1= single end, kanal 2&3= differential; 11= 2 differntial inputs
'5.immer null
'6. 1= Autoincrement Flag an (nach jedem Acknowled wird eine Wandlung vom nächsten Kanalangestoßen)
'7-8.A/D Kanalnummer: 00=cha0; 01=cha1; 10=cha2; 11=cha3

I2cwbyte &HA6 , Nack
I2cstop
End If

Loop
End

MAT