X-Git-Url: http://git.rot13.org/?p=digitaldcpower;a=blobdiff_plain;f=main.c;fp=main.c;h=d3b660e95cca8ca5fe32aaa8be8706ed67066cbf;hp=f51534c549de12e283168d2c88f583daf837518b;hb=9efd83b1f9966687cbdc2288c43ff0cce0890a24;hpb=6ab9cf06f390d47de6fb94a6f1dec40826f5fcea diff --git a/main.c b/main.c index f51534c..d3b660e 100644 --- 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 { @@ -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