Bonjour je viens vers vous a savoir si quelqu'un pourrai m'apporter son aide sur une difficulté que je traverse et pour le coup me bloque.
je galère comme un dingue avec l'ADS8691 et serait grandement reconnaissant de l'aide de quelqu'un qui aurait déjà expérimenté la bête !!!....
je l'utilise en bipolaire + et - 10Vdc donc configuré comme tel, enfin je crois ?!...
ce convertisseur fonctionne avec des trames de 32 Bit, j'utilise donc la pile SPI généré par l'IDE (MX) de ST, en 8bit.
j'initialise donc :
#define CMD_WRITE_REGISTER 0x40000000Code:void ADS8691_Init(uint8_t adc_num) { // 1. Plage d’entrée : Bipolaire ±10.24V 0x0001 dans le registre 0x14 ADS8691_WriteRegister(adc_num, REG_INPUT_RANGE, RANGE_BIPOLAR_10V24); // 2. Référence interne activée en permanence 0x0003 dans le registre 0x3C ADS8691_WriteRegister(adc_num, REG_REF_CTRL, REF_INTERNAL_ALWAYS_ON); // 3. Configuration ligne SDI : mode normal 0x000 dans le registre 0x3E ADS8691_WriteRegister(adc_num, REG_SDI_CTRL, SDI_DEFAULT); // 4. Configuration ligne SDO : toujours activée 0x000 dans le registre 0x3F ADS8691_WriteRegister(adc_num, REG_SDO_CTRL, SDO_DEFAULT); } void ADS8691_WriteRegister(uint8_t adc_num, uint8_t reg, uint16_t value) { uint32_t cmd = CMD_WRITE_REGISTER | ((reg & 0x3F) << 16) | (value & 0xFFFF); uint8_t tx[4] = { (cmd >> 24) & 0xFF, (cmd >> 16) & 0xFF, (cmd >> 8) & 0xFF, (cmd >> 0) & 0xFF }; GPIO_TypeDef* sync_port = (adc_num == 1) ? ADC1_SYNC_GPIO_Port : ADC2_SYNC_GPIO_Port; uint16_t sync_pin = (adc_num == 1) ? ADC1_SYNC_Pin : ADC2_SYNC_Pin; sync_port->BSRR = (uint32_t)sync_pin << 16; // SYNC LOW HAL_SPI_Transmit(&hspi2, tx, 4, HAL_MAX_DELAY); sync_port->BSRR = sync_pin; // SYNC HIGH HAL_Delay(1); }
J'ai donc commencé à testé les conversions et celle-ci vont bien de + 10V à -10Vdc mais j'ai une linéarité toute bizarre avec des valeurs pas très stables.
au début quand j'étais proche de +/-0VDC en entrée j'affichai +/-10Vdc puis diminuait lorsque mes tensions d'entrées augmentaient ?...
Aussi en visualisant mes graphes à l'oscilo, ils étaient pas très beau en préscaler de 1 ... trop rapide avec les imperfection du circuit, impédances et autres ... pourtant les pistes sont pas très longues dans la mesure ou la carte est déjà très petite (55/40 mm)
Je suis donc passer à 128 de prescaler sur une fréquence du MCU à 24Mhz
avec ma fonction de lecture corrigé :
ce n'est pas encore ça,mais les valeurs sont beaucoup plus stable .Code:float ADS8691_ReadVoltageFast(uint8_t adc_num, float offset_correction) { GPIO_TypeDef* sync_port; uint16_t sync_pin; if (adc_num == 1) { sync_port = ADC1_SYNC_GPIO_Port; sync_pin = ADC1_SYNC_Pin; } else { sync_port = ADC2_SYNC_GPIO_Port; sync_pin = ADC2_SYNC_Pin; } uint8_t tx_buf[4] = {0x00, 0x00, 0x00, 0x00}; // NOP uint8_t rx_buf[4] = {0}; // SYNC LOW sync_port->BSRR = (uint32_t)sync_pin << 16; HAL_SPI_TransmitReceive(&hspi2, tx_buf, rx_buf, 4, HAL_MAX_DELAY); // SYNC HIGH sync_port->BSRR = sync_pin; uint32_t raw = ((uint32_t)rx_buf[0] << 24) | ((uint32_t)rx_buf[1] << 16) | ((uint32_t)rx_buf[2] << 8) | ((uint32_t)rx_buf[3]); // Sign-extended 18-bit value extraction int32_t code = ((int32_t)(raw << 2)) >> 14; float voltage = code * 0.000078125f; return voltage + offset_correction; }
J'ai donc cherché à vérifier l'écriture des registres fait initialement mais je n'arrive pas à lire les données.
Je vos à oscilo les commandes partir clk, sdi, sdo, sync qui me paraissent correctes mais là ou je devrais avoir les données des registre sur les 2 dernier octet de la trame de 32Bit je n'ai rien ?...
Evidemment j'ai vérifier le registre dédier au gamme de tension 0x14 mais aussi l'ID en 0x00, mais d'autres ... donc je ne paviens pas à avoir les données ... je sais donc pas si il sont bien paramétré
Je vois bien que l'ADS8691 réagi dans la mesure ou il répond en SDO avec la même données relatif au registre interroger en SDI ?...
-----