프로세서 STM32F107을 사용하여 외부 소스에서 입력 값을 읽어야합니다. 이 저울은 프로세서가 포함 된 보드 외부에 있으며 PA4를 통해 프로세서와 통신합니다.STM32F107에서 읽는 아날로그 입력의 진동을 고정하는 방법
여기 저울에서 입력을 읽으려는 시도가 있습니다.
나는 설정이 기능을 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 측정에서, I 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;
}
평균/필터링을 추가 할 때 ... –
사람들이 코드를 읽으려면 공통적이고 일관된 들여 쓰기 규칙과 약간의 공백 문자가 도움이됩니다. – Clifford