这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第1期-功率检测与控制系统DIY】-过程贴3-INA219

共2条 1/1 1 跳转至

【Let'sdo第1期-功率检测与控制系统DIY】-过程贴3-INA219

菜鸟
2025-05-21 12:55:33     打赏

本次完成INA219的电压电流及功率检测。

首先完成硬件连接:

OLED连接不变,增加INA219模块和电源。本次使用的是两节18650锂电池供电,可随时替换12V直流电源。本次只做了原始数据的显示,未进行滤波。

一、硬件设计:

课件中使用继电器,手上没有继电器,本次使用L298N驱动电机。具体连接方式如下:

image.png

1、L298N介绍

L298N是双路H桥电机驱动。

供电范围:5~35V,

驱动电流:2A

驱动控制输入与电机状态如下表:

image.png

IN1和IN2可控制正反转,还可输入PWM,控制电机转速。

L298N内部具有线性稳压器,可输出5V电压,给单片机、OLED供电。

本次连接方式如上图:电源接入到INA219电源输入端,INA219输出端接L298N供电端。L298N通过内部线性稳压器提供5V电压,给单片机及OLED等所有5V负载供电(图上IIC上没特意标出来)。

2、INA219连接:

INA219通信方式为IIC协议,与OLED相似。但OLED只接收信息,STM32的GPIO只需设置为输出模式。INA219发送信息,通信过程中,需要修改GPIO的模式。

本次使用PC2(SCL)和PC3(SDA)做为模拟IIC接口。

二、软件设计

1、STM32CubeMX配置:

在上次基础上增加PC2和PC3配置,其他不变。

image.png

2、MDK编程:

(1)复制提供的INA219文件到工程文件夹下,并在工程管理中添加文件夹及文件。

image.png

(2)代码移植修改:

头文件  ina219.h中 PC2和PC3作为模拟IIC接口的宏定义。

#define IIC_SCL_L  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2, GPIO_PIN_RESET)//SCL
#define IIC_SCL_H  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2, GPIO_PIN_SET)
#define IIC_SDA_L  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3, GPIO_PIN_RESET)//SDA
#define IIC_SDA_H  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3, GPIO_PIN_SET)
#define IIC_SDA_READ()  HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_3)

源文件ina219.c中初始化,需要改变2点,1、GPIO的移植,2、由标准库转换为HAL库

void INA_IIC_INIT(void)		//IIC初始化
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	__HAL_RCC_GPIOC_CLK_ENABLE();
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);

	 /*Configure GPIO pins : PC2 PC3 */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
//	 GPIO_InitTypeDef  GPIO_InitStructure;
//  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOF时钟
//  //GPIOF9,F10初始化设置
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;//LED0和LED1对应IO口
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
//  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
//  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
//  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//	
//	GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9);//GPIOF9,F10设置高,灯灭
}

//SDA配置为输出
void INA_IIC_SDA_OUT(void)	
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	__HAL_RCC_GPIOC_CLK_ENABLE();
	 /*Configure GPIO pins : PC3 */
  GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
//	GPIO_InitTypeDef  GPIO_InitStructure;
//  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOF时钟
//  //GPIOF9,F10初始化设置
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//LED0和LED1对应IO口
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
//  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
//  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
//  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
	
}

//SDA配置为输入
void INA_IIC_SDA_IN(void)	
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	__HAL_RCC_GPIOC_CLK_ENABLE();
	 /*Configure GPIO pins : PC3 */
  GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
//	GPIO_InitTypeDef  GPIO_InitStructure;

//  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOC时钟
// 
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100M
//  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
//  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOC13
	
}

主函数main.c中,完成数据的采集及显示

包含头文件

#include "ina219.h"

声明全局变量

uint32_t Voltage_MV1=0;
uint8_t  Current_MA1=0;
uint32_t Power_MW1=0;

main()函数中初始化INA219

	INA_Init();

while(1)循环中采集并显示数据

                Voltage_MV1 = INA_GET_Voltage_MV();
		Current_MA1 = INA_GET_Current_MA();
		Power_MW1 = INA_GET_Power_MW();	
		
		OLED_ShowNum(48,16,Voltage_MV1,5,16);
		OLED_ShowNum(48,32,Current_MA1,5,16);
		OLED_ShowNum(48,48,Power_MW1,5,16);

三、下载,功能演示,

image.png

image.png

检测到电压、电流和功率。

电压检测跟万用表检测到的电压一致。

此次没有做滤波算法,而且和可能屏幕刷新有延迟,检测到的电压和电流相乘,跟功率不相等。

后期做滤波之后再看看。

不知道接线哪里有问题,第一天还好好的,第二天STM32 检测不到芯片了。换了一个原来买的一模一样的板子继续测试,又可以了。看来手工接线需要注意了。




关键词: 控制系统     INA219    

菜鸟
2025-05-21 15:38:38     打赏
2楼

刚刚发现,电压和电流单位反了。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]