前言
想要制作一个USB测功率的仪器,首先,需要了解需要什么传感器,然后根据自身的需求,来判断是否需要制作PCB板,在网络上寻求相关资料,以达到最终实现的目的,本次项目的难点主要为PCB的设计和代码的编写,需要了解相关知识,才能顺利的制作出USB测功率仪器。
在这里我们MCU使用的是stm32g030f6p6,该芯片只能使用HAL库,不能使用标准库,所以可以直接上STM32CubeIDE来生成接口代码就行。
硬件
输出电流/电压/功率监控器
想要制作一个测功率相关的仪器,必须有一个芯片(传感器),能够让我们的MCU读取这个传感器的内容,那么现在我们就需要介绍一下这个传感器:INA220。

我们逐一对它的引脚作用进行解析:
1.地址可以通过A1、A0进行配置:
INA220 的 I2C 地址是 7 位格式。
地址的高 5 位是固定的:1000 0。
地址的低 2 位由引脚 A0 和 A1 的连接决定,这些引脚可以通过硬件连接到 GND 或 VCC 来配置。
我呢,就将A0和A1接地啦,节省一两个引脚,所以我的INA220的地址就是: 1000 000。
2.NC是一个空内部,无需连接外部器件。
3.SDA、SCL是I2C的通信引脚,需要接入到STM32的GPIO口上,但要注意别忘了加上拉电阻。
4.Vs是INA220的供电引脚,INA220可以由3V~5.5V的电源进行供电。
5.GND是接地的引脚。
6.VBUS是接入需要测量的电压的总线上。
7.IN+ 和 IN- 是 INA220 的差分输入引脚,用来连接电流检测电阻(即分流电阻,通常称为 Shunt Resistor)的两端。
IN-:负差分分流电压。连接到分流电阻器的负侧。
IN+:正差分分流电压。连接到分流电阻器的正侧。
INA220 通过测量 IN+ 和 IN- 之间的电压差(即分流电阻上的电压降)来计算电流。
电流公式:
I = V_shunt / R_shunt
其中:
I 是经过分流电阻的电流。
V_shunt 是 IN+ 和 IN- 之间的电压差。
R_shunt 是分流电阻的阻值,这里我的电阻的阻值是5mΩ。

有了这些信息,我们就可以进行代码的编写了,INA220 的总线电压(Bus Voltage)寄存器,是存储着总线电压的毫伏值,我们可以进行读取计算:
读取总线电压
u16 INA220_GetVoltage(void)
{
u16 temp=0;
u8 buffer[2] = {0,0};
HAL_I2C_Mem_Read(&hi2c1,INA220_ADDR,BV_REG,I2C_MEMADD_SIZE_8BIT,&buffer[0],2,100);
temp = buffer[0]<<8|buffer[1];//读取到的两个8位二进制数合成一个16位二进制数
temp >>= 3; //右移三位对齐数据
temp *= 4; //计算出毫伏电压
return temp;
}
读取 INA220 的总线电压(Bus Voltage)寄存器是16位,所以temp的类型是u16.
总线电压寄存器的最低 3 位(D2-D0)未使用,为 0,所以temp要右移 3 位,将有效数据对齐,使得 temp 的最低位对齐。
总线电压寄存器的每位表示 4 mV,所以temp需要乘以4。
通过上述函数,我们可以计算出总线电压的毫伏值。
电路保护二极管
ESD二极管(Electrostatic Discharge Diode),也称为静电保护二极管,其主要作用是:
保护电路免受静电放电(ESD)的损害。在USB接口的热插拔过程中,容易产生高电压的静电放电,这可能会损坏敏感的电子元器件,尤其是USB数据线(D+、D-)和串口芯片(如CH340K)的输入/输出引脚。
吸收并泄放ESD电流。当电路受到ESD冲击时,ESD二极管能够迅速导通,将过电压和过电流引导至地(GND),从而保护后级电路。
QC诱骗
USB功率测试还有一个绕不开的话题,那就是QC诱骗,什么是QC诱骗?
QC诱骗,即Quick Charge(快速充电)协议诱骗,是指利用特定的电路或代码模拟设备与充电器之间的通信,使充电器输出高于标准USB电压(5V)的电压,如9V、12V等。其原理是通过在USB接口的D+和D-数据线上施加特定的电压水平,诱导支持QC协议的充电器调整输出电压。
在制作USB功率测试器或其他需要模拟QC协议的设备时,通过诱骗充电器输出不同的电压,测试设备在不同电压下的性能。
利用STM32的GPIO引脚,设置特定的电压水平,实现与QC2.0和QC3.0协议兼容的通信,控制充电器输出电压。
工作原理:
QC2.0:通过特定的电压组合,一次性请求充电器输出指定的电压。
QC3.0:通过在D+或D-线上发送脉冲,逐步增加或减少输出电压。