Skip to content

Commit 2584356

Browse files
committed
Merge branch 'mcu-fucntions'
2 parents 79d41e9 + 5bcaae6 commit 2584356

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+29397
-27785
lines changed

2-Design/2-Simulation/MATLAB/System-Identification/scripts/.settings/language.settings.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
66
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
77
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
8+
<<<<<<<< HEAD:2-Design/2-Simulation/MATLAB/System-Identification/scripts/.settings/language.settings.xml
89
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1422088688393153689" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
10+
========
11+
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1736925352234435348" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
12+
>>>>>>>> mcu-fucntions:2-Design/3-Detailed-Design/2-Source-Code/Lenna-Bardia-MCU-Board/.settings/language.settings.xml
913
<language-scope id="org.eclipse.cdt.core.gcc"/>
1014
<language-scope id="org.eclipse.cdt.core.g++"/>
1115
</provider>
@@ -16,7 +20,11 @@
1620
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
1721
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
1822
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
23+
<<<<<<<< HEAD:2-Design/2-Simulation/MATLAB/System-Identification/scripts/.settings/language.settings.xml
1924
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1422088688393153689" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
25+
========
26+
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1736925352234435348" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
27+
>>>>>>>> mcu-fucntions:2-Design/3-Detailed-Design/2-Source-Code/Lenna-Bardia-MCU-Board/.settings/language.settings.xml
2028
<language-scope id="org.eclipse.cdt.core.gcc"/>
2129
<language-scope id="org.eclipse.cdt.core.g++"/>
2230
</provider>

2-Design/2-Simulation/MATLAB/System-Identification/scripts/Debug/Core/Src/subdir.mk

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ C_SRCS += \
99
../Core/Src/eth.c \
1010
../Core/Src/gpio.c \
1111
../Core/Src/i2c.c \
12-
../Core/Src/imu.c \
1312
../Core/Src/main.c \
1413
../Core/Src/motion.c \
1514
../Core/Src/mpu6050.c \
@@ -30,7 +29,6 @@ OBJS += \
3029
./Core/Src/eth.o \
3130
./Core/Src/gpio.o \
3231
./Core/Src/i2c.o \
33-
./Core/Src/imu.o \
3432
./Core/Src/main.o \
3533
./Core/Src/motion.o \
3634
./Core/Src/mpu6050.o \
@@ -51,7 +49,6 @@ C_DEPS += \
5149
./Core/Src/eth.d \
5250
./Core/Src/gpio.d \
5351
./Core/Src/i2c.d \
54-
./Core/Src/imu.d \
5552
./Core/Src/main.d \
5653
./Core/Src/motion.d \
5754
./Core/Src/mpu6050.d \
@@ -75,7 +72,11 @@ Core/Src/%.o Core/Src/%.su: ../Core/Src/%.c Core/Src/subdir.mk
7572
clean: clean-Core-2f-Src
7673

7774
clean-Core-2f-Src:
75+
<<<<<<<< HEAD:2-Design/2-Simulation/MATLAB/System-Identification/scripts/Debug/Core/Src/subdir.mk
7876
-$(RM) ./Core/Src/adc.d ./Core/Src/adc.o ./Core/Src/adc.su ./Core/Src/eth.d ./Core/Src/eth.o ./Core/Src/eth.su ./Core/Src/gpio.d ./Core/Src/gpio.o ./Core/Src/gpio.su ./Core/Src/i2c.d ./Core/Src/i2c.o ./Core/Src/i2c.su ./Core/Src/imu.d ./Core/Src/imu.o ./Core/Src/imu.su ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/motion.d ./Core/Src/motion.o ./Core/Src/motion.su ./Core/Src/mpu6050.d ./Core/Src/mpu6050.o ./Core/Src/mpu6050.su ./Core/Src/pid.d ./Core/Src/pid.o ./Core/Src/pid.su ./Core/Src/spi.d ./Core/Src/spi.o ./Core/Src/spi.su ./Core/Src/stm32f4xx_hal_msp.d ./Core/Src/stm32f4xx_hal_msp.o ./Core/Src/stm32f4xx_hal_msp.su ./Core/Src/stm32f4xx_it.d ./Core/Src/stm32f4xx_it.o ./Core/Src/stm32f4xx_it.su ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f4xx.d ./Core/Src/system_stm32f4xx.o ./Core/Src/system_stm32f4xx.su ./Core/Src/tim.d ./Core/Src/tim.o ./Core/Src/tim.su ./Core/Src/ultrasonic.d ./Core/Src/ultrasonic.o ./Core/Src/ultrasonic.su ./Core/Src/usart.d ./Core/Src/usart.o ./Core/Src/usart.su ./Core/Src/utilities.d ./Core/Src/utilities.o ./Core/Src/utilities.su
77+
========
78+
-$(RM) ./Core/Src/adc.d ./Core/Src/adc.o ./Core/Src/adc.su ./Core/Src/eth.d ./Core/Src/eth.o ./Core/Src/eth.su ./Core/Src/gpio.d ./Core/Src/gpio.o ./Core/Src/gpio.su ./Core/Src/i2c.d ./Core/Src/i2c.o ./Core/Src/i2c.su ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/motion.d ./Core/Src/motion.o ./Core/Src/motion.su ./Core/Src/odometry.d ./Core/Src/odometry.o ./Core/Src/odometry.su ./Core/Src/pid.d ./Core/Src/pid.o ./Core/Src/pid.su ./Core/Src/spi.d ./Core/Src/spi.o ./Core/Src/spi.su ./Core/Src/stm32f4xx_hal_msp.d ./Core/Src/stm32f4xx_hal_msp.o ./Core/Src/stm32f4xx_hal_msp.su ./Core/Src/stm32f4xx_it.d ./Core/Src/stm32f4xx_it.o ./Core/Src/stm32f4xx_it.su ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f4xx.d ./Core/Src/system_stm32f4xx.o ./Core/Src/system_stm32f4xx.su ./Core/Src/tim.d ./Core/Src/tim.o ./Core/Src/tim.su ./Core/Src/ultrasonic.d ./Core/Src/ultrasonic.o ./Core/Src/ultrasonic.su ./Core/Src/usart.d ./Core/Src/usart.o ./Core/Src/usart.su ./Core/Src/utilities.d ./Core/Src/utilities.o ./Core/Src/utilities.su
79+
>>>>>>>> mcu-fucntions:2-Design/3-Detailed-Design/2-Source-Code/Lenna-Bardia-MCU-Board/Debug/Core/Src/subdir.mk
7980

8081
.PHONY: clean-Core-2f-Src
8182

2-Design/3-Detailed-Design/2-Source-Code/Lenna-Bardia-MCU-Board/.settings/language.settings.xml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
66
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
77
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
8-
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1019252409809941933" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
8+
<<<<<<<< HEAD:2-Design/2-Simulation/MATLAB/System-Identification/scripts/.settings/language.settings.xml
9+
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1422088688393153689" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
10+
========
11+
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1736925352234435348" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
12+
>>>>>>>> mcu-fucntions:2-Design/3-Detailed-Design/2-Source-Code/Lenna-Bardia-MCU-Board/.settings/language.settings.xml
913
<language-scope id="org.eclipse.cdt.core.gcc"/>
1014
<language-scope id="org.eclipse.cdt.core.g++"/>
1115
</provider>
@@ -16,7 +20,11 @@
1620
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
1721
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
1822
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
19-
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1019252409809941933" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
23+
<<<<<<<< HEAD:2-Design/2-Simulation/MATLAB/System-Identification/scripts/.settings/language.settings.xml
24+
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1422088688393153689" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
25+
========
26+
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-1736925352234435348" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
27+
>>>>>>>> mcu-fucntions:2-Design/3-Detailed-Design/2-Source-Code/Lenna-Bardia-MCU-Board/.settings/language.settings.xml
2028
<language-scope id="org.eclipse.cdt.core.gcc"/>
2129
<language-scope id="org.eclipse.cdt.core.g++"/>
2230
</provider>

2-Design/3-Detailed-Design/2-Source-Code/Lenna-Bardia-MCU-Board/Core/Inc/odometry.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ typedef struct
158158
typedef struct
159159
{
160160
I2C_HandleTypeDef * hi2c; // I2C Sensors e.g. IMU, Magnetometer, etc.
161+
float offset_calibration_x;
162+
float offset_calibration_y;
163+
float offset_calibration_z;
164+
float roll_temp;
165+
float pitch_temp;
166+
float yaw_temp;
161167
} imu_cfgType;
162168

163169
typedef struct
@@ -183,8 +189,10 @@ void LRL_HMC5883L_ReadHeading(odom_cfgType * odom);
183189

184190
void LRL_MPU6050_Init(odom_cfgType * odom);
185191
void LRL_MPU6050_ReadAccel(odom_cfgType * odom);
186-
void LRL_MPU6050_EnableBypass(odom_cfgType * odom, uint8_t enable);
192+
void _LRL_MPU6050_EnableBypass(odom_cfgType * odom, uint8_t enable);
187193
void LRL_MPU6050_ReadGyro(odom_cfgType *odom);
194+
void LRL_MPU6050_ReadAll(odom_cfgType *odom);
195+
void LRL_MPU6050_ComplementaryFilter(odom_cfgType *odom);
188196

189197
void LRL_Encoder_Init(odom_cfgType * odom);
190198
void LRL_Encoder_ReadAngularSpeed(odom_cfgType * odom);

2-Design/3-Detailed-Design/2-Source-Code/Lenna-Bardia-MCU-Board/Core/Src/main.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,21 +252,30 @@ int main(void)
252252

253253
LRL_Encoder_Init(&odom);
254254

255-
LRL_MPU6050_EnableBypass(&odom, 0);
256255
LRL_MPU6050_Init(&odom);
257256

258-
LRL_MPU6050_EnableBypass(&odom, 1);
259257
LRL_HMC5883L_Init(&odom);
260258

261259
LRL_PID_Init(&pid_motor_left, 1);
262260
LRL_PID_Init(&pid_motor_right, 1);
263261

262+
HAL_UART_Transmit(&huart1, "HELLO \n\r" , sizeof("HELLO \n\r" ), 10);
263+
264264
/* USER CODE END 2 */
265265

266266
/* Infinite loop */
267267
/* USER CODE BEGIN WHILE */
268268
while (1)
269269
{
270+
if(pid_tim_flag == 1)
271+
{
272+
LRL_MPU6050_ReadAll(&odom);
273+
LRL_MPU6050_ComplementaryFilter(&odom);
274+
275+
sprintf(MSG,"readings are : %5.2f\t %5.2f\t %5.2f\t \n\r",odom.angle.x , odom.angle.y, odom.angle.z);
276+
HAL_UART_Transmit(&huart1, &MSG, sizeof(MSG), 10);
277+
pid_tim_flag = 0;
278+
}
270279
/* USER CODE END WHILE */
271280

272281
/* USER CODE BEGIN 3 */

2-Design/3-Detailed-Design/2-Source-Code/Lenna-Bardia-MCU-Board/Core/Src/odometry.c

Lines changed: 115 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,29 @@
1010

1111
#include "odometry.h"
1212
#include "math.h"
13+
#include "mcu_config.h"
1314

1415
uint8_t _i2c_reg_data;
1516
uint8_t _mag_buffer[6];
1617
float _mag_heading_temp;
1718

1819
uint8_t _imu_addr_check;
1920
uint8_t _imu_buffer[6];
20-
float tmp_x,tmp_y,tmp_z;
2121

22-
// ############################################################
23-
// #################### HMC MAGNETOMETER ####################
24-
// ############################################################
22+
static float _tmp_accx, _tmp_accy, _tmp_accz;
23+
static float prev_gyr_x = 0.0f, prev_gyr_y = 0.0f, prev_gyr_z = 0.0f;
24+
static float prev_acc_x = 0.0f, prev_acc_y = 0.0f, prev_acc_z = 0.0f;
2525

26-
float LRL_HMC5883L_SetDeclination(int16_t declination_degs , int16_t declination_mins, char declination_dir)
27-
{
28-
int8_t _dir = 0;
26+
float _tmp_cal_x=0, _tmp_cal_y=0, _tmp_cal_z=0;
2927

30-
if (declination_dir == 'E' || declination_dir == 'e' || declination_dir == 1)
31-
{
32-
_dir = 1;
33-
}
34-
else if (declination_dir == 'W' || declination_dir == 'w' || declination_dir == -1)
35-
{
36-
_dir = -1;
37-
}
3828

39-
return ((_dir)* ( declination_degs + (1/60 * declination_mins)) * (M_PI / 180));
40-
}
29+
// ############################################################
30+
// #################### HMC MAGNETOMETER ####################
31+
// ############################################################
4132

4233
void LRL_HMC5883L_Init(odom_cfgType * odom)
4334
{
35+
_LRL_MPU6050_EnableBypass(odom, 1);
4436
// write CONFIG_A register
4537
HAL_I2C_Master_Transmit(odom->imu.hi2c, HMC5883L_ADDRESS, (uint8_t *)HMC5883L_ADDRESS_WRITE, 1, DELAY_TIMEOUT);
4638
_i2c_reg_data = 0x10;
@@ -58,8 +50,25 @@ void LRL_HMC5883L_Init(odom_cfgType * odom)
5850
HAL_Delay(10);
5951
}
6052

53+
float LRL_HMC5883L_SetDeclination(int16_t declination_degs , int16_t declination_mins, char declination_dir)
54+
{
55+
int8_t _dir = 0;
56+
57+
if (declination_dir == 'E' || declination_dir == 'e' || declination_dir == 1)
58+
{
59+
_dir = 1;
60+
}
61+
else if (declination_dir == 'W' || declination_dir == 'w' || declination_dir == -1)
62+
{
63+
_dir = -1;
64+
}
65+
66+
return ((_dir)* ( declination_degs + (1/60 * declination_mins)) * (M_PI / 180));
67+
}
68+
6169
void LRL_HMC5883L_ReadHeading(odom_cfgType * odom)
6270
{
71+
_LRL_MPU6050_EnableBypass(odom, 1);
6372
HAL_I2C_Master_Transmit(odom->imu.hi2c, HMC5883L_ADDRESS, (uint8_t *)HMC5883L_ADDRESS_READ, 1, DELAY_TIMEOUT);
6473
HAL_I2C_Mem_Read(odom->imu.hi2c, HMC5883L_ADDRESS, HMC5883L_RA_DATAX_H, 1, (uint8_t *)&_mag_buffer, 6, DELAY_TIMEOUT);
6574

@@ -88,6 +97,7 @@ void LRL_HMC5883L_ReadHeading(odom_cfgType * odom)
8897

8998
void LRL_MPU6050_Init(odom_cfgType * odom)
9099
{
100+
_LRL_MPU6050_EnableBypass(odom, 0);
91101
HAL_I2C_Mem_Read(odom->imu.hi2c, MPU_ADDR, WHO_AM_I, 1, &_imu_addr_check, 1, DELAY_TIMEOUT);
92102

93103
if (_imu_addr_check == 0x68) // 0x68 will be returned by the sensor if everything goes well
@@ -110,10 +120,39 @@ void LRL_MPU6050_Init(odom_cfgType * odom)
110120
_i2c_reg_data = 0x00;
111121
HAL_I2C_Mem_Write(odom->imu.hi2c, MPU_ADDR, GYRO_CONFIG, 1, &_i2c_reg_data, 1, DELAY_TIMEOUT);
112122
}
123+
124+
odom->imu.offset_calibration_x = 0;
125+
odom->imu.offset_calibration_y = 0;
126+
odom->imu.offset_calibration_z = 0;
127+
128+
for(int i = 0; i<500 ; i++)
129+
{
130+
LRL_MPU6050_ReadAll(odom);
131+
LRL_MPU6050_ComplementaryFilter(odom);
132+
133+
_tmp_cal_x += odom->angle.x;
134+
_tmp_cal_y += odom->angle.y;
135+
_tmp_cal_z += odom->angle.z;
136+
137+
HAL_Delay(5);
138+
}
139+
140+
odom->imu.offset_calibration_x = (_tmp_cal_x/500);
141+
odom->imu.offset_calibration_y = (_tmp_cal_y/500);
142+
odom->imu.offset_calibration_z = (_tmp_cal_z/500);
143+
144+
prev_acc_x = 0;
145+
prev_acc_y = 0;
146+
prev_acc_z = 0;
147+
prev_gyr_x = 0;
148+
prev_gyr_y = 0;
149+
prev_gyr_z = 0;
113150
}
114151

115152
void LRL_MPU6050_ReadAccel(odom_cfgType * odom)
116153
{
154+
155+
_LRL_MPU6050_EnableBypass(odom, 0);
117156
// Read 6 BYTES of data starting from ACCEL_XOUT_H register
118157
HAL_I2C_Mem_Read(odom->imu.hi2c, MPU_ADDR, ACCEL_XOUT_H, 1, (uint8_t *)&_imu_buffer, 6, DELAY_TIMEOUT);
119158

@@ -135,6 +174,7 @@ void LRL_MPU6050_ReadAccel(odom_cfgType * odom)
135174

136175
void LRL_MPU6050_ReadGyro(odom_cfgType *odom)
137176
{
177+
_LRL_MPU6050_EnableBypass(odom, 0);
138178
HAL_I2C_Mem_Read(odom->imu.hi2c, MPU_ADDR, GYRO_XOUT_H, 1, (uint8_t *)_imu_buffer, 6, DELAY_TIMEOUT);
139179

140180
odom->gyro.x = (int16_t)(_imu_buffer[0] << 8 | _imu_buffer[1]);
@@ -146,7 +186,14 @@ void LRL_MPU6050_ReadGyro(odom_cfgType *odom)
146186
odom->gyro.z /= (GYRO_CORRECTOR / FLOAT_SCALING);
147187
}
148188

149-
void LRL_MPU6050_EnableBypass(odom_cfgType * odom, uint8_t enable)
189+
void LRL_MPU6050_ReadAll(odom_cfgType *odom)
190+
{
191+
_LRL_MPU6050_EnableBypass(odom, 0);
192+
LRL_MPU6050_ReadAccel(odom);
193+
LRL_MPU6050_ReadGyro(odom);
194+
}
195+
196+
void _LRL_MPU6050_EnableBypass(odom_cfgType * odom, uint8_t enable)
150197
{
151198
_i2c_reg_data = 0x00;
152199
HAL_I2C_Mem_Write(odom->imu.hi2c, MPU_ADDR, USER_CTRL, 1, &_i2c_reg_data, 1, DELAY_TIMEOUT);
@@ -156,6 +203,56 @@ void LRL_MPU6050_EnableBypass(odom_cfgType * odom, uint8_t enable)
156203
HAL_I2C_Mem_Write(odom->imu.hi2c, MPU_ADDR, PWR_MGMT_1, 1, &_i2c_reg_data, 1, DELAY_TIMEOUT);
157204
}
158205

206+
void LRL_MPU6050_ComplementaryFilter(odom_cfgType *odom)
207+
{
208+
_LRL_MPU6050_EnableBypass(odom, 0);
209+
float dt = 0.01;
210+
211+
// Low-pass filter accelerometer data
212+
_tmp_accx = ALPHA * prev_acc_x + (1 - ALPHA) * odom->accel.x/FLOAT_SCALING;
213+
_tmp_accy = ALPHA * prev_acc_y + (1 - ALPHA) * odom->accel.y/FLOAT_SCALING;
214+
_tmp_accz = ALPHA * prev_acc_z + (1 - ALPHA) * odom->accel.z/FLOAT_SCALING;
215+
216+
// Normalize accelerometer data
217+
float acc_norm = sqrtf(_tmp_accx * _tmp_accx + _tmp_accy * _tmp_accy + _tmp_accz * _tmp_accz);
218+
_tmp_accx /= acc_norm;
219+
_tmp_accy /= acc_norm;
220+
_tmp_accz /= acc_norm;
221+
222+
// Update angle using accelerometer
223+
float acc_angle_x = atan2f(_tmp_accy, _tmp_accz) * (180.0f / M_PI);
224+
float acc_angle_y = atan2f(_tmp_accx, _tmp_accz) * (180.0f / M_PI);
225+
float acc_angle_z = atan2f(_tmp_accy, _tmp_accx) * (180.0f / M_PI);
226+
227+
// Low-pass filter gyroscope data
228+
float gyr_x_filtered = ALPHA * prev_gyr_x + (1 - ALPHA) * odom->gyro.x/FLOAT_SCALING;
229+
float gyr_y_filtered = ALPHA * prev_gyr_y + (1 - ALPHA) * odom->gyro.y/FLOAT_SCALING;
230+
float gyr_z_filtered = ALPHA * prev_gyr_z + (1 - ALPHA) * odom->gyro.z/FLOAT_SCALING;
231+
232+
// Update angle using gyroscope
233+
odom->imu.roll_temp += gyr_x_filtered * dt;
234+
odom->imu.pitch_temp -= gyr_y_filtered * dt;
235+
odom->imu.yaw_temp += gyr_z_filtered * dt;
236+
237+
// Complementary filter
238+
odom->imu.roll_temp = (ALPHA * odom->imu.roll_temp + (1 - ALPHA) * acc_angle_x) ;
239+
odom->imu.pitch_temp = ((ALPHA * odom->imu.pitch_temp) - (1 - ALPHA) * acc_angle_y);
240+
odom->imu.yaw_temp = (ALPHA * odom->imu.yaw_temp + (1 - ALPHA) * acc_angle_z);
241+
242+
odom->angle.x = odom->imu.roll_temp - odom->imu.offset_calibration_x;
243+
odom->angle.y = odom->imu.pitch_temp - odom->imu.offset_calibration_y;
244+
odom->angle.z = odom->imu.yaw_temp - odom->imu.offset_calibration_z;
245+
246+
// Update previous values
247+
prev_acc_x = _tmp_accx;
248+
prev_acc_y = _tmp_accy;
249+
prev_acc_z = _tmp_accz;
250+
prev_gyr_x = gyr_x_filtered;
251+
prev_gyr_y = gyr_y_filtered;
252+
prev_gyr_z = gyr_z_filtered;
253+
}
254+
255+
159256
// #########################################################
160257
// #################### MOTOR ENCODER ####################
161258
// #########################################################
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)