Procházet zdrojové kódy

* Refactoring: Batteries -> BatterySlot
* Einarbeitung vom current_measurement
* Unnötige Types / doppelte Strukturen vom mcu_slave_interface entfernt

Heinrich Blatt před 8 měsíci
rodič
revize
96b028ac2e

+ 2 - 3
main_target.c

@@ -9,7 +9,7 @@
 #include "src/interfaces/i2c_controller_interface.h"
 
 
-#define DELAY_CYCLE  (100000000)
+#define DELAY_CYCLE  (50000000)
 
 volatile bool mcu_CommandPending= false;
 
@@ -156,7 +156,7 @@ int main(void)
 
 {   
     SYSCFG_DL_init();
-    Battery_Init();
+    BatterySlots_Init();
     //I2C_scanBus(I2C_controller_INST);
     NVIC_EnableIRQ(I2C_controller_INST_INT_IRQN);
     NVIC_EnableIRQ(I2C_target_INST_INT_IRQN);
@@ -167,7 +167,6 @@ int main(void)
             printf("Step 1: Calling MCU target interrupt\n");
             mcu_i2c_handle(I2C_target_INST);
             mcu_CommandPending= false;
-            continue;
         }
         
         for(uint8_t slot= 0; slot< NUM_SLOTS; slot++){

+ 7 - 10
src/battery_data/battery.c

@@ -7,19 +7,16 @@
 #define TEMP_THRESHOLD  (460)
 //#define VOLTAGE_THRESHOLD ()
 // for extern -> variable definition
-Battery batteries[NUM_SLOTS];
+BatterySlot battery_slots[NUM_SLOTS];
 /*Initialize battery array and default parameters*/
-void Battery_Init(){
+void BatterySlots_Init() {
+
     for(uint8_t i=0; i< NUM_SLOTS; i++){
 
-        batteries[i].voltage= 0;
-        batteries[i].current= 0;
-        batteries[i].temperature= 0;
-        batteries[i].slot_id= 0;
+        battery_slots[i].measurement.voltage = 0;
+        battery_slots[i].measurement.current = 0;
+        battery_slots[i].measurement.temperature = 0;
+        battery_slots[i].set_current = 0;
     }
 }
 
-
-
-
-

+ 11 - 9
src/battery_data/battery.h

@@ -32,22 +32,24 @@ typedef enum{
     STATE_SOV= 0x01,
     STATE_HOV= 0x02,
     STATE_OVERTEMPERATURE= 0x03,
-}DischargeSafetyCondition;
-
-
-//Battery Structure
+} DischargeSafetyCondition;
 
 typedef struct{
-    int16_t current;
     uint16_t voltage;
+    int16_t current;
     uint16_t temperature;
-    uint8_t slot_id;
-} Battery;
+} BatteryMeasurement;
+
+typedef struct {
+    // for future extension of error states (overtemp etc): add here
+    int16_t set_current;
+    BatteryMeasurement measurement;
+} BatterySlot;
 
 //global battery array declaration: extending visiblity of the variable to multiple source files: variable declaration
-extern Battery batteries[NUM_SLOTS];
+extern BatterySlot battery_slots[NUM_SLOTS];
 
-void Battery_Init();
+void BatterySlots_Init();
 void Battery_Discharge_SafetyCheck(uint8_t slot_id);
 void Battery_ReadState(uint8_t slot_id);
 #endif

+ 20 - 30
src/i2c_comm/mcu_slave_interface.c

@@ -32,24 +32,19 @@ void mcu_i2c_handle(I2C_Regs *i2c) {
       DL_I2C_flushTargetTXFIFO(i2c);
       return;
     }
-    // Struct for voltage, current and temperature
-    BatteryMeasurementData battery_measure;
-    // Battery *battery= &batteries[slot];
-    //  take the updated battery measurement from the battery struct and store
-    //  it in the battery_measure struct
-    battery_measure.voltage = batteries[slot].voltage;
-    battery_measure.current = batteries[slot].current;
-    battery_measure.temperature = batteries[slot].temperature;
+
     // Copying the memory block from battery_measure struct to tx_buffer:
-    memcpy(tx_buffer, &battery_measure, sizeof(BatteryMeasurementData));
-    DL_I2C_fillTargetTXFIFO(i2c, tx_buffer, sizeof(BatteryMeasurementData));
+    // @todo check if this memcpy is even needed, probably 
+    // &battery_slots[slot].measurement can be directly used as buffer for DL_I2C_fillTargetTXFIFO
+    memcpy(tx_buffer, &battery_slots[slot].measurement, sizeof(BatteryMeasurement));
+    DL_I2C_fillTargetTXFIFO(i2c, tx_buffer, sizeof(BatteryMeasurement));
     printf("Battery Measurement Sent to MCU. \n");
     DL_I2C_flushTargetTXFIFO(i2c);
+
   } else if (receivedCommand == CMD_SET_CURRENT) {
-    SetChargeDischargeCurrent set_current;
     // Read incoming bytes from the Controller:
     uint8_t rx_index = 0;
-    while (rx_index < sizeof(SetChargeDischargeCurrent)+1) {
+    while (rx_index < 4) {
       // TODO: Need to have a workaround, currently the code is getting stuck on
       // the first trigger and provides result on the second trigger
       if (!DL_I2C_isTargetRXFIFOEmpty(i2c)) {
@@ -57,30 +52,25 @@ void mcu_i2c_handle(I2C_Regs *i2c) {
         rx_index++;
       }
     }
-    printf("index:%d\n", rx_index);
-    // Byte array received from the Controller will be typecasted to (const
-    // uint8_t *), treats the rx_buffer as an array of READ ONLY bytes because
-    // of the const
-    if (rx_index != sizeof(SetChargeDischargeCurrent)+1) {
-      printf("ERROR: Incomplete I2C Rx: received %d%zu bytes\n", rx_index,
-             sizeof(SetChargeDischargeCurrent)+1);
+    // we expect 4 bytes:
+    // 1. command
+    // 2. slot_id
+    // 3 + 4. current (int16)
+    if (rx_index != 4) {
+      printf("ERROR: Incomplete I2C Rx: received %d%zu bytes\n", rx_index, 4);
       DL_I2C_flushTargetRXFIFO(i2c);
       rx_index = 0;
       return;
     }
-    printf("size: %d", sizeof(SetChargeDischargeCurrent));
-    memcpy(&set_current, (const uint8_t *)rx_buffer+1,
-           sizeof(SetChargeDischargeCurrent));
-    uint8_t slot = set_current.slot_id;
-    int16_t current = set_current.current;
-    printf("Slot id: %d, Current: %" SCNd16 "\n", slot, current);
-    if (current >= 0) {
-      DAC_SingleWrite(slot, current);
-    } else if (current < 0) {
+    uint8_t slot = rx_buffer[1]; // first byte is the slot id (0..3)
+    battery_slots[slot].set_current = *((rx_buffer)+2); // byte 3+4 is the current
+    printf("Slot id: %d, Current: %" SCNd16 "\n", slot, battery_slots[slot].set_current);
+    if (battery_slots[slot].set_current >= 0) {
+      DAC_SingleWrite(slot, battery_slots[slot].set_current);
+    } else if (battery_slots[slot].set_current < 0) {
         
         DL_TimerG_startCounter(PWM_0_INST);
-        DL_TimerG_setCaptureCompareValue(PWM_0_INST, -1*current, DL_TIMER_CC_0_INDEX); // update ccr0 value
-        //DL_TimerG_setCaptureCompareValue(PWM_0_INST, 1000, DL_TIMER_CC_1_INDEX); 
+        DL_TimerG_setCaptureCompareValue(PWM_0_INST, -1*battery_slots[slot].set_current, DL_TIMER_CC_0_INDEX); // update ccr0 value
 
     } else {
       // do nothing, charge or discharge

+ 0 - 13
src/i2c_comm/mcu_slave_interface.h

@@ -14,18 +14,5 @@ typedef enum{
     CMD_SET_HOV_CLEAR= 0x08
 }mcu_I2C_command;
 
-//Command structures:
-typedef struct __attribute__((packed)) {
-    uint8_t slot_id;
-    int16_t current;
-    
-}SetChargeDischargeCurrent;
-
-typedef struct __attribute__((packed)){
-    uint16_t voltage;
-    int16_t current;
-    uint16_t temperature;
-}BatteryMeasurementData;
-
 void mcu_i2c_handle(I2C_Regs *i2c);
 #endif

+ 7 - 7
src/peripherals/adc/adc.c

@@ -37,27 +37,27 @@ void updateADCReading_multichannel(uint8_t slot, uint8_t channel) {
             if (channel == 0) {
 
                 int16_t raw_adc_voltage = adc_hal.read_raw(slot, &adc_params);
-                batteries[slot].voltage =
+                battery_slots[slot].measurement.voltage =
                     adc_hal.convert_voltage(raw_adc_voltage, &adc_params); 
                 adc_state = ADC_STATE_DONE;
-                printf("[ADC] Battery Voltage in slot %d is %d mV.\n", slot, batteries[slot].voltage);
+                printf("[ADC] Battery Voltage in slot %d is %d mV.\n", slot, battery_slots[slot].measurement.voltage);
                 //printf("voltage: Memory address of batteries: %p\n", &batteries[0].voltage);
 
             } else if (channel == 1) {
 
                 int16_t raw_adc_current = adc_hal.read_raw(slot, &adc_params);
-                batteries[slot].current =
+                battery_slots[slot].measurement.current =
                     adc_hal.convert_current(raw_adc_current, &adc_params);
                 adc_state = ADC_STATE_DONE;
-                printf("[ADC] Battery Current in slot %d is %d mA.\n", slot, batteries[slot].current);
+                printf("[ADC] Battery Current in slot %d is %d mA.\n", slot, battery_slots[slot].measurement.current);
                 //printf("current: Memory address of batteries: %p\n", &batteries[0]);
             } else if (channel == 2) {
-
+                // @fixme: this is the third adc channel, needed for current meausrement on disharge mode
                 int16_t raw_adc_voltage = adc_hal.read_raw(slot, &adc_params);
-                batteries[slot].voltage =
+                battery_slots[slot].measurement.voltage =
                     adc_hal.convert_voltage(raw_adc_voltage, &adc_params); 
                 adc_state = ADC_STATE_DONE;
-                printf("[ADC] Ch3 Voltage in slot %d is %d mV.\n", slot, batteries[slot].voltage);
+                printf("[ADC] Ch3 Voltage in slot %d is %d mV.\n", slot, battery_slots[slot].measurement.voltage);
                 //printf("voltage: Memory address of batteries: %p\n", &batteries[0].voltage);
 
             }