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


von Michael H. (h_m)


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)


Lesenswert?

Timing beachten! Clock- und Load-Impulse dürften zu kurz sein.

von Michael H. (h_m)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.