STM32F103驱动MAX4080S:实现电流采集与实时监测
STM32F103驱动MAX4080S:实现电流采集与实时监测
一、简介
MAX4080 是一款高侧电流检测放大器,能够检测负载电流并把检测到的电流转换成与电流成正比的模拟电压输出。MAX4080 系列支持 76V 的共模输入范围,并提供 5V/V、20V/V 和 60V/V 三种增益版本。
本次测试使用的型号为:
MAX4080SASA
其中 S 版本对应 60V/V 增益。
MAX4080SASA 本身没有数字通信接口,STM32 不需要通过 I2C/SPI 与它通信,只需要使用 STM32 的 ADC 采集 MAX4080 的 OUT 模拟输出电压,然后根据采样电阻和芯片增益换算成实际电流。

二、MAX4080SASA简介
MAX4080 是高侧电流检测放大器,检测电阻 RSENSE 两端的压差:
VSENSE = RSENSE × ILOAD
MAX4080 的输出电压为:
VOUT = VSENSE × AV
因此:
VOUT = RSENSE × ILOAD × AV
对于 MAX4080SASA:
AV = 60V/V
所以:
VOUT = RSENSE × ILOAD × 60
反过来计算电流:
ILOAD = VOUT / (RSENSE × 60)
2.1 不同增益版本
| 型号后缀 | 增益 |
|---|---|
| MAX4080F | 5V/V |
| MAX4080T | 20V/V |
| MAX4080S | 60V/V |
MAX4080SASA 属于 S 版本,因此软件计算时使用:
MAX4080_GAIN = 60.0f;
2.2 最大检测压差
MAX4080 的最大检测输入电压与增益版本有关:
| 增益 | 最大 VSENSE |
|---|---|
| 5V/V | 1000mV |
| 20V/V | 250mV |
| 60V/V | 100mV |
我们收到优信电子的MAX4080S模块后 ,一般SENSE测量范围10mV-100mV。对应测量电流100mA-1A(Vsense/Rsense ,Rsense = 0.1R)。输出电压范围为0.6V-6V(Vsense*增益),已经超出了STM32的输入范围了,需要拿两个10k电阻分压获取电压值。
所以一定要根据实际模块上的采样电阻值计算好输出范围做好分压,防止烧坏板子。
三、MAX4080SASA模块接线
本文采用下面的接线方式。
| STM32F103C8T6 | MAX4080SASA模块 |
|---|---|
| 3.3V | VCC |
| GND | GND |
| PA0 / ADC1_IN0 | OUT做一半分压后的输出 |
| GND | GND |
串口测试使用 USART1:
| STM32F103C8T6 | USB-TTL |
|---|---|
| PA9 / USART1_TX | RX |
| PA10 / USART1_RX | TX |
| GND | GND |
四、硬件连接示意
基本连接关系如下:
被测电源
+ -
| |
| -------------------------------
| |
| MAX4080SASA模块 |
---- RS+ GND-+---- STM32 GND
|
| RSENSE
|
---- RS- ------------------ 负载+
|
|
负载-
|
|
GND
MAX4080 OUT ---------------- PA0 / ADC1_IN0
STM32 PA9 ------------------ USB-TTL RX
STM32 PA10 ----------------- USB-TTL TX
STM32 GND ------------------ USB-TTL GND
注意:负载检测回路地要和模块供电地共地
五、STM32 ADC采样原理
STM32F103C8T6 内部 ADC 为 12 位 ADC,因此:
ADC范围:0 ~ 4095
如果 ADC 参考电压按照 3.3V 计算:
VADC = ADC_Value × 3.3 / 4095
MAX4080 的 OUT 接到 PA0,因此:
VOUT = ADC_Value × 3.3 / 4095
再根据:
ILOAD = VOUT / (RSENSE × 60)
得到:
ILOAD =
ADC_Value × 3.3
-----------------------------
4095 × RSENSE × 60
程序中为了方便修改,使用宏定义,文章测试的模块使用的是 0.1Ω 采样电阻,就定义为:
#define MAX4080_GAIN 60.0f
#define MAX4080_RSENSE_OHM 0.10f
#define ADC_REFERENCE_VOLTAGE 3.300f
六、为什么一定要确认模块采样电阻
MAX4080SASA 的电流计算不仅与芯片增益有关,还与外部采样电阻有关。
例如同样是 60V/V:
采样电阻 10mΩ
1A → 0.01V × 60 = 0.6V
2A → 1.2V
3A → 1.8V
4A → 2.4V
5A → 3.0V
采样电阻 5mΩ
1A → 0.005V × 60 = 0.3V
5A → 1.5V
10A → 3.0V
所以,同一个 MAX4080SASA 芯片,如果模块的采样电阻不同,最终的电流量程也不同。
七、代码驱动
7.1 max4080.h
#ifndef __MAX4080_H
#define __MAX4080_H
#include "stm32f10x.h"
#define MAX4080_GAIN 60.0f //模块增益
#define MAX4080_RSENSE_OHM 0.10f //采样电阻
#define MAX4080_ADC_VREF 3.300f //adc电压范围
#define MAX4080_ADC_FULL_SCALE 4095.0f //adc范围
void MAX4080_Init(void);
uint16_t MAX4080_GetADC(void);
float MAX4080_GetVoltage(void);
float MAX4080_GetCurrent(void);
#endif
7.2 max4080.c
#include "max4080.h"
void MAX4080_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1));
}
uint16_t MAX4080_GetADC(void)
{
ADC_RegularChannelConfig(ADC1,
ADC_Channel_0,
1,
ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
float MAX4080_GetVoltage(void)
{
uint16_t adc_value;
adc_value = MAX4080_GetADC();
return ((float)adc_value *
MAX4080_ADC_VREF /
MAX4080_ADC_FULL_SCALE);
}
float MAX4080_GetCurrent(void)
{
float voltage;
voltage = MAX4080_GetVoltage();
return voltage /
(MAX4080_RSENSE_OHM * MAX4080_GAIN);
}
7.3 main.c
#include "stm32f10x.h"
#include "max4080.h"
#include "usart.h"
#include "delay.h"
#include <stdio.h>
int main(void)
{
float voltage;
float current;
SystemInit();
USART1_Init(115200);
MAX4080_Init();
printf("\r\n");
printf("====================================\r\n");
printf(" STM32F103C8T6 MAX4080SASA TEST\r\n");
printf(" Gain : %.1f V/V\r\n", MAX4080_GAIN);
printf(" Rsense : %.3f Ohm\r\n", MAX4080_RSENSE_OHM);
printf("====================================\r\n");
while (1)
{
voltage = MAX4080_GetVoltage();
current = voltage /
(MAX4080_RSENSE_OHM * MAX4080_GAIN);
printf("ADC=%4d VOUT=%.3f V Current=%.3f A\r\n",
MAX4080_GetADC(),
voltage,
current);
Delay_ms(500);
}
}
八、实际电流测试
测试使用电子负载进行测试。程序下载到 STM32F103C8T6 后,打开串口助手:
波特率:115200
数据位:8
停止位:1
校验位:None

由于采样电阻以及芯片测量存在误差,所以实际测量值也有误差,以下是0.1-1A的实际测量电流值,左边是串口输出,右边是万用表测得得电路实际电流。



九、总结
需要工程文件在评论区留言邮箱哦!
更多推荐



所有评论(0)