Forum: Mikrocontroller und Digitale Elektronik MCP4922: 600mV Offset


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.