embedded - how to fix oscillations of analog input read by STM32F107 -
i have read input value external source balance using processor stm32f107. balance external board contains processor , communicates via pa4.
here first attempt read input balance.
i use function setup adc:
void adc_configuration(void) { adc_inittypedef adc_initstructure; /* pclk2 apb2 clock */ /* adcclk = pclk2/6 = 72/6 = 12mhz*/ rcc_adcclkconfig(rcc_pclk2_div6); /* enable adc1 clock can talk */ rcc_apb2periphclockcmd(rcc_apb2periph_adc1, enable); /* put power-on defaults */ adc_deinit(adc1); /* adc1 configuration ------------------------------------------------------*/ /* adc1 , adc2 operate independently */ adc_initstructure.adc_mode = adc_mode_independent; /* disable scan conversion 1 @ time */ adc_initstructure.adc_scanconvmode = disable; /* don't contimuous conversions - them on demand */ adc_initstructure.adc_continuousconvmode = disable; /* start conversin software, not external trigger */ adc_initstructure.adc_externaltrigconv = adc_externaltrigconv_none; /* conversions 12 bit - put them in lower 12 bits of result */ adc_initstructure.adc_dataalign = adc_dataalign_right; /* how many channels used sequencer */ adc_initstructure.adc_nbrofchannel = 1; /* setup */ adc_init(adc1, &adc_initstructure); /* enable adc1 */ adc_cmd(adc1, enable); /* enable adc1 reset calibaration register */ adc_resetcalibration(adc1); /* check end of adc1 reset calibration register */ while(adc_getresetcalibrationstatus(adc1)); /* start adc1 calibaration */ adc_startcalibration(adc1); /* check end of adc1 calibration */ while(adc_getcalibrationstatus(adc1)); }
and use function input:
u16 readadc1(u8 channel) { adc_regularchannelconfig(adc1, channel, 1, adc_sampletime_1cycles5); // start conversion adc_softwarestartconvcmd(adc1, enable); // wait until conversion completion while(adc_getflagstatus(adc1, adc_flag_eoc) == reset); // conversion value return adc_getconversionvalue(adc1); }
the problem in n measurements of same weight, n different results. example, weight 70kg , output of readadc1(adc_channel_4) 715,760,748,711,759 etc.
what doing wrong?
edit. have added function (that simulates lp filter) stabilize input , works fine. problem how convert value returned form function kilograms. using costant coefficient (determined measuring known object.) gives growing error proportional increasing weight of input. suggest have better conversion?
double fix_oscillations(){ int i; double lpout=0,lpacc=0; int k = 5000; for(i=0;i<5000;i++){ lpacc = lpacc + readadc1(adc_channel_4) - lpout; lpout = lpacc / k; } return lpout; }
it possible either input inherently noisy or noise introduced other equipment. worth observing the signal oscilloscope determine kind of interference or noise on signal since may affect best solution.
if possible should eradicate source of external interference, external analogue signal condition should applied, ideally low-pass filter cut-off frequency of half intended sample rate or less. in position apply filtering in digital domain if necessary. static signals (voltage levels), simple block average suffice, faster moving signals moving average (boxcar filter) better. complex signals need extract frequencies, more complex filters needed, not case in instance.
Comments
Post a Comment