Post Go back to editing

LTC2622 strange issue.

Hello dear friends! I have a strange problem with DAC LTC2622. I have: microcontroller, LTC2622, LM4040-3.0 as 3V-reference for DAC. All working good except some situations:

1. When I load to DAC, for example, "1.8V", DAC displays "1.8V".

2. After this, If I load to DAC "0V", DAC displays "0V" - good work. (Video: https://youtu.be/Bc5JtQaE-YI)

BUT:

1. When I load to DAC voltage more than "1.9V" (for example, 2.8V), DAC displays this value (2.8V).

2. After this, If I load to DAC "0V", DAC displays some random value more than 1.9V, but not zero! Why it not reset to zero? (Video: https://youtu.be/dnlpj72F0kE)

And:

1. When I load to DAC voltage more than "1.9V" (for example, 2.8V), DAC displays this value (2.8V).

2. After this, If I load to DAC voltage more than 0.25V, DAC displays this value (more than 0.25V)! (https://youtu.be/hpUF4fzlK2A)

I think that problem is not in my code, because I've tried to send data to DAC manually (SO-delay-SCK1-delay-SCK0-delay-SO-delay-SCK1-delay-SCK0 ... e.t.c.) using diagram and timing from datasheet (24-bit and 32-bit data word).The result is similar. Oscilloscope also displays that SPI transieve a "zero" bits to data word if I load "0" to DAC.  My code is below. Please help!

sbit DAC_CS at GPIOA_ODR.B2;
sbit DAC_SCK at GPIOA_ODR.B3;
sbit DAC_SO at GPIOA_ODR.B4;


void DACOut(unsigned int DACCommand, unsigned int DACAdress, unsigned long DACVoltage) {

unsigned long TempData;
unsigned int DACData, i;

TempData             = (unsigned long)DACVoltage*4096/3000           ; // Convert Voltage (in mV) to DAC code.
DACData               = (unsigned int)TempData                                       ; // Convert Long to Int.

Delay_us(1);

DAC_CS                = 0                                                                                  ;  // CS 0

asm nop;
asm nop;

for (i=0; i<4; i++) {

if (DACCommand.B3 == 1) {
DAC_SO                = 1                       ;
} else {
DAC_SO                = 0                       ;
}

DAC_SCK               = 1                       ; // SCK UP
asm nop                                         ;
asm nop                                         ;
DAC_SCK               = 0                       ; // SCK down

DACCommand            = DACCommand<<1           ;
}

for (i=0; i<4; i++) {

if (DACAdress.B3 == 1) {
DAC_SO                = 1                       ;  // 1
} else {
DAC_SO                = 0                       ;  // 0
}

DAC_SCK               = 1                       ; // SCK UP
asm nop                                         ;
asm nop                                         ;
DAC_SCK               = 0                       ; // SCK down
DACAdress = DACAdress<<1;
}


for (i=0; i<16; i++) {

if (DACData.B11 == 1) {
DAC_SO                = 1                       ;  // 1
} else {
DAC_SO                = 0                       ;  // 0
}


DAC_SCK               = 1                       ; // SCK UP
asm nop                                         ;
asm nop                                         ;
DAC_SCK               = 0                       ; // SCK down

DACData               = DACData<<1              ;
}

DAC_CS                = 1                       ;  // CS 1
}



void main() {

GPIO_Init();

DAC_CS                = 1                       ; // CS 0

Delay_us(1);


while (1) {

DacOut(0b0011, 0b0000, 2800);


Delay_ms(1000);


DacOut(0b0011, 0b0000, 0);


Delay_ms(1000);

}

}

Parents Reply Children
No Data