本次完成INA219的电压电流及功率检测。
首先完成硬件连接:
OLED连接不变,增加INA219模块和电源。本次使用的是两节18650锂电池供电,可随时替换12V直流电源。本次只做了原始数据的显示,未进行滤波。
一、硬件设计:
课件中使用继电器,手上没有继电器,本次使用L298N驱动电机。具体连接方式如下:
1、L298N介绍
L298N是双路H桥电机驱动。
供电范围:5~35V,
驱动电流:2A
驱动控制输入与电机状态如下表:
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配置,其他不变。
2、MDK编程:
(1)复制提供的INA219文件到工程文件夹下,并在工程管理中添加文件夹及文件。
(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);
三、下载,功能演示,
检测到电压、电流和功率。
电压检测跟万用表检测到的电压一致。
此次没有做滤波算法,而且和可能屏幕刷新有延迟,检测到的电压和电流相乘,跟功率不相等。
后期做滤波之后再看看。
不知道接线哪里有问题,第一天还好好的,第二天STM32 检测不到芯片了。换了一个原来买的一模一样的板子继续测试,又可以了。看来手工接线需要注意了。