Dein Warenkorb ist gerade leer!
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:

Schreibe einen Kommentar