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?