Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions STM32F405RGTx/.settings/language.settings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project>
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1060525657" name="Debug">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-85431782320206814" 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">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
</extension>
</configuration>
<configuration id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.1972182609" name="Release">
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-85431782320206814" 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">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
</extension>
</configuration>
</project>
2 changes: 2 additions & 0 deletions STM32F405RGTx/.settings/stm32cubeide.project.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
DC22A860405A8BF2F2C095E5B6529F12=A7382F0030CE3C7B1E2E6100CFC7BE85
eclipse.preferences.version=1
Binary file added STM32F405RGTx/Core/Inc/.lut 2.hpp.icloud
Binary file not shown.
75 changes: 75 additions & 0 deletions STM32F405RGTx/Core/Inc/accelerometer.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#pragma once

#include <string.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
#include "main.h"

#define IMU_ADDR 0x19<<1 //| Use 8-bit address
#define REG_CTRL_1 0x20 //| Control Register-1
#define REG_CTRL_4 0x23 //| Control Register-4
#define REG_X_L 0x28 //| X-Axis LSB
#define REG_X_H 0x29 //| X-Axis MSB
#define REG_Y_L 0x2A //| Y-Axis LSB
#define REG_Y_H 0x2B //| Y-Axis MSB
#define REG_Z_L 0x2C //| Z-Axis LSB
#define REG_Z_H 0x2D //| Z-Axis MSB

//Constants used to convert raw acceleration based on range
#define ACC_RANGE_2G 16384
#define ACC_RANGE_4G 8192
#define ACC_RANGE_8G 4096
#define ACC_RANGE_16G 2048

//Control register 4 values to change acceleration range
#define CTRL_REG_4_ACCL_RANGE_16G 0x30 // Full scale +/-16g
#define CTRL_REG_4_ACCL_RANGE_8G 0x20 // Full scale +/-8g
#define CTRL_REG_4_ACCL_RANGE_4G 0x10 // Full scale +/-4g
#define CTRL_REG_4_ACCL_RANGE_2G 0x00 //Full scale = +/-2g

//Selected acceleration range
#define SELECTED_ACC_RANGE ACC_RANGE_2G
#define SELECTED_CTRL_REG_4_ACCL_RANGE CTRL_REG_4_ACCL_RANGE_2G

#define GRAVITATIONAL_CONSTANT 9.8

enum axis{
x_axis,
y_axis,
z_axis};

class Accelerometer{
public:
float getAcceleration(axis accelerationAxis);
float getSpeed(axis speedAxis);
float getPos(axis accelerationAxis);
float getTimeDiff();
uint8_t getRawAccelerationLow(axis accelerationAxis);
uint8_t getRawAccelerationHigh(axis accelerationAxis);
void update();
Accelerometer(I2C_HandleTypeDef *I2CConnection_);

private:
void convertRawAcceleration();
void readRawAcceleration();
void updatePos();
void updateSpeed();
void getTimeValues();

float ACC[3] = {0,0,0};
float POS[3] = {0,0,0};
float SPEED[3] = {0,0,0};

uint8_t RAW_ACC_L[3] = {0,0,0};
uint8_t RAW_ACC_H[3] = {0,0,0};

int PREVIOUS_TIME = 0;
int CURRENT_TIME = 0;
float TIME_DIFF = 0;

I2C_HandleTypeDef *I2CConnection;

};


18 changes: 18 additions & 0 deletions STM32F405RGTx/Core/Inc/accelerometer_thread.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once

#include "main.h"
#include "accelerometer.hpp"

class AccelerometerThread{
public:
static void initialize();
static void update();
static I2C_HandleTypeDef *I2CConncetion;
static Accelerometer accelerometer;
static osThreadId_t getThreadId();
static void stopMeasurements();
static void resumeMeasurements();
private:
static RTOSThread thread;
};

4 changes: 4 additions & 0 deletions STM32F405RGTx/Core/Inc/threads.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,15 @@
#include "LED_thread.hpp"
#include "svpwm_thread.hpp"
#include "vhz_thread.hpp"
#include "accelerometer_thread.hpp"

// Thread Periodicities (ms)
#define MEASUREMENTS_THREAD_PERIODICITY 100
#define MEASUREMENTS_THREAD_PRIORITY osPriorityRealtime7

#define ACCELEROMETER_THREAD_PERIODICITY 100
#define ACCELEROMETER_THREAD_PRIORITY osPriorityRealtime4

#define STATE_MACHINE_THREAD_PERIODICITY 150
#define STATE_MACHINE_THREAD_PRIORITY osPriorityRealtime6

Expand Down
72 changes: 72 additions & 0 deletions STM32F405RGTx/Core/Src/accelerometer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#include "accelerometer.hpp"

Accelerometer::Accelerometer(I2C_HandleTypeDef *I2CConnection_){
I2CConnection = I2CConnection_;
}
float Acceleromter::getAcceleration(axis accelerationAxis){
return ACC[accelerationAxis];
}
float Acceleromter::getSpeed(axis speedAxis){
return SPEED[speedAxis];
}
float Acceleromter::getPos(axis positionAxis){
return POS[positionAxis];
}
float Acceleromter::getTimeDiff(){
return timeDiff;
}
uint8_t Acceleromter::getRawAccelerationLow(axis accelerationAxis){
return RAW_ACC_L[accelerationAxis];
}
uint8_t Acceleromter::getRawAccelerationHigh(axis accelerationAxis){
return RAW_ACC_H[accelerationAxis];
}
void Acceleromter::update(){
readRawAccleration();
convertRawAcceleration();
getTimeValues();
updatePos();
updateSpeed();
PREVIOUS_TIME = CURRENT_TIME;
}


void Acceleromter::convertRawAcceleration(){
for(int i =0 ; i<3; i++)
{

int16_t RAW_ACC = RAW_ACC_H[i];
RAW_ACC <<= 8;
RAW_ACC |= RAW_ACC_L[i];
ACC[i] = ((float)RAW_ACC / (float)SELECTED_ACC_RANGE)*GRAVITATIONAL_CONSTANT;
}
}
void Acceleromter::readRawAcceleration(){
// Get acceleration in X-AXIS
HAL_I2C_Mem_Read(&hi2c1, IMU_ADDR, REG_X_H, I2C_MEMADD_SIZE_8BIT, RAW_ACC_H[x_axis], 1, 1000);
HAL_I2C_Mem_Read(&hi2c1, IMU_ADDR, REG_X_L, I2C_MEMADD_SIZE_8BIT, RAW_ACC_L[x_axis], 1, 1000);


// Get acceleration in Y-AXIS
HAL_I2C_Mem_Read(&hi2c1, IMU_ADDR, REG_Y_H, I2C_MEMADD_SIZE_8BIT, RAW_ACC_H[y_axis], 1000);
HAL_I2C_Mem_Read(&hi2c1, IMU_ADDR, REG_Y_L, I2C_MEMADD_SIZE_8BIT, RAW_ACC_L[y_axis], 1, 1000);


// Get acceleration in Z-AXIS
HAL_I2C_Mem_Read(&hi2c1, IMU_ADDR, REG_Z_H, I2C_MEMADD_SIZE_8BIT, RAW_ACC_H[z_axis], 1, 1000);
HAL_I2C_Mem_Read(&hi2c1, IMU_ADDR, REG_Z_L, I2C_MEMADD_SIZE_8BIT, RAW_ACC_L[z_axis], 1, 1000);
}
void Acceleromter::updatePos(){
for(int i =0; i<3; i++){
POS[i] += SPEED[i]*TIME_DIFF+0.5*ACC[i]*TIME_DIFF*TIME_DIFF;
}
}
void Acceleromter::updateSpeed(){
for(int i =0; i<3; i++){
SPEED[i] += ACC[i]*TIME_DIFF;
}
}
void Acceleromter::getTimeValues(){
CURRENT_TIME = HAL_GetTick();
TIME_DIFF = ((float)CURRENT_TIME-(float)PREVIOUS_TIME)/1000;
}
Binary file not shown.
Loading