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>
{
}
}
-// 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;
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);
lcd_puts(" ");
}
+ update_controlloop_targets();
+
// the buttons must be responsive but they must not
// scroll too fast if pressed permanently
if (check_buttons()==0){
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