- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: 1-Wire D/A-Wandler

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109

    1-Wire D/A-Wandler

    Anzeige

    Praxistest und DIY Projekte
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    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.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Da würde ich dann auf PWM oder ein (3) elektronische Potentiometer setzen. Diese dann einfach als Spannungsteiler schalten.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    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

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    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:
    Code:
    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

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.12.2006
    Beiträge
    109
    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

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    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.

  10. #10
    Zitat Zitat von martin66119 Beitrag anzeigen
    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...ino-uno-afb829

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. 2-wire 3-wire protokoll. Hilfe!
    Von schlaflos im Forum Assembler-Programmierung
    Antworten: 3
    Letzter Beitrag: 18.01.2008, 14:53
  2. Wie funktioniert ein 1-Wire bus?
    Von Gerko im Forum Assembler-Programmierung
    Antworten: 12
    Letzter Beitrag: 21.10.2007, 15:00
  3. Hilfe bei 1 Wire Bus bzw. I2C bus
    Von Fabi007 im Forum C - Programmierung (GCC u.a.)
    Antworten: 10
    Letzter Beitrag: 23.07.2007, 17:06
  4. Frage zu 1-Wire
    Von Razer im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 21.06.2006, 20:56
  5. One Wire / 1 Wire mit PIC ?
    Von DHigh im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 24.08.2005, 21:22

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests