DAC TLV5618 läuft nicht bis Maximum

OP #2884416
Lesenswert?

Hallo,

ich betreibe den TLV5618 von TI, ein DAC mit 12 Bit und 2 Kanälen, 
Ansteuerung über SPI.
Er läuft auch ganz passabel, zwei Dinge stören mich jedoch:
a) wenn ich folgendes mache
1
int i = 0;
2
  while(1)
3
  {
4
    i ++;
5
    senddata(i);
6
  if (i >= 4095) i = 0;
7
  }

müsste ich einfach einen Sägezahn zwischen 0 und 5V haben, sofern Vref 
5V (ich habe einfach Vcc und Vref verbunden, GND gibts ja sowieso nur 
einen) sind. Allerdings erreicht der Sägezahn bei (c.a.) 2543 schon 5V 
und bleibt dann auf diesem Wert, um dann bei 4095 wieder auf 0 zu gehen.

b) Die Dauer, die ein Wert konstant bleibt, ist 11,1µS bei -O3 (sagt 
mein Oszi). Das könnte kürzer sein, oder? (Atmega läuft mit nem Quarz 
von 18,432 MHz, d.h. ein Vorgang dauert 206 Clockcycles)

Hier meine Funktionen:
1
uint16_t setup;
2

3
void DACinit(void)
4
{
5
  ADSTART_DDR |= (1<<ADSTART_PIN); //ADSTART ist CS
6
  ADCLK_DDR |= (1<<ADCLK_PIN);
7
  ADSIG_DDR |= (1<<ADSIG_PIN);
8

9
  ADSTART_PORT |= (1<<ADSTART_PIN);
10
  ADCLK_PORT &= ~(1<<ADCLK_PIN);
11
  ADSIG_PORT &= ~(1<<ADSIG_PIN);
12

13
  setup = 0b1100000000000000; //verwende DAC A, Fastmode ON
14
}
15

16
void DACsend(uint16_t data)
17
{
18
  ADSTART_PORT &= ~(1<<ADSTART_PIN);
19
    
20
  for(int i = 0; i < 16; i++)
21
  {
22
    ADSIG_PORT &= ~(1<<ADSIG_PIN);
23
    if(data&0b1000000000000000)
24
  {
25
    ADSIG_PORT |= (1<<ADSIG_PIN);
26
    }
27
    ADCLK_PORT &= ~(1<<ADCLK_PIN);
28
  data <<= 1;
29
  ADCLK_PORT |= (1<<ADCLK_PIN);
30
  }
31

32
  ADSTART_PORT |= (1<<ADSTART_PIN);
33
}
34

35
void senddata(uint16_t data)
36
{
37
  DACsend(data + setup);
38
}

Jemand ne Idee, wie das schneller ginge und/oder das Problem mit 2543 
statt 4095 zu lösen ist?

Grüße
   Nikolas

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren