MGE_Hal.c
4.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#include "MGE_Hal.h"
#include "tva.h"
#include "math.h"
#include "math_utils.h"
// #include "Project_Config.h"
/*############## Test Vaule NEED TO MOVED ###########*/
static float rotation_offset = 0.0f;
static float angle_prev = 0;
static int8_t mge_direction = MGE_DIRECTION_UNKNOWN;
/*############## Test Vaule NEED TO MOVED ###########*/
TimeRec_s velTimeRec = {0};
#if TLE5012B_SPI_CONFIG_USE_IQ
static MGE_HAL_iq vel_preAngle = 0;
;
#else
static float vel_preAngle;
#endif
// static float staticAngleOffset = 2.8445f;
static float staticAngleOffset = 0.0f;
/*================================ Util Start ================================*/
int8_t mge_Get_direction(void)
{
return mge_direction;
}
int mge_Set_direction(MGE_DIRECTION dir)
{
switch (dir)
{
case MGE_DIRECTION_CCW:
mge_direction = MGE_DIRECTION_CCW;
break;
case MGE_DIRECTION_CW:
mge_direction = MGE_DIRECTION_CW;
break;
default:
mge_direction = MGE_DIRECTION_UNKNOWN;
break;
}
}
/**
* @brief Calculate the center of the smaller arc between two points
* @param angle1 point1 In REG
* @param angle2 point2 In REG
* @return the angle of the center of the smaller arc between two points
*/
float mge_hal_calculateArcMidpointAngleBTP(float angle1, float angle2)
{
float a, b, arc1, arc2, c;
if (angle1 >= angle2)
{
a = angle1;
b = angle2;
}
else
{
b = angle1;
a = angle2;
}
arc1 = _2PI - a + b;
arc2 = a - b;
if (arc1 > arc2)
{
c = a + arc1 * 0.5f;
if (c > _2PI)
{
return c - _2PI;
}
else
{
return c;
}
}
else
{
return arc2 * 0.5f + b;
}
}
static inline float angleCal_offset_direction(float RAWangle)
{
// if (RAWangle >= _2PI)
// {
// RAWangle -= _2PI;
// }
if (mge_direction == MGE_DIRECTION_CCW)
{
RAWangle = -RAWangle;
}
RAWangle -= staticAngleOffset;
// if (RAWangle < 0 )
// {
// RAWangle += _2PI;
// }
return RAWangle;
}
/*================================ Util END ================================*/
// 获得原始角度,无圈数累加
float mge_hal_GetRawAngle(void)
{
return MGE_BSP_ANGEABS_GET();
}
mgeBsp_t mge_hal_GetBSPRawAngle(void)
{
return MGE_BSP_ANGEBSPRAW_GET();
}
float mge_hal_GetAbsAngle(void)
{
float mgeBSPangle = MGE_BSP_ANGEABS_GET();
mgeBSPangle = angleCal_offset_direction(mgeBSPangle);
// mgeBSPangle += staticAngleOffset;
// if (mgeBSPangle >= _2PI)
// {
// mgeBSPangle -= _2PI;
// }
return mgeBSPangle;
}
float mge_hal_GetAbsAngle_withFilter(void)
{
float mgeBSPangle = MGE_BSP_ANGEABS_GET_WITH_FILTER(0);//范围0-6.18
mgeBSPangle = angleCal_offset_direction(mgeBSPangle);
float d_angle;
// // printf("Angle:%d\n", angle_data);
d_angle = mgeBSPangle - angle_prev;
angle_prev = mgeBSPangle;
if (fabs(d_angle) > (0.8 * _2PI))
rotation_offset += d_angle > 0 ? -_2PI : _2PI;
// rotation_offset += (rotation_offset > _2PI) ? -_2PI : rotation_offset < -_2PI ?_2PI:0;
mgeBSPangle = (rotation_offset + mgeBSPangle);
if (mgeBSPangle >= _PI)//此值大小根据限位来
{
rotation_offset-=_2PI;
mgeBSPangle -= _2PI;
}
if (mgeBSPangle < -_PI)
{
rotation_offset+=_2PI;
mgeBSPangle += _2PI;
}
return mgeBSPangle;
}
float mge_hal_GetAngle()
{
return tle5012b_read_angle_f();
}
void mge_hal_Init()
{
MGE_BSP_INIT();
TimeFlash(&velTimeRec);
}
int mge_Set_abOffset(float offset)
{
// if ((offset >= _2PI) || (offset <= -_2PI))
// {
// return -1;
// }
// else
// {
staticAngleOffset = offset;
// return 0;
// }
}
float mge_Get_abOffset(void)
{
return staticAngleOffset;
}
float mge_hal_GetVel()
{
float angle = 0;
float vel = 0;
float interTime = 0;
interTime = TimeFlash(&velTimeRec); // get the velTime use IQ
angle = mge_hal_GetAbsAngle_withFilter();
vel = (angle - vel_preAngle) / interTime; // get Vel
vel_preAngle = angle;
return vel;
}
float mge_hal_GetVel_ExtAngle(float angle)
{
// float angle = 0;
float vel = 0;
float interTime = 0;
static float vel_preAngle = 0;
interTime = TimeFlash(&velTimeRec); // get the velTime use IQ
// angle = mge_hal_GetAbsAngle_withFilter();
vel = (angle - vel_preAngle) / interTime; // get Vel
vel_preAngle = angle;
return vel;
}