Commit 345005f0 authored by 957dd's avatar 957dd

软件iic可以正常读取了

parent cd8e0f93
No preview for this file type
...@@ -6,76 +6,15 @@ ...@@ -6,76 +6,15 @@
float currentLSB; float currentLSB;
// I2C 起始信号
void i2c_start_ina226() {
digitalWrite(sda_pin, HIGH);
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(sda_pin, LOW);
i2c_delay();
digitalWrite(scl_pin, LOW);
i2c_delay();
}
// I2C 停止信号
void i2c_stop_ina226() {
digitalWrite(sda_pin, LOW);
digitalWrite(scl_pin, LOW);
i2c_delay();
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(sda_pin, HIGH);
i2c_delay();
}
// I2C 发送一个字节
void i2c_write_byte_ina226(uint8_t data1) {
for (int i = 7; i >= 0; i--) {
digitalWrite(sda_pin, (data1 >> i) & 0x01);
i2c_delay();
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
i2c_delay();
}
// 接收 ACK
pinMode(sda_pin, INPUT);
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
pinMode(sda_pin, OUTPUT);
}
// I2C 读取一个字节
uint8_t i2c_read_byte_ina226(bool ack1) {
uint8_t data1 = 0;
pinMode(sda_pin, INPUT);
for (int i = 7; i >= 0; i--) {
digitalWrite(scl_pin, HIGH);
i2c_delay();
data1 |= (digitalRead(sda_pin) << i);
digitalWrite(scl_pin, LOW);
i2c_delay();
}
// 发送 ACK/NACK
pinMode(sda_pin, OUTPUT);
digitalWrite(sda_pin, ack1 ? LOW : HIGH);
digitalWrite(scl_pin, HIGH);
i2c_delay();
digitalWrite(scl_pin, LOW);
pinMode(sda_pin, INPUT);
return data1;
}
// 配置 INA226 // 配置 INA226
bool INA226_configure() { bool INA226_configure() {
uint16_t config = 0x4127; // 默认配置:16次平均,1.1ms 转换时间,连续模式 uint16_t config = 0x4127; // 默认配置:16次平均,1.1ms 转换时间,连续模式
i2c_start_ina226(); i2c_start();
i2c_write_byte_ina226(INA226_ADDRESS << 1); i2c_write_byte(INA226_ADDRESS << 1);
i2c_write_byte_ina226(INA226_REG_CONFIG); i2c_write_byte(INA226_REG_CONFIG);
i2c_write_byte_ina226(config >> 8); i2c_write_byte(config >> 8);
i2c_write_byte_ina226(config & 0xFF); i2c_write_byte(config & 0xFF);
i2c_stop_ina226(); i2c_stop();
return true; return true;
} }
...@@ -84,39 +23,39 @@ bool INA226_calibrate(float rShuntValue, float iMaxExpected) { ...@@ -84,39 +23,39 @@ bool INA226_calibrate(float rShuntValue, float iMaxExpected) {
currentLSB = iMaxExpected / 32767.0; // 电流 LSB currentLSB = iMaxExpected / 32767.0; // 电流 LSB
uint16_t calibrationValue = (uint16_t)(0.00512 / (currentLSB * rShuntValue)); uint16_t calibrationValue = (uint16_t)(0.00512 / (currentLSB * rShuntValue));
i2c_start_ina226(); i2c_start();
i2c_write_byte_ina226(INA226_ADDRESS << 1); i2c_write_byte(INA226_ADDRESS << 1);
i2c_write_byte_ina226(INA226_REG_CALIBRATION); i2c_write_byte(INA226_REG_CALIBRATION);
i2c_write_byte_ina226(calibrationValue >> 8); i2c_write_byte(calibrationValue >> 8);
i2c_write_byte_ina226(calibrationValue & 0xFF); i2c_write_byte(calibrationValue & 0xFF);
i2c_stop_ina226(); i2c_stop();
return true; return true;
} }
// 读取总线电压 // 读取总线电压
float INA226_readBusVoltage() { float INA226_readBusVoltage() {
i2c_start_ina226(); i2c_start();
i2c_write_byte_ina226(INA226_ADDRESS << 1); i2c_write_byte(INA226_ADDRESS << 1);
i2c_write_byte_ina226(INA226_REG_BUSVOLTAGE); i2c_write_byte(INA226_REG_BUSVOLTAGE);
i2c_start_ina226(); i2c_start();
i2c_write_byte_ina226((INA226_ADDRESS << 1) | 1); i2c_write_byte((INA226_ADDRESS << 1) | 1);
uint8_t high = i2c_read_byte_ina226(true); uint8_t high = i2c_read_byte(true);
uint8_t low = i2c_read_byte_ina226(false); uint8_t low = i2c_read_byte(false);
i2c_stop_ina226(); i2c_stop();
int16_t value = (high << 8) | low; int16_t value = (high << 8) | low;
return value * 0.00125f; // 每 LSB = 1.25mV return value * 0.00125f; // 每 LSB = 1.25mV
} }
// 读取电流 // 读取电流
float INA226_readCurrent() { float INA226_readCurrent() {
i2c_start_ina226(); i2c_start();
i2c_write_byte_ina226(INA226_ADDRESS << 1); i2c_write_byte(INA226_ADDRESS << 1);
i2c_write_byte_ina226(INA226_REG_CURRENT); i2c_write_byte(INA226_REG_CURRENT);
i2c_start_ina226(); i2c_start();
i2c_write_byte_ina226((INA226_ADDRESS << 1) | 1); i2c_write_byte((INA226_ADDRESS << 1) | 1);
uint8_t high = i2c_read_byte_ina226(true); uint8_t high = i2c_read_byte(true);
uint8_t low = i2c_read_byte_ina226(false); uint8_t low = i2c_read_byte(false);
i2c_stop_ina226(); i2c_stop();
int16_t value = (high << 8) | low; int16_t value = (high << 8) | low;
return value * currentLSB; return -value * currentLSB;
} }
...@@ -42,7 +42,7 @@ int main_start_error_return() { ...@@ -42,7 +42,7 @@ int main_start_error_return() {
my_zlog_warn("INA226初始化失败"); my_zlog_warn("INA226初始化失败");
} }
// 校准 INA226 // 校准 INA226
float rShuntValue = 0.1; // 分流电阻值(单位:欧姆) float rShuntValue = 0.01; // 分流电阻值(单位:欧姆)
float iMaxExpected = 5; // 最大预期电流(单位:安培) float iMaxExpected = 5; // 最大预期电流(单位:安培)
if(!INA226_calibrate(rShuntValue, iMaxExpected)){ if(!INA226_calibrate(rShuntValue, iMaxExpected)){
my_zlog_warn("INA226校准失败"); my_zlog_warn("INA226校准失败");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment