一、专栏介绍
这篇博客为ROS小车专栏的第一篇,自己想要做一个ROS小车,同时通过CSDN平台记录我的制作过程,为后来者提供一些参考吧,恩我也是从零开始摸索,可能会有很多错误和问题,希望大家多多包涵。
二、本文内容
本文主要内容介绍如何通过STM32使用I2C接口通过INA219采集电池数据,主要包含功率、电压、电流等关键数据。
硬件是我自己设计的,我这边也会展示相应的硬件设计原理图,可以作为模块加入到自己的设计中,感兴趣的伙伴一起看下去吧!

三、硬件设计
硬件设计已经开源,文末会提供链接

硬件设计原理图(嘉立创)

PCB的3D图大概这个样子
这个硬件设计已经经过实际测试了,没啥毛病,有需要的朋友可以直接拿过去用,INA219有两种封装,使用嘉立创的图给大家展示一下:SOT-23-8、SOIC-8

这两种封装区别不大,我都试过差不多,个人根据自己的选择即可。
注意:A0\A1决定了INA219的地址,个人可以根据需求设计,手册上面很清晰
手册文末也会提供,直接减少搜索资料的麻烦


电源部分,我这里给到3.3V,因为一般都是配合单片机使用嘛,感觉3.3V也比较方便

四、代码部分
代码网上有很多,这部分怎么说呢基本都一个样,也没必要重复造轮子。软件I2C,根据手册去操作对应寄存机就好了。个人感觉有时候代码可以直接复制,修修改改也就熟悉了这部分的具体操作,CV工程师就是我了,哈哈哈哈。

//这个头文件名字无所谓,我是临时使用一个工程改的,就这个名字吧,自己用可以改一下
#include "bsp_i2c_gpio.h"
u8 ina219_busVolt_LSB_mV = 4; // Bus Voltage LSB value = 4mV
u8 ina219_shuntVolt_LSB_uV = 10; // Shunt Voltage LSB value = 10uV
unsigned short ina219_calValue = 0;
u32 ina219_current_LSB_uA;
u32 ina219_power_LSB_mW;
u8 ram_for_ina219[60];
u8 INA219process_flag;
#define Open 1
#define Close 0
void INA_SCL_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(INA219_I2C_GPIO_CLOCK, ENABLE);
/* Configure I2C1 pins: PB12->SCL->OUT */
GPIO_InitStructure.GPIO_Pin = INA219_I2C_SCL_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(INA219_I2C_PORT, &GPIO_InitStructure);
GPIO_SetBits(INA219_I2C_PORT, INA219_I2C_SCL_PIN);
}
void INA_SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(INA219_I2C_GPIO_CLOCK, ENABLE);
/* Configure I2C1 pins: PB14->SDA-OUT */
GPIO_InitStructure.GPIO_Pin = INA219_I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(INA219_I2C_PORT, &GPIO_InitStructure);
GPIO_SetBits(INA219_I2C_PORT, INA219_I2C_SDA_PIN);
}
void INA_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(INA219_I2C_GPIO_CLOCK, ENABLE);
/* Configure I2C1 pins: PB14->SDA-IN */
GPIO_InitStructure.GPIO_Pin = INA219_I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(INA219_I2C_PORT, &GPIO_InitStructure);
}
void INA_IIC_Start(void)
{
INA_SDA_OUT();
INA_SCL_OUT();
INA_SDA_SET;
INA_SCL_SET;
INA_SDA_CLR;
INA_SCL_CLR;
}
void INA_IIC_Stop(void)
{
INA_SDA_OUT();
INA_SDA_CLR;
INA_SCL_SET;
INA_SDA_SET;
}
void INA_IIC_Set_Ack(unsigned char ack)
{
INA_SDA_OUT();
if(ack)
{
INA_SDA_SET;
}
else
{
INA_SDA_CLR;
}
INA_SCL_SET;
INA_SCL_CLR;
}
unsigned char INA_IIC_Get_Ack(void)
{
unsigned char ack;
INA_SDA_IN();
INA_SDA_SET;
INA_SCL_SET;
if(INA_SDA_TST)
{
ack = 1;
}
else
{
ack = 0;
}
INA_SCL_CLR;
return(ack);
}
void INA_IIC_Write_8bits(unsigned char dat)
{
unsigned char i;
INA_SDA_OUT();
for(i = 8; i; i--)
{
if(dat & 0x80)
{
INA_SDA_SET;
}
else
{
INA_SDA_CLR;
}


5311

被折叠的 条评论
为什么被折叠?



