bug fix for the power-supply firmware
[digitaldcpower] / main.c
diff --git a/main.c b/main.c
index f51534c..d3b660e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -53,6 +53,52 @@ static uint8_t uartstrpos=0;
 static uint8_t uart_has_one_line=0;
 #endif
 
+// convert voltage values to adc values, disp=10 is 1.0V
+// ADC for voltage is 11bit:
+static int16_t disp_u_to_adc(int16_t disp){
+        return((int16_t)(((float)disp * 204.7) / (ADC_REF * U_DIVIDER )));
+}
+// calculate the needed adc offset for voltage drop on the
+// current measurement shunt (the shunt has about 0.75 Ohm =1/1.33 Ohm)
+// use 1/1.2 instead of 1/1.3 because cables and connectors have as well
+// a loss.
+static int16_t disp_i_to_u_adc_offset(int16_t disp){
+        return(disp_u_to_adc(disp/12));
+}
+// convert adc values to voltage values, disp=10 is 1.0V
+// disp_i_val is needed to calculate the offset for the voltage drop over
+// the current measurement shunt, voltage measurement is 11bit
+static int16_t adc_u_to_disp(int16_t adcunits,int16_t disp_i_val){
+        int16_t adcdrop;
+        adcdrop=disp_i_to_u_adc_offset(disp_i_val);
+        if (adcunits < adcdrop){
+                return(0);
+        }
+        adcunits=adcunits-adcdrop;
+        return((int16_t)((((float)adcunits /204.7)* ADC_REF * U_DIVIDER)+0.5));
+}
+// convert adc values to current values, disp=10 needed to be printed
+// by the printing function as 0.10 A, current measurement is 10bit
+static int16_t disp_i_to_adc(int16_t disp){
+        return((int16_t) (((disp * 10.23)* I_RESISTOR) / ADC_REF));
+}
+// convert adc values to current values, disp=10 needed to be printed
+// by the printing function as 0.10 A, current measurement is 10bit
+static int16_t adc_i_to_disp(int16_t adcunits){
+        return((int16_t) (((float)adcunits* ADC_REF)/(10.23 * I_RESISTOR)+0.5));
+}
+
+static void update_controlloop_targets(void){
+        // current
+        measured_val[0]=adc_i_to_disp(getanalogresult(0));
+        set_val_adcUnits[0]=disp_i_to_adc(set_val[0]);
+        set_target_adc_val(0,set_val_adcUnits[0]);
+        // voltage
+        measured_val[1]=adc_u_to_disp(getanalogresult(1),measured_val[0]);
+        set_val_adcUnits[1]=disp_u_to_adc(set_val[1])+disp_i_to_u_adc_offset(measured_val[0]);
+        set_target_adc_val(1,set_val_adcUnits[1]);
+}
+
 void delay_ms_uartcheck(uint8_t ms)
 // delay for a minimum of <ms> 
 {
@@ -148,41 +194,6 @@ static void int_to_dispstr(uint16_t inum,char *outbuf,int8_t decimalpoint_pos){
         }
 }
 
-// convert voltage values to adc values, disp=10 is 1.0V
-// ADC for voltage is 11bit:
-static int16_t disp_u_to_adc(int16_t disp){
-        return((int16_t)(((float)disp * 204.7) / (ADC_REF * U_DIVIDER )));
-}
-// calculate the needed adc offset for voltage drop on the
-// current measurement shunt (the shunt has about 0.75 Ohm =1/1.33 Ohm)
-// use 1/1.2 instead of 1/1.3 because cables and connectors have as well
-// a loss.
-static int16_t disp_i_to_u_adc_offset(int16_t disp){
-        return(disp_u_to_adc(disp/12));
-}
-// convert adc values to voltage values, disp=10 is 1.0V
-// disp_i_val is needed to calculate the offset for the voltage drop over
-// the current measurement shunt, voltage measurement is 11bit
-static int16_t adc_u_to_disp(int16_t adcunits,int16_t disp_i_val){
-        int16_t adcdrop;
-        adcdrop=disp_i_to_u_adc_offset(disp_i_val);
-        if (adcunits < adcdrop){
-                return(0);
-        }
-        adcunits=adcunits-adcdrop;
-        return((int16_t)((((float)adcunits /204.7)* ADC_REF * U_DIVIDER)+0.5));
-}
-// convert adc values to current values, disp=10 needed to be printed
-// by the printing function as 0.10 A, current measurement is 10bit
-static int16_t disp_i_to_adc(int16_t disp){
-        return((int16_t) (((disp * 10.23)* I_RESISTOR) / ADC_REF));
-}
-// convert adc values to current values, disp=10 needed to be printed
-// by the printing function as 0.10 A, current measurement is 10bit
-static int16_t adc_i_to_disp(int16_t adcunits){
-        return((int16_t) (((float)adcunits* ADC_REF)/(10.23 * I_RESISTOR)+0.5));
-}
-
 static void store_permanent(void){
         int16_t tmp;
         uint8_t changeflag=1;
@@ -364,17 +375,9 @@ int main(void)
                         i=0;
                 }
                 lcd_home();
-                // current
-                measured_val[0]=adc_i_to_disp(getanalogresult(0));
-                set_val_adcUnits[0]=disp_i_to_adc(set_val[0]);
-                set_target_adc_val(0,set_val_adcUnits[0]);
-                // voltage
-                measured_val[1]=adc_u_to_disp(getanalogresult(1),measured_val[0]);
-                set_val_adcUnits[1]=disp_u_to_adc(set_val[1])+disp_i_to_u_adc_offset(measured_val[0]);
-                set_target_adc_val(1,set_val_adcUnits[1]);
+                update_controlloop_targets();
                 ilimit=is_current_limit();
 
-                        
                 // voltage
 #ifdef DEBUGDISP
                 itoa(getanalogresult(1),out_buf,10);
@@ -421,6 +424,8 @@ int main(void)
                         lcd_puts("   ");
                 }
 
+                update_controlloop_targets();
+
                 // the buttons must be responsive but they must not 
                 // scroll too fast if pressed permanently
                 if (check_buttons()==0){
@@ -432,10 +437,10 @@ int main(void)
                                 delay_ms_uartcheck(80);
                         }else{
                                 bpress++;
-                                delay_ms_uartcheck(180);
-                                delay_ms_uartcheck(180);
-                                delay_ms_uartcheck(180);
-                                delay_ms_uartcheck(180);
+                                delay_ms_uartcheck(160);
+                                delay_ms_uartcheck(160);
+                                delay_ms_uartcheck(160);
+                                delay_ms_uartcheck(160);
                         }
                 }else{
                         // button press