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