使用STM32F103实现串口ADC功能,我先从硬件连接、ADC初始化、串口初始化、数据采集与转换、串口发送五个核心步骤和方法实现。
一、硬件连接
ADC输入信号引脚:选择一个ADC通道对应的GPIO引脚,PA6对应ADC1_IN6,将模拟信号源,电位器连接到该引脚。
串口通信引脚:将USART2的TX引脚PA2连接到PC的串口接收端,RX引脚是PA3.
串口引脚与ADC:

二、ADC初始化
使能时钟:
启用ADC1和GPIOA的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
配置GPIO为模拟输入:
将PA0设置为模拟输入模式:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
配置ADC参数:
设置ADC为独立模式、单次转换、软件触发、数据右对齐:
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 单通道
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 单次转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; // 1个转换通道
ADC_Init(ADC1, &ADC_InitStructure);
启用ADC并校准:
启动ADC,执行复位校准和开始校准:
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1)); // 等待复位完成
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1)); // 等待校准完成
三、串口初始化
使能时钟:
启用USART1和GPIOA的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
配置GPIO为串口模式:
将PA9设置为复用推挽输出(TX),PA10设置为浮空输入(RX):
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
数据采集与转换
启动ADC转换:
通过软件触发启动ADC转换:
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
等待转换完成并读取结果:
轮询等待转换完成标志,读取ADC值:
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成
uint16_t adc_value = ADC_GetConversionValue(ADC1); // 读取ADC值
转换为实际电压值:
根据ADC分辨率和参考电压计算实际电压:
float voltage = (adc_value * 3.3f) / 4095; // 假设VREF=3.3V
四、输出结果

我要赚赏金
