MCP4922: 600mV Offset

Gast #4410307
Lesenswert?

Hallo zusammen.

Ich versuche einen MCP4922 DAC in Betrieb zu nehmen.
Er funktioniert auch, aber die Ausgangsspannung geht nie unter 0.6V, 
auch wenn ich einen Wert von 0 schreibe.
Nach oben hin wird VRef erreicht aber nach unten hin 0V nicht. Im 
Datenblatt steht aber, dass er bis 0.010V runter gehen müsste.

Der Aufbau ist aktuell auf einem Breadboard.
100nF Kondi ist an Vcc. AVss liegt auf GND (0V).
VrefA und VrefB sind verbunden und es liegen 1,2V als Referenz an (mit 
10µF nach GND).
Änderungen an Vref nach oben wirken sich aus wie erwartet, aber unter 
0,5V komme ich nichtmal mit Vref = GND = 0V


Test Code:
1
#define F_CPU 8000000
2

3
#include <avr/io.h>
4
#include <util/delay.h>
5

6
#define DAC_CS_PIN   (1 << 2)
7
#define DAC_SYNC_PIN (1 << 1)
8

9
#define DAC_OUTPUT_SECONDARY (1 << 7)
10
#define DAC_REF_BUFFERED     (1 << 6)
11
#define DAC_OUTPUT_GAIN1     (1 << 5)
12
#define DAC_OUTPUT_ON        (1 << 4)
13

14
static void DAC_Init(void){
15
    DDRB  |= (1 << 5)|(1 << 3)|DAC_CS_PIN|DAC_SYNC_PIN;
16
    PORTB |= DAC_CS_PIN|DAC_SYNC_PIN;
17
    SPCR = (1 << SPE)|(1 << MSTR)|(0 << CPOL)|(0 << CPHA);
18
}
19

20
static void DAC_Write(uint16_t a, uint16_t b){
21
    
22
    PORTB &= ~DAC_CS_PIN;
23
    
24
    SPSR = (1 << SPIF);
25
    SPDR = ((a >> 8) & 0x0F) | DAC_OUTPUT_GAIN1 | DAC_OUTPUT_ON | DAC_REF_BUFFERED;
26
    while (!(SPSR & (1 << SPIF)));
27
    
28
    SPDR = (a & 0xFF);
29
    while (!(SPSR & (1 << SPIF)));
30
    SPSR = (1 << SPIF);
31
    PORTB |=  DAC_CS_PIN;
32
    
33
    PORTB &= ~DAC_CS_PIN;
34
    
35
    SPDR = ((b >> 8) & 0x0F) | DAC_OUTPUT_SECONDARY | DAC_OUTPUT_GAIN1 | DAC_OUTPUT_ON | DAC_REF_BUFFERED;
36
    while (!(SPSR & (1 << SPIF)));
37
    SPSR = (1 << SPIF);
38

39
    SPDR = (b & 0xFF);
40
    while (!(SPSR & (1 << SPIF)));
41
    SPSR = (1 << SPIF);
42
    
43
    PORTB |=  DAC_CS_PIN;
44
    
45
}
46
static void DAC_Sync(void){
47
    PORTB &= ~DAC_SYNC_PIN;
48
    PORTB |=  DAC_SYNC_PIN;
49
}
50

51
int main(void){
52
    DAC_Init();
53
    
54
    uint16_t i = 0;
55
    while(1){
56
        DAC_Write(i, (1 << 12)- i);
57
        DAC_Sync();
58
        i++;
59
        i &= ((1 << 12)-1);
60
    }
61
    
62
}

Ideen?
#4410478
Lesenswert?

Der 4922 ist ein multiplizierender DAC. Es ist etwas unklar welche 
Speisung du verwendest. Und ich mag nicht nachschauen, ob du den Mal 2 
gain drin hast. Gib doch einfach mal die Werte 0.4095 raus, repetitiv, 
als Dreieck. Und zeig uns das Oszilloskopbild. Und das Schema, und ein 
Foto des Aufbaus.

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