[Numérique] piloter un ADC ADS8691 avec STM32G431
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

piloter un ADC ADS8691 avec STM32G431



  1. #1
    davidif

    piloter un ADC ADS8691 avec STM32G431


    ------

    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 :

    Code:
    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);
    }
    #define CMD_WRITE_REGISTER 0x40000000


    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é :

    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;
    }
    ce n'est pas encore ça,mais les valeurs sont beaucoup plus stable .

    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 ?...

    -----
    Images attachées Images attachées
    Dernière modification par davidif ; 14/06/2025 à 20h30.

  2. #2
    davidif

    Re : piloter un ADC ADS8691 avec STM32G431

    Voici les mesures et conversion
    Nom : mesure.jpg
Affichages : 61
Taille : 49,1 Ko

    mais avant , j'aimerai bien valider mes données registre
    Dernière modification par davidif ; 14/06/2025 à 20h44.

Discussions similaires

  1. [Analogique] Protection d'I/O du STM32G431
    Par davidif dans le forum Électronique
    Réponses: 11
    Dernier message: 07/03/2025, 19h24
  2. [Energie] Piloter un PMOS avec un NPN
    Par barbachose dans le forum Électronique
    Réponses: 14
    Dernier message: 07/03/2017, 04h09
  3. piloter une LED de puissance avec arduino avec transistor bipolaire
    Par invitec0bc361b dans le forum Électronique
    Réponses: 7
    Dernier message: 31/05/2015, 15h43
  4. Piloter une led Infrarouge avec un PIC
    Par invite71524902 dans le forum Électronique
    Réponses: 21
    Dernier message: 16/10/2012, 12h48
  5. piloter un moteur avec un pic
    Par invite210e4233 dans le forum Électronique
    Réponses: 12
    Dernier message: 10/07/2012, 11h07
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...