2025 Make Blocks阶段2 - 电流检测模块的设计
该项目使用了INA213,实现了电流检测的设计,它的主要功能为:电流检测(模拟输出)。
标签
电流检测
MakeBlocks
INA213
你豪吗
更新2025-10-15
7
KiCad文件
全屏

项目介绍

本次活动选择了设计一款电流检测模块,具有模拟输出功能,使用了TI的INA213A

INA21x 为电压输出、分流监控器(也称作电流检测放大器)。该器件通常可针对系统优化提供过流保护和精密电流测量,还常用于闭环反馈电路。该系列器件可感测分流电阻在 –0.3V 至 26V 共模电压范围内的压降,与电源电压无关。共有六种固定增益可供选择:50V/V、75V/V、100V/V、200V/V、500V/V 或 1000V/V。零漂移架构的低偏移使得该器件能够在分流器上的最大压降低至 10mV(满量程)的情况下进行电流感应。

设计思路

根据题目要求“搭配必要模拟信号处理电路,能够由基于RP2040的MCU核心板自带ADC进行采集要求感知电流最大5A”,对电流采集方式就有限制,第一种搭建运放电路进行采集,第二种使用ADC信号输出的芯片,我选择了第二种方式,在TI官网中的模拟电流检测放大器中选择了INA213A这个芯片,它是增益50V/V这一档的,在选择电阻的时候需要注意电阻的功率,如果采样电阻是0.01R的话,那么功率就至少得是P = (5A)² × 0.01Ω = 25 × 0.01 = 0.25W。enmmm,当时画PCB的时候咋算成了至少得25W,预留了一个金属大电阻的位置(哭笑)

图片.png

模块介绍

图片.png

图片-1.png

hhhhh,在写第二章的时候发现对于0.01R电阻通过5A的电流只需要0.25W,当时以为需要25W,所以在下面预留了一个这么大电阻的位置,那如果去掉这个的话,PCB的尺寸就会更小一点。

代码介绍

import uos
import sys
import time
import framebuf
import test.st7789 as st7789
from test.fonts import vga2_8x8 as font1
from test.fonts import vga1_16x32 as font2
from utime import sleep_ms
from machine import Pin, SPI, ADC

# 初始化屏幕和缓冲区
st7789_res = 0
st7789_dc = 1
disp_width = 240
disp_height = 240
CENTER_Y = int(disp_width/2)
CENTER_X = int(disp_height/2)
spi_sck=Pin(2)
spi_tx=Pin(3)
spi0=SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)

display = st7789.ST7789(spi0, disp_width, disp_width,
reset=machine.Pin(st7789_res, machine.Pin.OUT),
dc=machine.Pin(st7789_dc, machine.Pin.OUT),
xstart=0, ystart=0, rotation=0)
buffer = bytearray(disp_width * disp_height * 2)
fb = framebuf.FrameBuffer(buffer, disp_width, disp_height, framebuf.RGB565)

# 设置固定字体
display.fill(st7789.BLACK)
display.text(font2, "2025 MakeBlocks", 0, 10)
display.text(font1, "Current detection module", 35, 50)
display.text(font2, "ADC Raw: ", 0, 75)
display.text(font2, "Current: ", 0, 105)

# 创建 ADC 对象,连接到 GPIO26 (ADC0)
adc = ADC(Pin(26))

# 滤波参数设置
FILTER_SIZE = 10 # 移动平均窗口大小,可根据需要调整
adc_values = [] # 存储最近的ADC读数

def get_filtered_adc():
"""读取ADC值并应用移动平均滤波"""
global adc_values

# 读取原始ADC
raw_value = adc.read_u16()

# 添加到缓冲区
adc_values.append(raw_value)

# 保持缓冲区大小不超过滤波窗口
if len(adc_values) > FILTER_SIZE:
adc_values.pop(0) # 移除最旧的值

# 计算平均值作为滤波结果
return sum(adc_values) // len(adc_values)

# 初始填充滤波器缓冲区
for _ in range(FILTER_SIZE):
get_filtered_adc()
time.sleep(0.01) # 短暂延迟,避免快速连续读取

# 打印初始滤波后的ADC
initial_filtered = get_filtered_adc()
print("Initial Filtered ADC Value:", initial_filtered)

while True:
# 获取滤波后的ADC
filtered_raw = get_filtered_adc()

# 将滤波后的值转换为电压 (假设参考电压为 3.3V)
voltage = (filtered_raw / 65535) * 3.3 # 单位:伏特 (V)
I_in = voltage*50 / 0.01

# 在屏幕上显示结果
# 先清除之前的数值显示区域
display.fill_rect(125, 75, 100, 32, st7789.BLACK)
display.fill_rect(125, 105, 100, 32, st7789.BLACK)
# 显示新数值
display.text(font2, str(filtered_raw), 125, 75)
display.text(font2, f"{I_in:.2f}", 125, 105)

# 打印滤波后的结果
print(f"Filtered ADC: {filtered_raw}, Voltage: {voltage:.3f}V")
print(f"I:{I_in:.2f}mA")

# 等待 1
time.sleep(1)

功能展示

图片.png

图片.png

总结心得

本次项目设计并实现了一款基于TI电流检测放大器INA213A的电流检测模块,结合RP2040微控制器完成模拟信号采集、数据处理与可视化显示

附件下载
INA21x.zip
main.py
团队介绍
个人玩家
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号