2013-07-25 3 views
0

프로세서 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 측정에서 N 개의 다른 결과를 얻습니다. 예를 들어, 무게가 70kg이고 readADC1 (ADC_Channel_4)의 출력은 715,760,748,711,759입니다.

내가 뭘 잘못하고 있니?

+0

참조 설명서를 읽으십시오. – starblue

답변

2

저울에는 내부에 로드셀이있어 아날로그 전압이 생성됩니다. 저울에있는 프로세서는 활용되지 않는 방법입니다 (나는 당신의 질문에 많은 세부 사항이 없기 때문에 이것을 가정합니다). stm32 f107 컨트롤러에는 온칩 ADC (아날로그 - 디지털 변환기)가 있습니다. 로드 셀의 출력 (저울에서 오는 아날로그 신호)을 stm32 f107의 아날로그 입력 핀에 연결하십시오. 아날로그 신호를 샘플링하여 디지털로 변환하도록 ADC를 구성하십시오 (예제 코드를 참조로 사용하여 소프트웨어를 작성하십시오).

+0

답변 해 주셔서 감사합니다. 이제는 더 분명합니다. 코드를 참조로 사용할 몇 가지 예를 어디에서 찾을 수 있습니까? –

2

PA4는 ADC12_IN4 (ADC1 또는 ADC2의 채널 4에 자체적으로 매핑 될 수있는 아날로그 입력)로 다중화됩니다.

ADC를 프로그래밍 할 때 STM32에서 정확한 주변 클럭킹과 멀티플렉싱 핀을 선택하는 것은 다소 복잡하지만 모든 STM32F10x 주변 장치에 API를 제공하는 STM32F10x Standard Peripheral Library을 활용할 것을 강력히 권장한다. 라이브러리, ADC 예제 포함.

ADC 자체는 폴링, 인터럽트 구동, DMA 사용, 소프트웨어 트리거 또는 프리 런, 셀프 클록 킹 또는 타이머 주변 장치로부터 클록 킹 될 수 있습니다. 옵션은 다양하며, 일부 조합 만 예제 코드에 포함되어 있지만 그럼에도 불구하고 시작하기에 좋은 곳입니다. 모든 옵션과 표준 주변 장치 라이브러리와 함께 사용하는 방법을 이해하려면 Reference Manual에 대해 충분히 이해해야합니다.

유용 할만한 또 다른 리소스는 STM의 MicroXplorer입니다. 이를 통해 다중화 된 핀을 시각적으로 구성하고 할당 할 수 있으며 직접 사용할 수있는 소스 코드를 생성 할 수 있습니다.

또한 입력이 하드웨어 입력 신호가 ADC 입력의 유효 범위와 허용 범위 내에 있는지 확인하려면 입력 신호에 하드웨어 신호 컨디셔닝이 필요할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 매우 명확하고 유용합니다. –