Skip to content
Open
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
35 changes: 30 additions & 5 deletions include/IOManagement.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,42 @@

#include <Arduino.h>
#include "STM32TimerInterrupt_Generic.h"
#include "adc.h"

// Inputs
#define BATT_NEG_CONT_MCU PB3
#define ESTOP_MCU PA9
#define BATT_POS_CONT_MCU PA10
#define PPC1_SUPP_INVALID PA12
#define PPC1_DCDC_INVALID PB0
#define MPPT_CONT_MCU PB5
#define MC_CONT_MCU PB4

// Outputs
#define MCU_BATT_EN PA8

#define IO_UPDATE_PERIOD 100000 // us

// TODO: add macros for digital pins

struct Digital_Data {
// TODO: add the digital signals
bool batt_neg_cont : 1;
bool batt_neg_cont : 1; // input
bool estop_mcu : 1; // input
bool batt_pos_cont : 1; // input
bool ppc1_supp_invalid : 1; // input
bool ppc1_dcdc_invalid : 1; // input
bool mcu_batt_en : 1; // output
bool mppt_cont_mcu : 1; // input
bool mc_cont_mcu : 1; // input
};

extern volatile Digital_Data digital_data;

// TODO: add extern volatile floats for analog signals.
// Analog signals
extern volatile float i_12v;
extern volatile float v_12v;
extern volatile float supp_i;
extern volatile float batt_i;
extern volatile float supp_v;

// initialize digital and analog pins
void initIO();
Expand All @@ -22,6 +47,6 @@ void initIO();
void readIO();

// Set the value of output pins
// TODO: add setter functions for output pins.
void set_mcu_batt_en(bool batt_en);

#endif
40 changes: 40 additions & 0 deletions src/IOManagement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,53 @@

volatile Digital_Data digital_data;

volatile float i_12v = 0;
volatile float v_12v = 0;
volatile float supp_i = 0;
volatile float batt_i = 0;
volatile float supp_v = 0;

// Ticker to poll input readings at fixed rate
STM32TimerInterrupt IOTimer(TIM2);

void initIO() {
// Initalize digital pins
pinMode(BATT_NEG_CONT_MCU, INPUT);
pinMode(ESTOP_MCU, INPUT);
pinMode(BATT_POS_CONT_MCU, INPUT);
pinMode(PPC1_SUPP_INVALID, INPUT);
pinMode(PPC1_DCDC_INVALID, INPUT);
pinMode(MCU_BATT_EN, OUTPUT);
pinMode(MPPT_CONT_MCU, INPUT);
pinMode(MC_CONT_MCU, INPUT);

// Initialize analog pins
initADC(ADC1);

if (IOTimer.attachInterruptInterval(IO_UPDATE_PERIOD, readIO)) {
printf("IO timer started\n");
} else {
printf("Failed to start IO timer\n");
}
}

void readIO() {
digital_data.batt_neg_cont = digitalRead(BATT_NEG_CONT_MCU);
digital_data.estop_mcu = digitalRead(ESTOP_MCU);
digital_data.batt_pos_cont = digitalRead(BATT_POS_CONT_MCU);
digital_data.ppc1_supp_invalid = digitalRead(PPC1_SUPP_INVALID);
digital_data.ppc1_dcdc_invalid = digitalRead(PPC1_DCDC_INVALID);
digital_data.mppt_cont_mcu = digitalRead(MPPT_CONT_MCU);
digital_data.mc_cont_mcu = digitalRead(MC_CONT_MCU);

i_12v = readADC(ADC_CHANNEL_12); // PA7
v_12v = readADC(ADC_CHANNEL_11); // PA6
supp_i = readADC(ADC_CHANNEL_9); // PA4
batt_i = readADC(ADC_CHANNEL_6); // PA1
supp_v = readADC(ADC_CHANNEL_5); // PA0
}

void set_mcu_batt_en(bool batt_en) {
digitalWrite(MCU_BATT_EN, batt_en);
digital_data.mcu_batt_en = batt_en;
}
18 changes: 17 additions & 1 deletion src/canPowertrain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,26 @@

CANPowertrain::CANPowertrain(CAN_TypeDef* canPort, CAN_PINS pins, int frequency) : CANManager(canPort, pins, frequency) {};

void CANPowertrain::readHandler(CAN_message_t msg) {
//volatile bool mcu_battery_enable = false;

void CANPowertrain::readHandler(CAN_message_t msg) {
/*uint8_t *data = msg.buf;
switch(msg.id){
case POWERTRAIN_BOOLS:
mcu_battery_enable = (data[0] >> 5) & 1;
break;
default:
break;
}*/
}

void CANPowertrain::sendPowertrainData() {
// TODO: send messages with their respective CAN IDs
this->sendMessage(0x500, (void*)&i_out_12v, sizeof(float));
this->sendMessage(0x501, (void*)&v_out_12v, sizeof(float));
this->sendMessage(0x502, (void*)&supp_i, sizeof(float));
this->sendMessage(0x503, (void*)&batt_i, sizeof(float));
this->sendMessage(0x504, (void*)&supp_v, sizeof(float));
this->sendMessage(0x505, (void*)&digital_data, sizeof(digital_data));

}