C 从外部设备STM32F107读取输入值

C 从外部设备STM32F107读取输入值,c,embedded,microcontroller,processor,stm32,C,Embedded,Microcontroller,Processor,Stm32,我是处理器STM32F107的新手。我必须从一个平衡的外部源读取输入值。该天平位于包含处理器的电路板外部,并通过PA4与之通信 要从天平读取模拟输入,我必须做什么 这是我第一次尝试从天平读取输入 我使用此功能设置ADC: void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; /* PCLK2 is the APB2 clock */ /* ADCCLK = PCLK2/6 = 72/6 = 12MHz*/ RCC_AD

我是处理器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_通道_4)的输出为715760748711759等


我做错了什么?

天平内部有一个称重传感器,它会产生模拟电压。平衡中的处理器是一些没有被利用的(我假设这是因为您的问题中没有太多的细节)。
stm32 f107控制器具有片上ADC(模数转换器)。将称重传感器的输出(来自天平的模拟信号)连接到stm32 f107的模拟输入引脚。将ADC配置为采样并将模拟信号转换为数字信号(使用示例代码作为参考编写软件)

天平内部有一个称重传感器,可产生模拟电压。平衡中的处理器是一些没有被利用的(我假设这是因为您的问题中没有太多的细节)。
stm32 f107控制器具有片上ADC(模数转换器)。将称重传感器的输出(来自天平的模拟信号)连接到stm32 f107的模拟输入引脚。将ADC配置为采样并将模拟信号转换为数字信号(使用示例代码作为参考编写软件)

PA4与ADC12_IN4多路复用(模拟输入,其自身可映射到ADC1或ADC2上的通道4)

对ADC进行编程,在STM32上选择正确的外围时钟和映射多路复用管脚有点复杂,但我强烈建议您使用,它为所有STM32F10x外围设备提供了API,并提供了许多如何使用该库的示例,包括ADC示例

ADC本身可以轮询、中断驱动、使用DMA、软件触发或自由运行、自时钟或从定时器外围设备时钟。选项很多,示例代码只涵盖了一些组合,但这是一个很好的起点。要了解所有选项以及如何在标准外设库中使用这些选项,您需要相当透彻地了解

你可能会发现另一个有用的资源是STM。这允许对多路复用管脚进行可视化配置和分配,并生成可直接使用的源代码


此外,您可能需要在输入端进行一些硬件信号调节,以确保输入在ADC输入的有效和容许范围内。

PA4与ADC12_IN4多路复用(模拟输入本身可以映射到ADC1或ADC2上的通道4)

对ADC进行编程,在STM32上选择正确的外围时钟和映射多路复用管脚有点复杂,但我强烈建议您使用,它为所有STM32F10x外围设备提供了API,并提供了许多如何使用该库的示例,包括ADC示例

ADC本身可以轮询、中断驱动、使用DMA、软件触发或自由运行、自时钟或从定时器外围设备时钟。选项很多,示例代码只涵盖了一些组合,但这是一个很好的起点。要了解所有选项以及如何在标准外设库中使用这些选项,您需要相当透彻地了解

你可能会发现另一个有用的资源是STM。这允许对多路复用管脚进行可视化配置和分配,并生成可直接使用的源代码


此外,您可能需要在输入端进行一些硬件信号调节,以确保输入在ADC输入的有效和容许范围内。

阅读参考手册。阅读参考手册。感谢您的回答。现在更清楚了。在哪里我可以找到一些例子来使用代码作为参考?谢谢你的回答。现在更清楚了。在哪里我可以找到一些示例来使用代码作为参考?