Explorar o código

* Battery.c: Spannungsmessung gefixt (floating point bug gelöst)
* battery.c: Print output hinzugefügt
* adc.c / adc_hal.c: unnötige funktionen entfernt / refactored

Heinrich Blatt hai 7 meses
pai
achega
fb29f92c12

+ 7 - 2
src/battery_data/battery.c

@@ -85,14 +85,16 @@ static void batteryslots_read_state(uint8_t slot) {
  
     // step 1: read channel 0 (voltage reading of the cell)
     uint16_t bare_voltage = read_adc_channel(slot, 0);
-    battery_slots[slot].measurement.voltage = 100/56*bare_voltage; // We have that voltage divider
+    battery_slots[slot].measurement.voltage = (100.0/56+1)*bare_voltage; // We have that voltage divider
 
     // DAC branch: we can calculate the current based on the shunt
     if (battery_slots[slot].set_current >= 0) {
         // read channel 1 (current reading on charge)
         bare_voltage = read_adc_channel(slot, 1);
         battery_slots[slot].measurement.current = bare_voltage*10;
-
+#ifdef DEBUG_TRACE_CTRL
+        printf("Slot %d voltage: %d mV and %d mA (dac shunt)\n", slot, battery_slots[slot].measurement.voltage, battery_slots[slot].measurement.current);
+#endif
     } else {
         // we are in PWM mode, the shunt is on the high side
         // read channel 2 (voltage reading on 5V side)
@@ -103,6 +105,9 @@ static void batteryslots_read_state(uint8_t slot) {
 
         // calculate the result
         battery_slots[slot].measurement.current = -1*shunt_current*hi_voltage/battery_slots[slot].measurement.voltage;
+#ifdef DEBUG_TRACE_CTRL
+        printf("Slot %d voltage: %d mV and %d mA (pwm shunt) (hi side voltage: %d mV, hi side current: %d mA)\n", slot, battery_slots[slot].measurement.voltage, battery_slots[slot].measurement.current, hi_voltage, shunt_current);
+#endif
     }
 }
 

+ 2 - 3
src/peripherals/adc/adc.c

@@ -35,7 +35,7 @@ uint16_t read_adc_channel(uint8_t slot, uint8_t channel) {
             }
             //printf("Config: Memory address of batteries: %p\n", &batteries[0]);
             adc_hal.configure(slot, &adc_params);
-            if (adc_params.continuous == 1) {
+            if (adc_params.continuous != 1) {
                 // in one shot mode we wait first to get the result
                 adc_state = ADC_STATE_WAIT;
             } else {
@@ -52,8 +52,7 @@ uint16_t read_adc_channel(uint8_t slot, uint8_t channel) {
             break;
 
         case ADC_STATE_READ:
-            uint16_t raw_adc_voltage = adc_hal.read_raw(slot, &adc_params);
-            adc_voltage = adc_hal.get_voltage(raw_adc_voltage, &adc_params);
+            adc_voltage = adc_hal.read_voltage(slot, &adc_params);
 #ifdef DEBUG_ADC
             printf("[ADC] ADC reading completed. Slot %d Channel %d is %d mV.\n", slot, channel, adc_voltage);
 #endif

+ 3 - 35
src/peripherals/adc/adc_hal.c

@@ -189,10 +189,6 @@ static int16_t read_adc_raw_data(uint8_t slot_id, ADC_Params *params) {
     
     i2c_hal.read(ADC_TARGET_BASE_ADDRESS + slot_id);
     while(!controllerRxPackage.complete);
-#ifdef DEBUG_ADC
-    printf("ADC Read:: gRxADClen: %d, gRxADCcount: %d\n", controllerRxPackage.len, controllerRxPackage.count);
-    printf("Bytes: 0x%02X 0x%02X 0x%02X (%d %d %d)\n", controllerRxPackage.packet[0], controllerRxPackage.packet[1],  controllerRxPackage.packet[2], controllerRxPackage.packet[0], controllerRxPackage.packet[1],  controllerRxPackage.packet[2]);
-#endif
     uint8_t msb = controllerRxPackage.packet[0];
     uint8_t lsb = controllerRxPackage.packet[1];
     uint8_t config_adc_byte = controllerRxPackage.packet[2];
@@ -210,7 +206,7 @@ static int16_t read_adc_raw_data(uint8_t slot_id, ADC_Params *params) {
             break;
         case 16: // 16-bit
             raw_adc = ((msb & 0b11111111) << 8) | lsb;
-            if (raw_adc > 65536/2)
+            if (raw_adc > 65535/2)
                 raw_adc -= 65536;
             break;
         default:
@@ -219,41 +215,13 @@ static int16_t read_adc_raw_data(uint8_t slot_id, ADC_Params *params) {
     }
 
 #ifdef DEBUG_ADC
-    printf("MSB: 0x%02X (%d)\n", msb, msb);
-    printf("LSB: 0x%02X (%d)\n", lsb, lsb);
-    printf("Config Byte response: 0x%02X \n", config_adc_byte);
+    printf("Raw ADC: %d, MSB: 0x%02X (%d) LSB: 0x%02X (%d) Config: 0x%02X\n", raw_adc, msb, msb, lsb, lsb, config_adc_byte);
 #endif
     return raw_adc / params->gain;
 }
 
-/* Function to Convert ADC Reading to Voltage */
-static uint16_t adc_voltage(int16_t adc_value, ADC_Params *params) {
-    uint16_t measured_voltage = 0;
-    uint16_t LSB = 0;
-    uint32_t max_adc_value = 1;
-
-    switch (params->resolution) {
-    case 12: // 12-bit
-        max_adc_value = 4095;
-        break;
-    case 14: // 14-bit
-        max_adc_value = 16383;
-        break;
-    case 16: // 16-bit
-        max_adc_value = 65535;
-        break;
-    default:
-        //printf("Error: Unknown ADC Resolution!\n");
-        return 0;
-    }
-    measured_voltage = (((uint32_t)adc_value)) //* 2.7);
-    //printf("Measured ADC voltage: %d\n", measured_voltage);
-    return (uint16_t)measured_voltage;
-}
-
 ADC_Interface adc_hal= {
     .configure= adc_configure,
-    .read_raw= read_adc_raw_data,
+    .read_voltage = read_adc_raw_data,
     .is_ready= adc_is_ready,
-    .get_voltage = adc_voltage
 };

+ 1 - 2
src/peripherals/adc/adc_interface.h

@@ -16,9 +16,8 @@ typedef struct {
 // 14.04: added pointer for ADC_Params
 typedef struct {
     bool (*configure)(uint8_t slot_id, ADC_Params *params);
-    int16_t (*read_raw)(uint8_t slot_id, ADC_Params *params);
+    int16_t (*read_voltage)(uint8_t slot_id, ADC_Params *params);
     bool (*is_ready)(uint8_t slot_id, ADC_Params *params);
-    uint16_t (*get_voltage)(int16_t raw, ADC_Params *params);
 } ADC_Interface;
 
 extern ADC_Interface adc_hal;