PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 1-Wire D/A-Wandler



martin66119
06.01.2012, 21:00
Hallo und guten Abend,

da ich mir vor einiger Zeit einen Mikrocontroller zugelegt hatte und diesen mit Bascom etwas programmiert habe, stelle ich die Frage hier. Ach so. Einen 1-Wire Temeratursensor (DS1820) betreibe ich im Moment.

Also ich suhe einen 1-wire D/A Wandler (10 bit oder 12) am besten mit mehreren Kanälen. Wenn es keinen mit mehreren Kanälen gibt, dann halt mit einem.
Er sollte nätürlich mit Bascom programmierbar sein und :-) wenn es einen Beispielcode hier gäbe, das wäre super.

Spannungsbereich der Ausgabespannung bis ca. 5 Volt.

Grüße und schonmal
Danke für die Hilfe

Martin

peterfido
07.01.2012, 17:45
Wenn er mit Bascom programmierbar sein soll, dann kommt ja nur ein Atmel in Frage. Was meinst Du mit mehr Kanälen? Einen Temperatursensor mit mehreren Kanälen macht in einem Gehäuse ja nicht soo viel Sinn. Möchtest Du mehrere DS1820 auslesen und den Wert analog ausgeben?

Dafür gibt es z.B. PWM oder ICs, welche 4-20 mA ausgeben. Diese lassen sich nicht direkt mit Bascom prgramieren. Jedoch von einem per Bascom programmierten Atmel steuern. Aber Spannungsbereich 0-5V klingt für mich am einfachsten nach PWM. Jedoch ist Spannung analog störanfälliger als Strom (4-20mA). Was da durch höherbittige Auflösung gewonnen wird, kann durch ein in der Nähe befindliches Gerät gleich wieder mehr als verloren gehen.

Der Vorteil der Spannung ist, dass die uCs ADC mitbringen. So lässt sich z.B. ein Allegro Hall-IC recht einfach anbinden. Jedoch würde ich die Entfernung so kurz wie möglich halten.

martin66119
07.01.2012, 19:38
Hallo,

ich messe mit z.B. 3 DS1820 die Temperatur und möchte in Abhängigkeit der gemessenen Temperatur eine Spannung im Beriech von 0 - 5 V ausgeben.

z.B. T 1 = 10 C --- U1 = 2,5 V
T 2 = 15 C ----U2 = 1,7 V
T 3 = - 4C ----U3 = 1,1 V

Die Kennlinine d.h. die Funktion fx(Tx) soll dann im Controller als Funktion hinterlegt sein.

Wie gesagt, die Spannung soll im Bereich von 0 - 5V einstellbar sein. Nach Möglichkeit in Schritten von 5mV .

Grüße
Martin

peterfido
08.01.2012, 13:17
Da würde ich dann auf PWM oder ein (3) elektronische Potentiometer setzen. Diese dann einfach als Spannungsteiler schalten.

martin66119
08.01.2012, 14:15
Vielen Dank für die Hilfe.

Die Digitalen Potis die ich gefunden hatte, haben meist nur 255 Einstellwerte. Da ich Schritte <= 5mV benötige, ginge das nur durch Verschachtelung. Das wollte ich eigentlich nicht. Gibt es keine D/A Wandler, dem man über 1-.Wire einen Wert
sendet, und der D/A-Wandler diese dann als analoge Spannung ausgibt. Die Spannung soll sich erst beim setzten eines neuen Wertes ändern. Ein serieller D/A-Wandler ginge sicherlich auch.

Ich hoffe mir kann jemenand ein Bauteil nennen. Am besten eines, wo ich auch einen Beispielcode hier finde kann.

Grüße
Martin

mat-sche
10.01.2012, 19:06
Hi,

der DS2450 16bit 1Wire ADC kannst Du als Wandler nehmen. Diesen kannst Du Dir auch als kostenloses Sample von Michrochip zuschicken lassen. Mit diesem kannst Du eine Auflösung von 16 bit erreichen. Wichtig ist hier nur Dein Platinenlayout, dieses muss sehr genau und gut entwickelt sein , um eine gute Wandlung hinzubekommen (Rauschminimierung, Wandlergenauigkeit).
Hier ist mein verwendeter Code in Bascom:


Declare Sub Crc_get()
Const 1w_readmem = &HAA
Const 1w_writemem = &H55
Const 1w_convertch = &H3C
Const 1w_readrom = &H33
Const 1w_matchrom = &H55
Const 1w_skiprom = &HCC
Const 1w_searchrom = &HF0
Const 1w_conditsrc = &HEC
Const 1w_ovdrvskprom = &H3C
Const 1w_ovdrvmtchrom = &H69
Const 1w_vccoperation = &H40

1wreset 'reset the device
1wwrite 1w_skiprom 'Skip ROM
1wwrite 1w_writemem 'Write Memory
1wwrite &H1C 'Write to 001C
1wwrite &H00
1wwrite 1w_vccoperation 'VCC Operation keeps device active!!

Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte

1wreset 'reset the device
'Write to locations beginning at 00 08
1wwrite 1w_skiprom 'Skip ROM
1wwrite 1w_writemem 'Write Memory
1wwrite &H08 'Write to 00 08
1wwrite &H00


' Set up Channel A for 16 bit resolution
1wwrite &H00 '16 bit resoultion
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte
' 5.12 Volt range
1wwrite &H00 '5.12 Volt Range
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte

' Set up Channel B for 16 bit resolution
1wwrite &H00 '16 bit resoultion
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte
' 5.12 Volt range
1wwrite &H01 '5.12 Volt Range
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte
' Set up Channel C for 16 bit resolution
1wwrite &H00 '16 bit resoultion
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte
' 5.12 Volt range
1wwrite &H01 '5.12 Volt Range
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte

' Set up Channel D for 16 bit resolution
1wwrite &H00 '16 bit resoultion
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte
' 5.12 Volt range
1wwrite &H01 '5.12 Volt Range
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1)

'( Set up Channel C for output 1
1wwrite &HC0 'Output Open/Output OFF C0 is OFF 80 is ON
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte
' 5.12 Volt range
1wwrite &H00 'Doesn't matter space keeper
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte

' Set up Channel D for output 0
1wwrite &HC0 'Output Open/Output OFF
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1) 'read dummy byte
' 5.12 Volt range
1wwrite &H00 'Doesn't matter space keeper
Crc_get 'Read in 2 bytes 16bits
Crc_dummy = 1wread(1)
')

'************************************************* ******************************
'------------------ D S 2 4 5 0 ---------------------
1wreset 'reset the device

1wwrite 1w_skiprom '&HCC Skip ROM
1wwrite 1w_convertch '&H3C Begin Conversion
1wwrite &H0F 'Convert Mask 0000|DCBA ie 0F=0000|1111
1wwrite &H00 '0 'Preset Mask Set=D Clear=d DdCcBbAa ie 55=0101|0101

Crc_get 'Read in 2 bytes 16bits
Waitms 6 'use formula to calculate exact duration for channels

1wreset 'reset the device
1wwrite 1w_skiprom 'Skip ROM
1wwrite 1w_readmem 'Read Memory
1wwrite &H00 'Read Channel A
1wwrite &H00 'Address 0000 and 0001

For I_x = 1 To 4

Lowbyte(i_x) = 1wread(1)
Highbyte(i_x) = 1wread(1)

Waitms 5

Adval_adc1 = Makeint(lowbyte(1) , Highbyte(1)) 'PSG 500
Adval_adc2 = Makeint(lowbyte(2) , Highbyte(2)) 'CDG 45
Adval_adc3 = Makeint(lowbyte(3) , Highbyte(3)) 'PCG 400
Adval_adc4 = Makeint(lowbyte(4) , Highbyte(4))
'Print Adval_adc1 ; Spc(3) ; Adval_adc2 'IKR

Next





Leider gibt es den AD nicht in Dip Version, nur in SMD.

Gruß MAT

Besserwessi
10.01.2012, 20:38
Das 1-Wire interface hat man mehr bei Sensoren. Für so etwas wie ADC und DACs sind mehr SPI oder I2C (= TWI) üblich. Da hat man dann relativ viel Auswahl.

martin66119
11.01.2012, 05:39
Hallo mat-sche,

vielen Dnak für deine Hilfe. Wenn ich es aber ein A/D-Wandler. Ich suche einen D/A-Wandler. Trotzdem ist die von dir hier einegestelle Info mit dem Code sehr sehr hilfreich.

Danke
Martin

mat-sche
11.01.2012, 08:48
ok, dann habe ich Deinen Beitrag nicht richtig gelesen. Schau mal im I-Net, ob es nicht einen D/A Wandler in der DS-Reihe gibt.

canis
05.05.2020, 10:51
Also ich suhe einen 1-wire D/A Wandler (10 bit oder 12) am besten mit mehreren Kanälen. Wenn es keinen mit mehreren Kanälen gibt, dann halt mit einem.


Auch wenn das hier schon etwas älter ist, bin ich gerade auf derselben Suche hier gelandet. Ich verwende allerdings nicht Bascom, sondern Arduino zur Software-Entwicklung. Da der DS2450 relativ teuer ist (auf eBay nicht unter 8€) werde ich einen ATTiny85 verwenden. Der hat 4 10-Bit A/D-Wandler. Für Arduino gibt es fertige 1-Wire-Libraries.

Ich kann nur jedem raten ein bisschen C/C++ zu lernen und das Arduino-System zu verwenden, mitdem man auch den ATTiny85 programmieren kann. https://create.arduino.cc/projecthub/arjun/programming-attiny85-with-arduino-uno-afb829

wkrug
05.05.2020, 16:07
Nur mal ne Frage:
Warum nimmst Du keinen XMEGA?
Diese Controller Serie hat D/A Wandler und können mit BASCOM geproggt werden.