stm32f103c8t6使用电位器拟量输入
时间: 2025-05-26 18:24:12 浏览: 10
### STM32F103C8T6 使用电位器进行模拟量输入 (ADC 示例)
STM32F103C8T6 是一款基于 ARM Cortex-M3 的微控制器,其内置的模数转换器(ADC)可以用于测量来自外部传感器或其他设备的模拟信号。通过配置 ADC 来读取电位器的输出电压值,可以实现对电位器位置变化的监测。
以下是具体实现方法:
#### 配置 GPIO 和 ADC
为了使用电位器作为输入源,需要先将电位器的一个端子连接到 VCC 或 GND,另一个端子接地或接电源,中间抽头连接到 MCU 的某个 ADC 输入引脚。例如,在 STM32F103C8T6 上可以选择 PA0 作为 ADC 输入通道之一[^1]。
```c
#include "stm32f1xx_hal.h"
// 初始化 ADC
void MX_ADC_Init(void) {
ADC_HandleTypeDef hadc;
// 启用 ADC 时钟
__HAL_RCC_ADC1_CLK_ENABLE();
// 配置 GPIO 引脚为模拟输入模式
GPIO_InitTypeDef gpio_init;
__HAL_RCC_GPIOA_CLK_ENABLE();
gpio_init.Pin = GPIO_PIN_0; // PA0 连接到电位器
gpio_init.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &gpio_init);
// 配置 ADC 参数
hadc.Instance = ADC1;
hadc.Init.Resolution = ADC_RESOLUTION_12B;
hadc.Init.ScanConvMode = DISABLE;
hadc.Init.ContinuousConvMode = ENABLE;
hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc.Init.NbrOfConversion = 1;
HAL_ADC_Init(&hadc);
// 配置规则组中的通道
ADC_ChannelConfTypeDef sConfig;
sConfig.Channel = ADC_CHANNEL_0; // 对应于 PA0
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES5;
HAL_ADC_ConfigChannel(&hadc, &sConfig);
}
// 获取 ADC 转换结果
uint16_t Read_Potentiometer(void) {
uint32_t adc_value = 0;
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY);
adc_value = HAL_ADC_GetValue(&hadc);
return (uint16_t)(adc_value);
}
```
以上代码完成了以下功能:
- 将 PA0 设置为模拟输入模式。
- 配置 ADC1 并启用连续转换模式。
- 定义了一个函数 `Read_Potentiometer`,该函数返回当前电位器的位置对应的 ADC 数字值[^1]。
#### 数据处理与显示
假设我们希望将 ADC 值映射到一个更直观的形式,比如角度范围 [0°, 360°]。可以通过简单的线性变换来完成这一操作:
```c
#define MAX_ADC_VALUE 4095 // 12-bit ADC 最大值
#define MIN_ANGLE 0 // 输出最小角度
#define MAX_ANGLE 360 // 输出最大角度
float Convert_ADC_to_Angle(uint16_t adc_val) {
float angle = ((float)adc_val / MAX_ADC_VALUE) * (MAX_ANGLE - MIN_ANGLE) + MIN_ANGLE;
return angle;
}
```
此部分实现了从原始 ADC 值到物理意义的角度值之间的转换。
---
###
阅读全文
相关推荐


















