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
76f17c28
Commit
76f17c28
authored
Oct 25, 2025
by
957dd
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
加入了一阶滤波算法,让角度平滑,减少跳变
parent
338b64fe
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
35 additions
and
53 deletions
+35
-53
main
build/main
+0
-0
gpio_control.c
drivers/gpio/gpio_control.c
+5
-5
tank_angle.c
drivers/sensors/tank_angle.c
+19
-45
tank_angle.h
drivers/sensors/tank_angle.h
+2
-0
mqtt_infor_handle.c
modules/mqtt/mqtt_infor_handle.c
+9
-3
No files found.
build/main
View file @
76f17c28
No preview for this file type
drivers/gpio/gpio_control.c
View file @
76f17c28
...
...
@@ -439,11 +439,11 @@ void tank0204_pwm_value(int pin,int value){
if
(
pin
==
27
){
device_shoting_check
(
27
,
30
);
}
else
if
(
pin
==
5
)
{
softPwmWrite
(
7
,
3
0
);
my_zlog_info
(
"pwm:7,
0
"
);
softPwmWrite
(
7
,
3
5
);
my_zlog_info
(
"pwm:7,
1
"
);
}
else
if
(
pin
==
7
)
{
softPwmWrite
(
5
,
3
0
);
my_zlog_info
(
"pwm:5,
0
"
);
softPwmWrite
(
5
,
3
5
);
my_zlog_info
(
"pwm:5,
1
"
);
}
else
{
softPwmWrite
(
pin
,
30
);
my_zlog_info
(
"pwm:%d"
,
pin
);
...
...
@@ -530,7 +530,7 @@ void dog0501_pwm_value(int pin,int value) { //软件陪我们控制调速
if
(
value
==
1
)
{
if
(
pin
==
27
){
softPwmWrite
(
27
,
40
);
softPwmWrite
(
7
,
8
0
);
softPwmWrite
(
7
,
10
0
);
}
else
{
softPwmWrite
(
pin
,
35
);
my_zlog_info
(
"pwm:%d"
,
pin
);
...
...
drivers/sensors/tank_angle.c
View file @
76f17c28
...
...
@@ -2,6 +2,8 @@
#include "common.h"
#include "ads1115.h"
double
tank_angle
(){
double
angle
=
0
;
float
angle_shot
=
ads1115_read_channel
(
2
);
...
...
@@ -13,8 +15,6 @@ double tank_angle(){
return
angle
;
}
int
angle_limit
(){
if
(
ANGLE_LIMIT_INDEX
==
1
){
int
tank_limit_angele
=
tank_angle
();
...
...
@@ -26,46 +26,19 @@ int angle_limit(){
}
/*
角度 EMA 滤波
- filter : 上次滤波值(度)
- raw : 当前原始角度(度)
- alpha : 衰减因子(0..1),越大越跟随原始值(推荐 0.05~0.5)
- deadband : 死区(度),小于该值认为是抖动
*/
// EN滤波结构体
// typedef struct {
// double alpha; // 滤波系数 (0~1)
// double filtered; // 上一次滤波角度
// } ENFilter;
// static ENFilter filter = {.alpha = 0.5, .filtered = 0.05};
// // 支持360°→0°跳变的滤波函数
// double en_filter_update(double new_angle)
// {
// double diff = new_angle - filter.filtered;
// // 处理角度环绕(支持359→0或0→359平滑过渡)
// if (diff > 180.0)
// diff -= 360.0;
// else if (diff < -180.0)
// diff += 360.0;
// // 一阶低通滤波
// filter.filtered += filter.alpha * diff;
// // 结果保持在[0, 360)
// if (filter.filtered < 0)
// filter.filtered += 360.0;
// else if (filter.filtered >= 360.0)
// filter.filtered -= 360.0;
// return filter.filtered;
// }
// //上次的角度滤波后的值
// double return_en_filter_last_angle(){
// return filter.filtered;
// }
float
low_pass_filter_360
(
float
prev_angle
,
float
new_angle
,
float
alpha
)
{
// 规整到 [0, 360)
prev_angle
=
fmod
(
prev_angle
,
360
.
0
f
);
if
(
prev_angle
<
0
)
prev_angle
+=
360
.
0
f
;
new_angle
=
fmod
(
new_angle
,
360
.
0
f
);
if
(
new_angle
<
0
)
new_angle
+=
360
.
0
f
;
// 计算最短路径角度差
float
diff
=
new_angle
-
prev_angle
;
if
(
diff
>
180
.
0
f
)
diff
-=
360
.
0
f
;
else
if
(
diff
<
-
180
.
0
f
)
diff
+=
360
.
0
f
;
// 应用滤波
float
filtered
=
prev_angle
+
alpha
*
diff
;
return
fmod
(
filtered
+
360
.
0
f
,
360
.
0
f
);
// 确保输出在 [0, 360)
}
\ No newline at end of file
drivers/sensors/tank_angle.h
View file @
76f17c28
...
...
@@ -11,6 +11,8 @@ double tank_angle();
int
angle_limit
();
float
low_pass_filter_360
(
float
prev_angle
,
float
new_angle
,
float
alpha
);
// //角度滤波
// double en_filter_update(double new_angle);
...
...
modules/mqtt/mqtt_infor_handle.c
View file @
76f17c28
...
...
@@ -76,17 +76,23 @@ void angle_mqtt_send() {
static
int
angle_i
=
0
;
cJSON
*
root
=
cJSON_CreateObject
();
char
TOPIC_send_angle
[
26
];
double
rounded_angle
=
tank_angle
();
static
double
prev_angle
=
0
;
static
double
rounded_angle
;
rounded_angle
=
low_pass_filter_360
(
prev_angle
,
tank_angle
(),
0
.
7
);
sprintf
(
TOPIC_send_angle
,
"dev_rtinfo/%s"
,
mqtt_topic_pure_number
());
cJSON_AddStringToObject
(
root
,
"type"
,
"tank_angle"
);
cJSON_AddNumberToObject
(
root
,
"angle"
,
rounded_angle
);
char
*
payload
=
cJSON_PrintUnformatted
(
root
);
angle_i
++
;
if
(
angle_i
>=
2
0
){
if
(
angle_i
>=
1
0
){
my_zlog_debug
(
"%s"
,
payload
);
prev_angle
=
tank_angle
();
angle_i
=
0
;
}
if
(
rounded_angle
==
0
){
cJSON_Delete
(
root
);
return
;
}
for
(
int
i
=
0
;
i
<
g_mqtt_cam_config_t
->
mqtt_count
;
i
++
){
mosquitto_publish
(
g_clients_t
[
i
].
mosq
,
NULL
,
TOPIC_send_angle
,
strlen
(
payload
),
payload
,
0
,
false
);
}
...
...
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