这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » STM32F103串口ADC

共1条 1/1 1 跳转至

STM32F103串口ADC

高工
2026-02-20 09:11:43     打赏


使用STM32F103实现串口ADC功能,我先从硬件连接、ADC初始化、串口初始化、数据采集与转换、串口发送五个核心步骤和方法实现。


一、硬件连接

ADC输入信号引脚:选择一个ADC通道对应的GPIO引脚,PA6对应ADC1_IN6,将模拟信号源,电位器连接到该引脚。

串口通信引脚:将USART2的TX引脚PA2连接到PC的串口接收端,RX引脚是PA3.

串口引脚与ADC:

0a57a9f0-20a7-4b13-b3fd-a11d653bd416.png



二、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


四、输出结果

7177822b-cf32-4fd0-92e0-2ae1eaddade7.png








共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]