Bonjour,
Je travaille sur un projet avec un ADC 16 bits ADS8344 de chez Texas Instruments. J'ai un gain de 2 qui apparaît entre la valeur numérique attendue et la valeur numérique lue par le microcontrôleur, et qui ne semble pas être documenté dans la datasheet.
Données :
- Vcc = 5V
- Vref = 4,096V (Référence de tension MCP1541-4.096)
- Mesure en Single ended avec COM relié au plan de masse.
- quantum = Vref/65536 = 62,5µV.
- La routine de lecture de l'ADC se contente de retourner la valeur brute sur un terminal.
Les tensions analogiques d'entrée proviennent d'amplificateurs d'instrumentation INA128 qui ont un gain de 500 (501 en réalité) avec une résistance Rg de 100 ohm 1%. Leur tension de référence est fixée à 1,024V par la référence de tension ISL21010-1.024. Les capteurs sont des jauges de contraintes.
Mesures au voltmètre et oscilloscope :
- Vcc est bien 5V et stable
- Vref de l'ADC est 4,095V, pas de bruit
- Vref INA128 est à 1,023V, pas de bruit
- La tension d'entrée des voies analogiques est comprise entre 1,02V et 1,03V (capteurs en "repos" donc Vout ~Vref)
Calculs :
Donnée = Vanalogique/q
La valeur numérique attendue est donc de l'ordre de grandeur de Vref(INA128)/q, soit 1,024/(62.5e-6) = 16384
Or la valeur numérique lue par le microcontrôleur est le double. Si je fais varier la mesure du capteur, j'arrive bien à balayer la plage 0 - 65535 donc ce n'est pas le MSB qui est bloqué à '1'.
J'utilise le mode de transmission 24 fronts d'horloge (illustré Figure 3 page 12) et j'ignore le LSB qui est normalement transmis au "start" suivant.
Voici ma routine de lecture :
Merci.Code:INT32 ADS8344_read(UINT8 channel, UINT8 acquisitionMode, UINT8 powerMode, UINT16*adcResult) { UINT8 configRegister[2]; UINT8 timeout = 0; UINT8 dataRead[2]; UINT16 readValue = 0; char str[32]; // Set "Configuration register" configRegister[0] = 0x80 | channel | acquisitionMode | powerMode; // Select SPI device ADC_CS = 0; // Start conversion SPI3_transfer(&configRegister[0], NULL, 1); // Deselect SPI device ADC_CS = 1; __delay_us(1); while(ADC_BUSY != 1 && timeout < ADC_TIMEOUT) { timeout++; __delay_us(1); } if(timeout >= ADC_TIMEOUT) return -1; else { // Select SPI device ADC_CS = 0; // Acquire data SPI3_transfer(NULL, &dataRead[0], 2); // Convert read bytes into 16-bit result readValue = (((UINT16)dataRead[0] << 9) | (UINT16)dataRead[1] << 1); // ignore LSB *adcResult = readValue; // Send value on debug terminal sprintf(str, "ADC read : %u\r\n", readValue); UART1_writeString(str); } // Deselect SPI device ADC_CS = 1; return 0; }
-----