STM32 – Bibliothekensammlung

MCP3424 .c/.h (ADC)

------------------------------------------------------------------
mcp3424.h:
------------------------------------------------------------------

#ifndef MCP3424_H
#define MCP3424_H

#include "stm32h7xx_hal.h"

typedef struct {
    I2C_HandleTypeDef *hi2c;
    uint8_t address; // 0x68 - 0x6F je nach ADR0/ADR1
} MCP3424_HandleTypeDef;

typedef enum {
    MCP3424_CHANNEL_1 = 0,
    MCP3424_CHANNEL_2,
    MCP3424_CHANNEL_3,
    MCP3424_CHANNEL_4
} MCP3424_Channel;

typedef enum {
    MCP342X_GAIN_1 = 0,
    MCP342X_GAIN_2,
    MCP342X_GAIN_4,
    MCP342X_GAIN_8
} MCP342X_Gain;

typedef enum {
    MCP342X_12BIT = 0,
    MCP342X_14BIT,
    MCP342X_16BIT,
    MCP342X_18BIT
} MCP342X_Resolution;

HAL_StatusTypeDef MCP3424_ReadChannel(MCP3424_HandleTypeDef *hmcp, MCP3424_Channel ch, MCP342X_Resolution res, MCP342X_Gain gain, int32_t *value);

#endif // MCP3424_H

------------------------------------------------------------------
mcp3424.c:
------------------------------------------------------------------
#include "mcp3424.h"

HAL_StatusTypeDef MCP3424_ReadChannel(MCP3424_HandleTypeDef *hmcp, MCP3424_Channel ch, MCP342X_Resolution res, MCP342X_Gain gain, int32_t *value) {
    if (value == NULL || ch > 3 || res > 3 || gain > 3) return HAL_ERROR;

    uint8_t config = 0x80 | (ch << 5) | (res << 2) | gain;
    uint8_t read_len = (res == MCP342X_18BIT) ? 4 : 3;

    HAL_StatusTypeDef ret = HAL_I2C_Master_Transmit(hmcp->hi2c, hmcp->address << 1, &config, 1, HAL_MAX_DELAY);
    if (ret != HAL_OK) return ret;

    HAL_Delay(5); // Warte auf Messung – je nach Auflösung evtl. länger

    uint8_t buffer[4] = {0};
    ret = HAL_I2C_Master_Receive(hmcp->hi2c, hmcp->address << 1, buffer, read_len, HAL_MAX_DELAY);
    if (ret != HAL_OK) return ret;

    int32_t raw = 0;
    if (res == MCP342X_18BIT) {
        raw = ((int32_t)(buffer[0]) << 16) | ((int32_t)(buffer[1]) << 8) | buffer[2];
        if (raw & 0x20000) raw |= 0xFFFC0000; // sign extension
    } else {
        raw = ((int32_t)(buffer[0]) << 8) | buffer[1];
        raw >>= (6 - 2 * res); // adjust to signed
        if (raw & (1 << (res * 2 + 5))) raw |= ~((1 << (res * 2 + 6)) - 1); // sign extend
    }

    *value = raw;
    return HAL_OK;
}

------------------------------------------------------------------
Anwendungsbeispiel:
------------------------------------------------------------------
...
extern I2C_HandleTypeDef hi2c1;

void Test_MCP3424(void) {
    MCP3424_HandleTypeDef adc = {
        .hi2c = &hi2c1,
        .address = 0x68 // je nach ADR-Pins
    };

    int32_t raw;
    if (MCP3424_ReadChannel(&adc, MCP3424_CHANNEL_1, MCP342X_16BIT, MCP342X_GAIN_1, &raw) == HAL_OK) {
        // Umwandlung in Spannung: z.B. bei 16-bit → ±2048 Codes = ±2.048 V
        float voltage = ((float)raw) * 2.048f / 32768.0f;
    }
}
...

Tags:

Comments

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Search


Categories


Recent Posts


Tags