Forum: Mikrocontroller und Digitale Elektronik MCP4922: 600mV Offset


von da1l6 (Gast)


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?

von Purzel H. (hacky)


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.

von SonicHazard (Gast)


Lesenswert?

Ist ein Lastwiderstand von 5k am Ausgang gegen GND vorhanden?

von Michael L. (michaelx)


Lesenswert?

da1l6 schrieb:
> Der Aufbau ist aktuell auf einem Breadboard.
> 100nF Kondi ist an Vcc. AVss liegt auf GND (0V).

Hast du nur die Verdrahtung kontrolliert, oder auch nachgemessen, ob das 
Potential am AVss-Pin selbst 0V ist?

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.