Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
car-controlserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wenzhongjian
car-controlserver
Commits
cd8e0f93
Commit
cd8e0f93
authored
May 26, 2025
by
957dd
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
INA226和ads1115分别用2个软件iic函数
parent
c5a0df49
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
99 additions
and
39 deletions
+99
-39
main
build/main
+0
-0
softiic.h
include/softiic.h
+2
-0
mqtt.c
src/mqtt.c
+1
-1
softiic.c
src/softiic.c
+0
-1
INA226.c
system/sensor/INA226.c
+96
-37
No files found.
build/main
View file @
cd8e0f93
No preview for this file type
include/softiic.h
View file @
cd8e0f93
...
@@ -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
();
...
...
src/mqtt.c
View file @
cd8e0f93
...
@@ -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
();
...
...
src/softiic.c
View file @
cd8e0f93
...
@@ -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
);
// 拉回输出模式
...
...
system/sensor/INA226.c
View file @
cd8e0f93
#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
.
00125
f
;
// 每 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
;
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment