Forum: Mikrocontroller und Digitale Elektronik LTC1257 Ansteuern D/A Wandler ?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael H. (h_m)


Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

Ich versuche für den Anfang mit unten aufgeführten Code ein D/A Wandler 
(LTC1257 12 bit) anzusteuern (0-10V ausgeben), allerdings funktioniert 
das nicht zu 100% so richtig.


ich habe
1
uint16_t data = 0x0fff;
 als variable mit der ich bis zu 12bit an den Wandler senden will.


Jetzt ist es so, wenn ich 0x0fff sende gibt er mir 10V aus und bei 
0x0000 natürlich 0V, will ich aber jetzt irgendeinen belibigen Wert 
dazwischen annehmen zb. die Hälfte von (12bit 4095) 0x0800 fällt er mir 
nicht wie gewüscht auf 5V sondern auf 0V

Was kann ich denn da machen das er es richtig ausgibt ?

1
/*
2
 * LTC1257_2.c
3
 *
4
 * Created: 23.02.2019 17:06:43
5
 * Author : USER
6
 */ 
7
8
/* soft_serial_01.c ATmega88 @ 16MHz */
9
10
#define F_CPU 16000000UL
11
#include <avr/io.h>
12
13
void soft_serial (uint16_t data)         // Funktion soft_serial
14
{
15
  for (uint8_t i=0; i<=11; i++)     // for-Schleife 8 mal ausführen
16
  {
17
    if (data & 1)                   // Wenn data an Stelle 0 = 1
18
    PORTD |= (1<<PD0);            // Data serial = 1
19
    else
20
    PORTD &= ~(1<<PD0);           // Data serial = 0
21
    
22
    PORTD |= (1<<PD1);                // PD1 = 1 (CLK = low)
23
    PORTD &= ~(1<<PD1);               // PD1 = 0 (CLK = high)
24
    
25
    data = data >> 1;             // data um 1 Stelle nach rechts schieben
26
  }
27
}
28
29
int main(void)
30
{
31
  uint16_t data = 0x0800;              // data = Variable für Register 0x0FF1
32
  DDRD = 0xFF;                        // Richtungsregister PORTD = Ausgang
33
  PORTD = 0x04;                       // PD2 (RCK) = HIGH, 0x04 = 0000 0100
34
  
35
  while(1)
36
  {
37
    soft_serial(data);              // Funktionsaufruf und Übergabe von data
38
    PORTD &= ~(1<<PD2);               // PD2 = 0 (Takt = LOW für RCK)
39
    PORTD |= (1<<PD2);                // PD2 = 1 (Takt = HIGH für RCK -> Ausgabe Schieberegister)
40
  }
41
}

von Mario M. (thelonging)


Bewertung
0 lesenswert
nicht lesenswert
Timing beachten! Clock- und Load-Impulse dürften zu kurz sein.

von Michael H. (h_m)


Bewertung
0 lesenswert
nicht lesenswert
Ich muss jetzt einfach Fragen, wie löse ich das Timing Problem jetzt am 
einfachsten, mit einem delay?

ist das so gemeint
1
PORTD |= (1<<PD1);                // PD1 = 1 (CLK = low)
2
_delay_ms(15); 
3
PORTD &= ~(1<<PD1);               // PD1 = 0 (CLK = high)



denn, wenn ich das so mache ändert sich auch nichts

von Mario M. (thelonging)


Bewertung
0 lesenswert
nicht lesenswert
Je nach Optimierungsstufe geht es vielleicht auch ohne, aber mach mal 
zum Probieren nach jeden Portzugriff ein _delay_us(1).
BTW: Du gibst die Bits in der falschen Reihenfolge aus. Der LTC erwartet 
das MSB zuerst.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.