GD32F407VE天空星开发板的电压电流检测
GD32F407VE天空星开发板的电压电流检测
引言
在嵌入式系统开发中,电压和电流的精确检测是至关重要的功能。无论是电池管理系统、电源监控,还是电机控制应用,都需要实时监测电路中的电压和电流参数。本文将详细介绍基于GD32F407微控制器的电压电流检测系统,涵盖硬件设计原理和软件实现方法。
一、电压检测系统
1.1 硬件工作原理
电压检测电路的核心设计目标是将可能的高电压、带噪声的外部输入信号转换为微控制器ADC能够安全读取的稳定信号。
电路组成与功能
- 电压分压器:由150kΩ和10kΩ电阻组成,实现16:1的电压衰减
- 低通滤波器:RC滤波器消除高频噪声干扰
- 过压保护:钳位二极管防止ADC引脚损坏

技术参数计算
分压比计算:
ADC_V = IN_V × (R28 / (R27 + R28))= IN_V × (10kΩ / (150kΩ + 10kΩ))= IN_V × (10 / 160)= IN_V / 16
测量范围:
- ADC最大输入电压:3.3V
- 理论最大测量电压:3.3V × 16 = 52.8V
1.2 软件驱动实现
头文件定义
#ifndef __VOLTAGE_H__
#define __VOLTAGE_H__#include "gpio_cfg.h"/* 接线说明
交互板 GD32F407(压)ADC ===> PA33v3 ===> 3v3GND ===> GND
*/// 初始化
void Voltage_init();// 获取电压
float Voltage_get();#endif
核心实现代码
#include "bsp_voltage.h"
#include "ADC0.h"// 初始化
void Voltage_init() {printf("==Voltage_init==\n");
}// 获取电压
float Voltage_get() {uint16_t adc = ADC0_get(1); // 获取采样结果// 转换为电压float vol = adc * 3.3 / 4095;// ADC_V = IN_V / 16// 返回总的电压return vol * 16;
}
1.3 系统架构设计
电压检测模块采用分层架构设计:
- 硬件抽象层:直接操作ADC外设
- 驱动层:实现电压转换算法
- 应用层:提供简洁的API接口
二、电流检测系统
2.1 硬件工作原理
电流检测采用专业的电流检测放大器方案,具有高精度和隔离特性。
核心器件参数
- 电流检测放大器:TP181A1,固定增益50倍
- 采样电阻:100mΩ (0.1Ω)
- 参考电压:1.65V (3.3V/2)

数学模型推导
输出电压公式:
ADC_I = (I_LOAD × R_SHUNT) × GAIN + V_REF= (I × 0.1) × 50 + 1.65= 5 × I + 1.65
电流计算公式:
I = (ADC_I - 1.65) / 5
测量范围分析
- 零点电流:I = 0A时,ADC_I = 1.65V
- 最大电流:ADC_I = 3.3V时,I_max = 0.33A (330mA)
2.2 软件驱动实现
头文件定义
#ifndef __BSP_CURRENT_H__
#define __BSP_CURRENT_H__#include "gpio_cfg.h"// 初始化
void Current_init();// 获取电流
float Current_get();#endif
核心实现代码
#include "bsp_current.h"
#include "ADC0.h"// 初始化
void Current_init() {printf("==Current_init==\n");
}// 获取电流值
float Current_get() {uint16_t adc = ADC0_get(2); // 获取ADC采样值// 转换为电压float vol = adc * 3.3 / 4095;// 电流计算公式:I = (ADC_I - 1.65) / 5return (vol - 1.65) / 5;
}
三、系统集成与外部中断
3.1 外部中断配置
系统提供了完整的外部中断管理框架,支持16个外部中断线的灵活配置。
中断配置函数
static void EXTI_config(rcu_periph_enum rcu, uint32_t port, uint32_t pin, uint32_t pull_up_down, uint8_t exti_port, uint8_t exti_pin,exti_line_enum linex, exti_trig_type_enum trig_type,uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, uint8_t nvic_irq_sub_priority) {// 引脚初始化GPIO_input(rcu, port, pin, pull_up_down);// 系统配置时钟使能rcu_periph_clock_enable(RCU_SYSCFG);// 中断线配置syscfg_exti_line_config(exti_port, exti_pin);// EXTI初始化exti_init(linex, EXTI_INTERRUPT, trig_type);exti_interrupt_enable(linex);// NVIC配置nvic_irq_enable(nvic_irq, nvic_irq_pre_priority, nvic_irq_sub_priority);
}
中断服务例程
#if USE_EXTI_0
void EXTI0_IRQHandler() {if (SET == exti_interrupt_flag_get(EXTI_0)) {exti_interrupt_flag_clear(EXTI_0); // 中断标志清零EXTI0_on_trig(); // 用户定义的中断处理函数}
}
#endif
3.2 配置管理系统
通过配置文件实现灵活的引脚分配和中断优先级管理:
// EXTI_config.h
#if USE_EXTI_1#define EXTI1_RCU RCU_GPIOC#define EXTI1_PORT GPIOC #define EXTI1_PUPD GPIO_PUPD_PULLUP#define EXTI1_SOURCE_PORT EXTI_SOURCE_GPIOC#define EXTI1_TRIG_TYPE EXTI_TRIG_FALLING#define EXTI1_PRIORITY 1, 2
#endif
四、应用实例与最佳实践
4.1 系统初始化序列
void System_init() {// 初始化电压检测模块Voltage_init();// 初始化电流检测模块Current_init();// 配置外部中断EXTI_init();printf("电压电流检测系统初始化完成\n");
}
4.2 实时监测循环
void Monitoring_loop() {while(1) {float voltage = Voltage_get();float current = Current_get();float power = voltage * current;printf("电压: %.2fV, 电流: %.3fA, 功率: %.2fW\n", voltage, current, power);// 过压保护if(voltage > 50.0) {printf("警告:检测到过压!\n");// 执行保护动作}// 过流保护if(current > 0.3) {printf("警告:检测到过流!\n");// 执行保护动作}delay_ms(1000); // 1秒采样间隔}
}
五、设计要点与优化建议
5.1 精度优化策略
- 电阻选型:使用1%精度或更高精度的分压电阻
- 温度补偿:在宽温度范围应用中考虑电阻的温度系数
- ADC校准:定期进行ADC基准电压校准
- 数字滤波:在软件中实现移动平均滤波算法
5.2 软件滤波实现
#define FILTER_SIZE 10float Voltage_get_filtered() {static float buffer[FILTER_SIZE] = {0};static int index = 0;// 获取新采样值float new_sample = Voltage_get();// 更新缓冲区buffer[index] = new_sample;index = (index + 1) % FILTER_SIZE;// 计算移动平均值float sum = 0;for(int i = 0; i < FILTER_SIZE; i++) {sum += buffer[i];}return sum / FILTER_SIZE;
}
5.3 安全考虑
- 电气隔离:在高电压应用中考虑光耦隔离
- 软件看门狗:防止程序跑飞导致监测失效
- 数据校验:对关键数据进行CRC校验
- 故障恢复:实现自动复位和状态恢复机制
六、总结
- 高精度测量:电压测量范围0-52.8V,电流测量范围0-330mA
- 完善的保护机制:硬件过压保护和软件安全监测
- 灵活的配置:通过配置文件轻松适配不同应用场景
- 模块化设计:清晰的软件架构便于维护和扩展
