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,预留了一个金属大电阻的位置(哭笑)

模块介绍


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)
功能展示


总结心得
本次项目设计并实现了一款基于TI电流检测放大器INA213A的电流检测模块,结合RP2040微控制器完成模拟信号采集、数据处理与可视化显示
附件下载
INA21x.zip
main.py
团队介绍
个人玩家
评论
0 / 100
查看更多
猜你喜欢
2025 Make Blocks阶段1 - 电流检测模块的设计该项目使用了INA213,实现了电流检测的设计,它的主要功能为:电流检测(模拟输出)。
你豪吗
89
2025 Make Blocks阶段1 - 进行电流检测模块设计该项目使用了MCS1806GS,实现了电流检测模块的设计,它的主要功能为:5A电流采集。
Bymyself
59
2025 Make Blocks阶段1 电流检测模块设计该项目使用了KiCad软件,实现了5A高精度电流检测模块的设计,它的主要功能为:模块能够精确测量最大5A的直流电流,并将其线性转换为0-3.3V的模拟电压信号输出,可直接被树莓派RP2040、Arduino、ESP32等主流微控制器(MCU)的模数转换器(ADC)采集。
7Lnanoda
150