Skip to content

Commit

Permalink
Adding MPU Interface (#120)
Browse files Browse the repository at this point in the history
* Adding Basic MPU Interface with LED and ADC functionality

* Adding temperature sensor reading to mpu interface

* Making warnings errors in Makefile

* Implementing IMU functionality in MPU

* Updating submodule

* Adding watchdog pet functionality
  • Loading branch information
nwdepatie authored Dec 30, 2023
1 parent 9702ab0 commit 4d14a08
Show file tree
Hide file tree
Showing 12 changed files with 380 additions and 159 deletions.
4 changes: 0 additions & 4 deletions Core/Inc/cerberus_conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,6 @@
#define GPIO_4_GPIO_Port GPIOB
#define WATCHDOG_Pin GPIO_PIN_15
#define WATCHDOG_GPIO_Port GPIOB
#define LED_1_Pin GPIO_PIN_8
#define LED_1_GPIO_Port GPIOC
#define LED_2_Pin GPIO_PIN_9
#define LED_2_GPIO_Port GPIOC

#define CANID_TEMP_SENSOR 0xBEEF
#define CANID_PEDAL_SENSOR 0xDEAD
Expand Down
7 changes: 0 additions & 7 deletions Core/Inc/monitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,6 @@ void vWatchdogMonitor(void *pv_params);
extern osThreadId_t watchdog_monitor_handle;
extern const osThreadAttr_t watchdog_monitor_attributes;

typedef struct
{
ADC_HandleTypeDef *accel_adc1;
ADC_HandleTypeDef *accel_adc2;
ADC_HandleTypeDef *brake_adc;
} pedal_params_t;

/* Parameters for the pedal monitoring task */
#define MAX_ADC_VAL_12B 4096
#define PEDAL_DIFF_THRESH 10
Expand Down
48 changes: 48 additions & 0 deletions Core/Inc/mpu.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#ifndef MPU_H
#define MPU_H

#include <stdint.h>
#include <stdbool.h>
#include "stm32f405xx.h"
#include "sht30.h"
#include "lsm6dso.h"
#include "cmsis_os.h"

typedef struct {
I2C_HandleTypeDef *hi2c;
ADC_HandleTypeDef *accel_adc1;
ADC_HandleTypeDef *accel_adc2;
ADC_HandleTypeDef *brake_adc;
GPIO_TypeDef* led_gpio;
GPIO_TypeDef* watchdog_gpio;
sht30_t *temp_sensor;
lsm6dso_t *imu;
osMutexId_t *adc_mutex;
osMutexId_t *i2c_mutex;
/* Not including LED Mutexes because not necessary */
} mpu_t;

mpu_t *init_mpu(I2C_HandleTypeDef *hi2c, ADC_HandleTypeDef *accel_adc1,
ADC_HandleTypeDef *accel_adc2, ADC_HandleTypeDef *brake_adc,
GPIO_TypeDef* led_gpio, GPIO_TypeDef* watchdog_gpio);

int8_t write_rled(mpu_t *mpu, bool status);

int8_t toggle_rled(mpu_t *mpu);

int8_t write_yled(mpu_t *mpu, bool status);

int8_t toggle_yled(mpu_t *mpu);

int8_t pet_watchdog(mpu_t *mpu);

/* Note: this should be called from within a thread since it yields to scheduler */
int8_t read_adc(mpu_t *mpu, uint16_t raw[3]);

int8_t read_temp_sensor(mpu_t *mpu, uint16_t *temp, uint16_t *humidity);

int8_t read_accel(mpu_t *mpu, uint16_t accel[3]);

int8_t read_gyro(mpu_t *mpu, uint16_t gyro[3]);

#endif /* MPU */
6 changes: 3 additions & 3 deletions Core/Src/can_handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ static osMessageQueueId_t can_inbound_queue;
/* Relevant Info for Initializing CAN 1 */
static can_t can1;

static const uint16_t id_list[NUM_INBOUND_CAN_IDS] = {
static uint16_t id_list[NUM_INBOUND_CAN_IDS] = {
//CANID_X,
NULL
0
};

/* Relevant Info for Cerberus CAN LUT */
Expand Down Expand Up @@ -137,7 +137,6 @@ const osThreadAttr_t can_dispatch_attributes = {

void vCanDispatch(void* pv_params)
{
const uint16_t can_dispatch_delay = 1; //ms
fault_data_t fault_data = {
.id = CAN_DISPATCH_FAULT,
.severity = DEFCON1
Expand Down Expand Up @@ -174,4 +173,5 @@ int8_t queue_can_msg(can_msg_t msg)
return -1;

osMessageQueuePut(can_outbound_queue, &msg, 0U, 0U);
return 0;
}
1 change: 1 addition & 0 deletions Core/Src/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ int queue_fault(fault_data_t *fault_data)
return -1;

osMessageQueuePut(fault_handle_queue, fault_data, 0U, 0U);
return 0;
}

void vFaultHandler(void* pv_params)
Expand Down
36 changes: 16 additions & 20 deletions Core/Src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "state_machine.h"
#include "torque.h"
#include "pdu.h"
#include "mpu.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
Expand Down Expand Up @@ -161,13 +162,17 @@ int main(void)
MX_ADC3_Init();
/* USER CODE BEGIN 2 */

HAL_GPIO_TogglePin(GPIOC, LED_2_Pin); // Toggle on LED2
/* Create Interfaces to Represent Relevant Hardware */
mpu_t *mpu = init_mpu(&hi2c1, &hadc1, &hadc2, &hadc3, GPIOC, GPIOB);
pdu_t *pdu = init_pdu(&hi2c2);

toggle_yled(mpu); // Toggle on LED2
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOC, LED_2_Pin); // Toggle on LED2
toggle_yled(mpu); // Toggle on LED2
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOC, LED_2_Pin); // Toggle on LED2
toggle_yled(mpu); // Toggle on LED2
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOC, LED_2_Pin); // Toggle on LED2
toggle_yled(mpu); // Toggle on LED2

/* USER CODE END 2 */

Expand All @@ -189,15 +194,6 @@ int main(void)
/* USER CODE BEGIN RTOS_QUEUES */
onboard_temp_queue = osMessageQueueNew(ONBOARD_TEMP_QUEUE_SIZE, sizeof(onboard_temp_t), NULL);
imu_queue = osMessageQueueNew(IMU_QUEUE_SIZE, sizeof(imu_data_t), NULL);

// A bit sloppy since I don't free this, but it will be allocated for lifetime
pedal_params_t *pedal_params = malloc(sizeof(pedal_params_t));
pedal_params->accel_adc1 = &hadc1;
pedal_params->accel_adc2 = &hadc2;
pedal_params->brake_adc = &hadc3;

pdu_t *pdu = init_pdu(&hi2c1);

pedal_data_queue = osMessageQueueNew(PEDAL_DATA_QUEUE_SIZE, sizeof(pedals_t), NULL);
/* USER CODE END RTOS_QUEUES */

Expand All @@ -207,10 +203,10 @@ int main(void)

/* USER CODE BEGIN RTOS_THREADS */
/* Monitors */
temp_monitor_handle = osThreadNew(vTempMonitor, &hi2c1, &temp_monitor_attributes);
temp_monitor_handle = osThreadNew(vTempMonitor, mpu, &temp_monitor_attributes);
watchdog_monitor_handle = osThreadNew(vWatchdogMonitor, GPIOB, &watchdog_monitor_attributes);
imu_monitor_handle = osThreadNew(vIMUMonitor, &hi2c1, &imu_monitor_attributes);
pedals_monitor_handle = osThreadNew(vPedalsMonitor, pedal_params, &pedals_monitor_attributes);
imu_monitor_handle = osThreadNew(vIMUMonitor, mpu, &imu_monitor_attributes);
pedals_monitor_handle = osThreadNew(vPedalsMonitor, mpu, &pedals_monitor_attributes);
fusing_monitor_handle = osThreadNew(vFusingMonitor, pdu, &fusing_monitor_attributes);
shutdown_monitor_handle = osThreadNew(vShutdownMonitor, pdu, &shutdown_monitor_attributes);

Expand Down Expand Up @@ -745,8 +741,8 @@ void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN 5 */
int i = 0;
uint8_t data;
HAL_StatusTypeDef err;
//uint8_t data;
//HAL_StatusTypeDef err;
/* Infinite loop */
for(;;) {
/* Testing getting data from I2C devices */
Expand All @@ -766,9 +762,9 @@ void StartDefaultTask(void *argument)
//HAL_StatusTypeDef err = HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
//if (!err)
// serial_print("%d\r\n", HAL_ADC_GetValue(&hadc1));

/* Toggle LED at certain frequency */
HAL_GPIO_TogglePin(GPIOC, LED_1_Pin); // Toggle on LED2
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8); // I am not using MPU interface because I'm lazy
i++;

if (i % 2 == 1)
Expand Down
Loading

0 comments on commit 4d14a08

Please sign in to comment.