我必须使用处理器 STM32F107 从平衡的外部源读取输入值。该天平位于包含处理器的电路板外部,并通过 PA4 与其通信。
这是我第一次尝试从天平读取输入。
我使用这个函数来设置 ADC:
void ADC_Configuration(void) {
ADC_InitTypeDef ADC_InitStructure;
/* PCLK2 is the APB2 clock */
/* ADCCLK = PCLK2/6 = 72/6 = 12MHz*/
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
/* Enable ADC1 clock so that we can talk to it */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* Put everything back to power-on defaults */
ADC_DeInit(ADC1);
/* ADC1 Configuration ------------------------------------------------------*/
/* ADC1 and ADC2 operate independently */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
/* Disable the scan conversion so we do one at a time */
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
/* Don't do contimuous conversions - do them on demand */
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
/* Start conversin by software, not an external trigger */
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
/* Conversions are 12 bit - put them in the lower 12 bits of the result */
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
/* Say how many channels would be used by the sequencer */
ADC_InitStructure.ADC_NbrOfChannel = 1;
/* Now do the setup */
ADC_Init(ADC1, &ADC_InitStructure);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
}
我使用这个函数来获取输入:
u16 readADC1(u8 channel) {
ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_1Cycles5);
// Start the conversion
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
// Wait until conversion completion
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
// Get the conversion value
return ADC_GetConversionValue(ADC1);
}
问题是,在相同重量的 N 次测量中,我得到 N 种不同的结果。例如,重量为 70kg,readADC1(ADC_Channel_4) 的输出为 715,760,748,711,759 等。
我究竟做错了什么?
编辑。我添加了这个函数(模拟 lp 过滤器)来稳定输入并且它工作正常。问题是如何将此函数返回的值转换为千克。使用一个常数系数(通过测量一个已知对象来确定)给出一个与输入权重成正比的增长误差。任何建议有更好的转换?
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;
}