Commit cd8e0f93 authored by 957dd's avatar 957dd

INA226和ads1115分别用2个软件iic函数

parent c5a0df49
No preview for this file type
...@@ -9,6 +9,8 @@ bool SOFTiic_init(); ...@@ -9,6 +9,8 @@ bool SOFTiic_init();
// I2C 起始信号 // I2C 起始信号
void i2c_start(); void i2c_start();
void i2c_delay();
// I2C 停止信号 // I2C 停止信号
void i2c_stop(); void i2c_stop();
......
...@@ -89,7 +89,7 @@ void heartbeat_send() {//心跳发送格式*5/2 ...@@ -89,7 +89,7 @@ void heartbeat_send() {//心跳发送格式*5/2
char current_str[20]; // 足够存储转换后的字符串的缓冲区 char current_str[20]; // 足够存储转换后的字符串的缓冲区
sprintf(current_str, "%.2f", current); sprintf(current_str, "%.2f", current);
if(gPwmCount >= 5) alarm_control(voltage);//判断电压警报,在不动时候才判断 alarm_control(voltage);//判断电压警报,在不动时候才判断
/*读取程序版本号*/ /*读取程序版本号*/
char *version_num = program_version(); char *version_num = program_version();
......
...@@ -62,7 +62,6 @@ void i2c_write_byte(uint8_t data) { ...@@ -62,7 +62,6 @@ void i2c_write_byte(uint8_t data) {
i2c_delay(); i2c_delay();
int ack = digitalRead(sda_pin); // 0 = ACK,1 = NACK(你可以打印或设置状态变量) int ack = digitalRead(sda_pin); // 0 = ACK,1 = NACK(你可以打印或设置状态变量)
// printf("ACK = %d\n", ack);
digitalWrite(scl_pin, LOW); digitalWrite(scl_pin, LOW);
pinMode(sda_pin, OUTPUT); // 拉回输出模式 pinMode(sda_pin, OUTPUT); // 拉回输出模式
......
#include <math.h> #include <math.h>
#include <stdbool.h>
#include "common.h" #include "common.h"
#include "INA226.h" #include "INA226.h"
float currentLSB ; #include "softiic.h"
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(); i2c_start_ina226();
i2c_write_byte(INA226_ADDRESS << 1); i2c_write_byte_ina226(INA226_ADDRESS << 1);
i2c_write_byte(INA226_REG_CONFIG); i2c_write_byte_ina226(INA226_REG_CONFIG);
i2c_write_byte(config >> 8); i2c_write_byte_ina226(config >> 8);
i2c_write_byte(config & 0xFF); i2c_write_byte_ina226(config & 0xFF);
i2c_stop(); i2c_stop_ina226();
return true; return true;
} }
// 校准 INA226 // 校准 INA226
bool INA226_calibrate(float rShuntValue, float iMaxExpected) { bool INA226_calibrate(float rShuntValue, float iMaxExpected) {
currentLSB = iMaxExpected / 32767.0; // 电流 LSB
currentLSB = iMaxExpected/32767.0 ; // 计算电流 LSB,/INA226_REG_CALIBRATION
uint16_t calibrationValue = (uint16_t)(0.00512 / (currentLSB * rShuntValue)); uint16_t calibrationValue = (uint16_t)(0.00512 / (currentLSB * rShuntValue));
i2c_start(); i2c_start_ina226();
i2c_write_byte(INA226_ADDRESS << 1); i2c_write_byte_ina226(INA226_ADDRESS << 1);
i2c_write_byte(INA226_REG_CALIBRATION); i2c_write_byte_ina226(INA226_REG_CALIBRATION);
i2c_write_byte(calibrationValue >> 8); i2c_write_byte_ina226(calibrationValue >> 8);
i2c_write_byte(calibrationValue & 0xFF); i2c_write_byte_ina226(calibrationValue & 0xFF);
i2c_stop(); i2c_stop_ina226();
return true; return true;
} }
// 读取总线电压 // 读取总线电压
float INA226_readBusVoltage() { float INA226_readBusVoltage() {
i2c_start(); i2c_start_ina226();
i2c_write_byte(INA226_ADDRESS << 1); i2c_write_byte_ina226(INA226_ADDRESS << 1);
i2c_write_byte(INA226_REG_BUSVOLTAGE); i2c_write_byte_ina226(INA226_REG_BUSVOLTAGE);
i2c_start(); i2c_start_ina226();
i2c_write_byte((INA226_ADDRESS << 1) | 1); i2c_write_byte_ina226((INA226_ADDRESS << 1) | 1);
uint8_t high = i2c_read_byte(true); uint8_t high = i2c_read_byte_ina226(true);
uint8_t low = i2c_read_byte(false); uint8_t low = i2c_read_byte_ina226(false);
i2c_stop(); i2c_stop_ina226();
int16_t value = (high << 8) | low; int16_t value = (high << 8) | low;
return value * 0.00125; // 1.25mV/LSB return value * 0.00125f; // 每 LSB = 1.25mV
} }
// 读取电流 // 读取电流
float INA226_readCurrent() { float INA226_readCurrent() {
i2c_start(); i2c_start_ina226();
i2c_write_byte(INA226_ADDRESS << 1); i2c_write_byte_ina226(INA226_ADDRESS << 1);
i2c_write_byte(INA226_REG_CURRENT); i2c_write_byte_ina226(INA226_REG_CURRENT);
i2c_start(); i2c_start_ina226();
i2c_write_byte((INA226_ADDRESS << 1) | 1); i2c_write_byte_ina226((INA226_ADDRESS << 1) | 1);
uint8_t high = i2c_read_byte(true); uint8_t high = i2c_read_byte_ina226(true);
uint8_t low = i2c_read_byte(false); uint8_t low = i2c_read_byte_ina226(false);
i2c_stop(); i2c_stop_ina226();
int16_t value = (high << 8) | low; int16_t value = (high << 8) | low;
return value * currentLSB; // 假设电流 LSB 为 1mA return value * currentLSB;
} }
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