关于USB电流计的设计

设计目的

设计该电流计是为了以后调试板子的时候能在通电的,第一时间里知道流过板子的电流大小,确保当板子内部有短路时能够第一时间知道。

设计原理

该电路板所实现的功能是对电流和电压的实时监测,电压监测采用最简单的电阻串联分压,电流检测使用市面上流行的集成芯片INA226。

设计材料

经过原理分析得出大致所需材料,

单片机采用stm32f103c8t6,有点大材小用了;

单片机供电电源3.3v,使用HT7533稳压芯片;

两个分压电阻10k和1k;

电流监测芯片INA226;

电流监测电阻根据INA226的分压寄存器算出允许的最大电流根据实际需要,选择检测电阻0.01欧姆;

两个usb-A口;

显示使用I2C通信的OLED屏。

设计电路原理图

根据刚才分析的材料,配置外围电路;具体电路可以参考芯片手册;

设计PCB

这里有个地方需要注意:

这里检测电阻的阻值十分的小只有0.01欧姆,所以连接电阻的导线尽可能的粗一点和短一点,就是VOUT和VIN之间的导线尽可能的短,并且尽量不要打孔;(本人就因为之前的导线电阻问题,导线电阻经过测量达到了0.05欧姆,造成误差,可以在程序设计中补偿)。

程序编写

这里的current代表电流值由0.01和0.05电阻,由ina226电流检测的原理得知,ina226是将检测电阻两端的电压值进行处理,所以我们可以直接读取ina226寄存器的值再除以6,在实验中得知除以5也可以。

int main(void )
{
	uint16_t a[10];
	uint16_t sum=0;
	uint16_t CAL;
	uint16_t aver;
	uint16_t data;
	uint16_t shunt;
	uint16_t current;
	uint16_t power;
	uint8_t ACK,ACK1;
	uint16_t vol;
	uint8_t i;
	uint16_t temp1,temp2,temp3,temp4;
	OLED_Init();
	Delay_ms (100);
	AD_Init();
	
	ACK=INA226_WRITEBYTE(0x4127,0X00);
//	ACK1=INA226_WRITEBYTE(0X0A00,0X05);
	ACK1=INA226_WRITEBYTE(0X0D55 ,0X05);
	CAL=INA226_READBYTE(0X05);
//	ACK=INA226_WRITEBYTE(0x0A00,0X05);
//	data=INA226_READBYTE(0x05);
	shunt=INA226_READBYTE(0x01);
	current=INA226_READBYTE(0x04);
	power=INA226_READBYTE(0x03);
//	vol=Get_Value();
//	OLED_ShowNum(3,1, shunt , 8);
	OLED_ShowNum(4,1, CAL , 8);
	while(1)
	{
		
		data=INA226_READBYTE(0x05);
		shunt=INA226_READBYTE(0x01);
		current=(INA226_READBYTE(0x04))/5;
		power=INA226_READBYTE(0x03);
//		vol=Get_Value();
		
		
		Delay_ms (10);
		sum=0;
		for(i=0;i<10;i++)
		{
			a[i]=Get_Value();
			Delay_ms (5);
			sum=sum+a[i];
//			OLED_ShowNum(3,1, Get_Value() , 8);
//			OLED_ShowNum(1,1, sum , 8);
		}
		aver=sum/10;
//		OLED_ShowNum(2,1, aver , 8);
		vol=(aver*3300)/4096;
		OLED_ShowNum(1,1, vol , 8);
		OLED_ShowNum(2,1, current , 8);
		OLED_ShowNum(3,1, shunt , 8);//shuntµÄ·Ö±æÂÊÊÇ2.5uv
//		vol=aver*11*13*1000/4096;
//		temp1=vol/1000;
//		temp2=vol/100%10;
//		temp3=vol/10%100%10;
//		temp4=vol%10;
//		OLED_ShowNum(1,1, temp1 , 1);
//		OLED_ShowChar(1, 2, '.');
//		OLED_ShowNum(1,2, temp2 , 1);
//		OLED_ShowNum(1,3, temp3 , 1);
//		OLED_ShowNum(1, 4, temp4 , 1);
//		OLED_ShowString(1, 1,"hell0 world");
		
		
		
		
		
		
	}
		

具体的代码细节可以关注点赞收藏,之后私信我。

下一篇重点讲解ina226几个寄存器的用法
        
          
          

BOOM清单

No.QuantityCommentDesignatorFootprintValueManufacturer PartManufacturerSupplier PartSupplier
1410uFC1,C2,C3,C10C060310uF10uFSAMSUNG(三星)C15415LCSC
211uFC5C06031uF10uFSAMSUNG(三星)LCSC
330.1uFC6,C7,C11C06030.1uF10uFSAMSUNG(三星)LCSC
4222pFC8,C9C060322pF10uFSAMSUNG(三星)LCSC
51X5511FV-04-C70D30-1000H1HDR-TH_4P-P2.54-V-F-3X5511FV-04-C70D30-1000XKB Connectivity(中国星坤)C2684750LCSC
612.54-1*4P_JXP12.54-1*4P_TIGHT_JXC115245LCSC
710.01R2R25120.0125121WJ0101T4EUNI-ROYAL(厚声)LCSC
81100kΩR3R0603100kΩERJ3EKF1003VPANASONIC(松下)C189597LCSC
9310kΩR4,R5,R10R060310kΩSCR0603J10KVO(翔胜)C3017715LCSC
1044.7kΩR6,R7,R8,R9R06034.7kΩSCR0603J10KVO(翔胜)LCSC
111Key_SMD_6x6x6.5SW2SW-SMD_4P-L6.0-W6.0-P4.50-LS9.0-2
121STM32F103C8T6U1LQFP-48_L7.0-W7.0-P0.50-LS9.0-BLSTM32F103C8T6ST(意法半导体)C8734LCSC
131HT7533-3U2SOT-89_L4.5-W2.5-P1.50-LS4.2-BRHT7533-3HOLTEK(合泰/盛群)C66271LCSC
141INA226AIDGSRU3MSOP-10_L3.0-W3.0-P0.50-LS5.0-BLINA226AIDGSRTI(德州仪器)C49851LCSC
1512*p排针U42*p排针
161480370001USB1USB-A-TH_48037-0001480370001MOLEXC136455LCSC
171USB-302-TUSB2USB-A-TH_USB-302-TUSB-302-TSOFNG(硕方)C112456LCSC
1818MHzX2OSC-TH_L10.0-W4.5-P5.008MHzX49SD8MSD2SCYXC(扬兴晶振)C21263LCSC
### INA226AIDGSR通信协议 INA226AIDGSR采用I²C接口进行数据传输,支持标准模式(100 kbps)、快速模式(400 kbps)以及高速模式(3.4 Mbps)。该设备具有16个可编程的I²C地址位,允许在同一总线上连接多个相同类型的传感器而不发生冲突[^4]。 对于具体的命令交互流程: - **启动条件**:主机发送起始信号。 - **写入操作**: - 发送目标设备地址加上写标志位。 - 首先执行一次带有停止条件的假写过程,即只发出器件地址加写指令但不真正写入任何东西; - 然后再发起新的开始并切换成读状态, - 设备响应后返回请求的信息给主控端直到遇到NACK为止。 ```cpp // 示例代码展示如何通过IIC与INA226通讯 void readRegister(uint8_t regAddr, uint16_t *data){ IIC_Start(); // 开启IIC会话 IIC_Send_Byte(INA226_ADDRESS | WRITE); // 设置为写模式 IIC_Wait_Ack(); IIC_Send_Byte(regAddr); // 发送寄存器地址 IIC_Wait_Ack(); IIC_Start(); // 再次开启用于读取 IIC_Send_Byte(INA226_ADDRESS | READ); IIC_Wait_Ack(); *data = (uint16_t)(IIC_Read_Byte(NACK)); // 获取高字节 *data <<= 8; *data |= (uint16_t)(IIC_Read_Byte(ACK)); // 获取低字节 IIC_Stop(); // 结束IIC会话 } ``` 当面对通信失败的情况时,可能的原因包括但不限于硬件连线错误、上拉电阻缺失或设置不当、软件层面的波特率配置失误等。针对这些问题,建议采取如下措施加以排查和修复: - 检查物理层连接是否稳固可靠,确保SCL/SDA线路无短路现象且已正确接入上下拉电阻。 - 审核初始化函数中的参数设定,特别是关于频率的部分应匹配所使用的MCU性能规格。 - 利用逻辑分析仪或其他调试工具捕捉实时波形图样辅助定位故障源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值