使用STM32F103C8T6写一个INA3221_ReadCurrent()
时间: 2024-05-16 15:16:25 浏览: 87
INA3221是一款三路电流传感器,可以用来测量电流、电压和功率。下面是使用STM32F103C8T6读取INA3221电流的示例代码:
首先需要定义一些寄存器地址和常量:
```c
#define INA3221_ADDR 0x80 // INA3221的I2C地址
#define INA3221_REG_CONFIG 0x00 // 配置寄存器地址
#define INA3221_REG_SHUNT_VOLTAGE_1 0x01 // 通道1的电压测量寄存器地址
#define INA3221_REG_BUS_VOLTAGE_1 0x02 // 通道1的总线电压测量寄存器地址
#define INA3221_REG_SHUNT_VOLTAGE_2 0x03 // 通道2的电压测量寄存器地址
#define INA3221_REG_BUS_VOLTAGE_2 0x04 // 通道2的总线电压测量寄存器地址
#define INA3221_REG_SHUNT_VOLTAGE_3 0x05 // 通道3的电压测量寄存器地址
#define INA3221_REG_BUS_VOLTAGE_3 0x06 // 通道3的总线电压测量寄存器地址
#define INA3221_REG_MANUFACTURER_ID 0xFE // 制造商ID寄存器地址
#define INA3221_REG_DIE_ID 0xFF // 芯片ID寄存器地址
#define INA3221_CONFIG_MODE_2 0x0006 // INA3221的工作模式
```
然后定义一个函数来读取电流:
```c
float INA3221_ReadCurrent(I2C_HandleTypeDef *hi2c)
{
uint8_t buf[2];
float shunt_voltage, current;
// 设置INA3221的工作模式
buf[0] = INA3221_REG_CONFIG;
buf[1] = (INA3221_CONFIG_MODE_2 >> 8) & 0xFF;
HAL_I2C_Master_Transmit(hi2c, INA3221_ADDR, buf, 2, 100);
// 读取通道1的电压测量值和电阻值
buf[0] = INA3221_REG_SHUNT_VOLTAGE_1;
HAL_I2C_Master_Transmit(hi2c, INA3221_ADDR, &buf[0], 1, 100);
HAL_I2C_Master_Receive(hi2c, INA3221_ADDR, buf, 2, 100);
shunt_voltage = (float)((int16_t)((buf[0] << 8) | buf[1]));
// 计算电流
current = shunt_voltage / 40.96;
return current;
}
```
在这个函数中,首先设置了INA3221的工作模式为MODE_2。
然后读取通道1的电压测量值和电阻值,计算得到电流值。
注意,在使用这个函数之前需要初始化I2C总线,并将句柄传递给函数。此外,还需要在main函数中调用HAL_I2C_Init()函数来初始化I2C总线。
希望这个示例代码能够对你有所帮助。
阅读全文