
【毕设】USB功率测试仪
简介
USB功率测试器,可测试目前几乎所有协议的快充,短时最高功率160W,长时间最大功率120W
简介:USB功率测试器,可测试目前几乎所有协议的快充,短时最高功率160W,长时间最大功率120W开源协议
:GPL 3.0
描述
1.题目要求
使用单片机设计一款功率测试仪,外观不限,要求可显示电压、电流、功率,且输入最大功率100W以上。不得抄袭,不得使用成品模块。
2.题目分析
题目要求设计一款功率测试仪,我选择设计一款使用USB接口的可测试手机快充的功率计,具有一定便携性。
3.设计方案

4.原理图设计说明
4.1 降压电路
降压部分为MCU、INA220、OLED屏等提供3.3V电源,由于整个系统消耗的电流最大不会超过60mA,低负载下普通的DC-DC变换器效率较低,所以最好选择带burst、skip、pfm等轻载节能功能的芯片,这里用的是立创商城买的RY9320AT6,上/下管内阻100/50mΩ,频率500k,正常工作是PSM模式,轻载进入PFM模式。而且一片只要1块5,性价比超高。
实测5V供电时只需要从VUBS获取9mA电流,而在大部分快充的9-12V区间只需要4mA左右电流,大大降低了测量误差。


4.2 电压电流采样
INA220电源添加一颗去耦电容。A0、A1接地设置地址。


4.3 接口部分
A口使用5PIN定制接口,用于测试小米、OPPO的快充以及QC等使用普通A口的快充,Type-C接口主要用于测试PD快充。
这种A口实际上是把USB3.0的GND脚复用成了私有协议的识别脚,并且VBUS和GND加宽。理论上直接用USB3.0接口也能识别,但USB3.0接口过不了太大电流有风险。母座立创商城就有,公头立创商城的一直没货,从淘宝买的。Type-C直接立创商城找个大电流的就行,注意不要用只有6PIN的那种“大电流”,因为少一对VBUS和GND。


4.4 快充诱骗
本设计带有简单的QC快充诱骗功能,可以当简易调压电源用。QC2.0、QC3.0协议需要0、0.6V、3.3V三个电压,可以直接使用IO口模拟实现。QC2.0支持5V、9V、12V、20V四个档位,其中20V档位只有极少数支持QC2.0 ClassB的充电头才支持,这也是后面演示视频中无法诱骗QC2.0 20V的原因。QC3.0支持以200mV为步长进行连续调压,可输出4.4-20V。大部分30W以上的小米的快充头QC3.0都能支持到20V,这是为了给自家无线充电器供电。


4.5 串口下载
串口下载使用CH340K,使用RTS与DTR实现一键下载。
其实CH340K不要也行,调试的时候从板子上飞三根线下来接到CH340模块上,调试完再把飞线移除。


4.6 主控
主控使用stm32g030f6p6,体积小,性能较高。大概是目前stm32里最便宜的一款了,淘宝只要2-3块,凑个红包可能就一两块。g030系列可能是因为使用了更先进工艺,一块晶圆能切出更多的die,性能更强的同时甚至比f030系列还便宜。


4.7 OLED屏
屏幕的原理图直接按照驱动芯片ssd1315的datasheet推荐设计来画。



4.8 eeprom
用于存储记录到的电压电流、曲线,用不到这个功能可以不加。

PCB设计说明
PCB使用四层板,四层板拥有更强的抗干扰能力,而且可以降低布线难度。
VBUS开窗挂锡以增大载流。采样电阻布线使用开尔文接法。OLED屏放在另一块板上,与主板通过FFC排线连接。


使用立创EDA专业版设计了3D打印外壳。但快递到的前一天我这里突发疫情快递进不来了,所以后面的实物展示里并没有外壳。等疫情过去后在补上


软件说明
IDE使用STM32CubeIDE,固件库使用HAL库,初始化代码使用STM32CubeMX生成。全部代码在附件里,基本都有注释,有疑问可以在评论区里问我
多级菜单
key_table table[30]=
{
{0,0,0,1,(*fun0)}, //第0层,显示主界面
{1,4,2,5,(*fun1)}, //第一层,显示【亮度设置】、快充诱骗、数据记录、返回
{2,1,3,6,(*fun2)}, //第一层,显示亮度设置、【快充诱骗】、数据记录、返回
{3,2,4,9,(*fun3)}, //第一层,显示亮度设置、快充诱骗、【数据记录】、返回
{4,3,1,0,(*fun4)}, //第一层,显示亮度设置、快充诱骗、数据记录、【返回】
{5,5,5,1,(*fun5)}, //第二层,亮度设置
{6,8,7,10,(*fun6)},//第二层,快充诱骗层下显示【QC 2.0】、QC3.0、返回
{7,6,8,11,(*fun7)}, //第二层,快充诱骗层下显示QC 2.0、【QC3.0】、返回
{8,7,6,2,(*fun8)}, //第二层,快充诱骗层下显示QC 2.0 、QC3.0、【返回】
{9,9,9,3,(*fun9)}, //第二层,数据记录
{10,10,10,6,(*fun10)}, //第三层,快充诱骗QC 2.0
{11,11,11,7,(*fun11)},//第三层,快充诱骗QC 3.0
};
主函数循环
while (1)
{
OLED_Refresh();//刷新显存
if(time_1s_ok)
{
time_1s_ok=0;
voltage = INA220_GetVoltage();
current = INA220_GetCurrent();
power = INA220_GetPower();
energy_temp = energy_temp + power*0.00027777;
energy = energy_temp;
if(power!=0&&mem_addr_base<0xE00)
{
HAL_I2C_Mem_Write(&hi2c1,0xA0,mem_addr_base,I2C_MEMADD_SIZE_16BIT,(u8*)ina220_data,4,100);
mem_addr_base=mem_addr_base+4;
}
}
/*******************find index****************************/
if((key_enter==1)||(key_up==1)||(key_down==1))
{
if(key_up==1)
{
func_index=table[func_index].up; //up
key_up=0;
}
if(key_down==1)
{
func_index=table[func_index].down; //down
key_down=0;
}
if(key_enter==1)
{
OLED_Clear();
func_index=table[func_index].enter; //enter
key_enter=0;
}
}
if(key_back==1)
{
key_back=0;
if(oled_on==1)
oled_on=0;
else
oled_on=1;
}
current_operation_index=table[func_index].current_operation;
(*current_operation_index)();//执行当前操作函数
HAL_Delay(10);
}
}
OLED屏使用硬件I2C驱动,直接调用HAL库中的HAL_I2C_Mem_Write()即可实现大量显存的连续写入。
该函数原本是用于读写eeprom的,但其它需要写入两个地址的应用同样可以使用。
//刷新显存
void OLED_Refresh(void)
{
u8 i;
for(i=0;i<8;i++)
{
OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址
OLED_WR_Byte(0x00,OLED_CMD); //设置低列起始地址
OLED_WR_Byte(0x10,OLED_CMD); //设置高列起始地址
HAL_I2C_Mem_Write(&hi2c2,OLED_ADDRESS,0x40,I2C_MEMADD_SIZE_8BIT,&OLED_GRAM[i][0],128,100);
//写入显存
}
}
INA220的读写由于也要写入两个地址,所以同样可以直接使用HAL_I2C_Mem_R/W()函数读写,这样就不用另外花时间去实现。
但由于INA220中的寄存器是16位的,该函数只能读写u8,所以要手动把两个u8合成一个u16。
//INA220初始化
void INA220_Init(void)
{
u8 CFG[2] = {0x27,0xff}; //配置寄存器0x21D7
u8 CAL[2] = {0x20,0x00}; //校准寄存器0x5000,1ma/bit
HAL_I2C_Mem_Write(&hi2c1,INA220_ADDR,CFG_REG,I2C_MEMADD_SIZE_8BIT,&CFG[0],2,100);//设置配置寄存器
HAL_I2C_Mem_Write(&hi2c1,INA220_ADDR,CAL_REG,I2C_MEMADD_SIZE_8BIT,&CAL[0],2,100);//设置校准寄存器
}
实物展示说明
由于疫情打印的外壳进不来,这里用多的屏幕的板子当的下盖,上盖用了个以前打的黑色PCB保护屏幕。



主板正面。

主板背面。


注意事项
第一次使用STM32G0芯片要谨防变砖!!
因为G0的启动方式默认不是由boot0引脚决定的,而是由内部nboot0 bit寄存器决定的,其默认值是1,如果到手直接往里烧一段程序就没法从System memory启动了。要先使用STM32CubeProgrammer将Option bytes-User Configuration中nBOOT_SEL的勾去掉。
这有点类似AVR单片机的配置熔丝。

其它附件上传
除功率检测和快充诱骗,还提供了屏幕亮度调整和简单的电压、电流曲线记录的功能。


选型指南
电压电流采样部分。INA220和INA226都可以直接用,电路不用改,226是16位的精度更高。淘宝220比226便宜一半左右,12位也差不多够用了,配合5mΩ采样电阻正好能测到8A。采样电阻是C723507,0.5%精度的,换成其它1%的问题应该也不大。ina220电流最大量程的公式是40mV/(R)mΩ。
MCU用的STM32G030F6P6,用这个主要是便宜,淘宝两三块。缺点就是第一次用的时候别忘了先配置下寄存器,防止变砖;还有因为比较新,串口烧录只能用STM32CubeProgrammer,一键烧录废一半,2.9版本还有bug,得用2.8;更建议直接用SWD往里烧。
串口部分建议直接不要,直接空着,原因如上,如果需要串口下载或printf调试直接从预留的烧录焊盘飞线。
接口部分。USB-A母座用的是立创商城C708966;公头是淘宝锐欣买的4毛一个,但要6块运费,可以多买点,母座也可以同一家店买,这样就都是绿色的了。USB-C是C963413。
OLED屏,注意要选SSD1315的新款,宽24.7,ssd1306的要大一圈,和外壳不匹配。
ESD二极管,要不要都行。
EEPROM,是记录曲线用的,做的也有点简陋,用不到可以直接不要。
降压部分,我用的立创商城的RY9320,实测效率很高,如果要换成其它的,最好选个带轻载节能的,否则效率会极低。输入电容注意耐压;而且材质要是X5R或X7R,因为其它材质比如Y5V当直流偏置电压接近耐压时,它的容量可能就只剩十分之一了。
整个设计的成本还是比较低的,如果你那已经有常用的阻容,不算运费差不多20块左右就能拿下,淘宝整个能测这么高功率且支持小米OPPO协议的就贵不少了。
演示视频
从左往右第一个按键是选择键;第二三个是上、下键;最后一个是附加功能键,在主界面可以临时开/关显示,防止长时间测量造成OLED屏幕烧屏,在数据记录界面可以切换电压、电流、功率。
视频1是使用红米note10pro测试的65W充电,这是我功率最高的设备了。测120W充电应该也是没问题的,毕竟电流和65W一样是6A。但往后出的160W充电因为电流增加到了8A,虽然这个测试器是能测到8A的,但A口是6A的,C口是5A的,估计短时间测测还行,时间长了可能发热。
视频2是快充诱骗的演示,同时输出接到了万用表上来对比精度,万用表已经使用REF5010电压基准校准过了。可以看到电压测量的精度还是相当可以的。
视频3是电流精度的演示,把10Ω的铝壳电阻和万用表串联,二者测到的电流基本是一致的,由于万用表测量内阻的存在,电流偏低。
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










