二十三、STM32的ADC(三)(ADC多通道)

前言:在嵌入式开发中,ADC(Analog to Digital Converter,模数转换器)是 MCU 与外部世界沟通的关键模块。

通过 ADC,我们可以将传感器、电位器等模拟信号转换为 MCU 能理解的数字量。

在前面章节中,我们已经了解了 STM32C8T6 的 ADC 基本原理和单通道采样的实现方法。

本章节我们将进一步讲解如何实现 STM32F103C8T6 的 ADC 多通道采样功能,并展示一个完整的示例程序,利用 OLED 显示屏实时显示多个通道的采样值。

下一章节使用DMA的方式转运数据。

目录

一、接线图

二、软件设计思路

三、代码实现

四、实验现象与结果

五、总结


一、接线图

二、软件设计思路

本实验的 ADC 采样逻辑采用软件切换通道轮询采样的方式:

1.初始化 ADC 模块;

2.在主循环中依次切换到不同通道(PA0 ~ PA3);

3.读取每个通道的 ADC 转换值;

4.在 OLED 屏幕上显示实时数据。

该方式虽然没有使用 DMA,但代码逻辑更直观,适合初学者深入理解 ADC 的采样与转换过程。

三、代码实现

1.初始化

ADC 初始化主要步骤如下:

打开 GPIOA 与 ADC1 的时钟;

将 PA0~PA3 配置为模拟输入模式(GPIO_Mode_AIN);

设置 ADC 工作模式为独立模式,右对齐,软件触发;

执行 ADC 校准以提高采样精度。

复制代码
void AD_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); // ADC 时钟为 12MHz

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    ADC_Cmd(ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);
    while (ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1));
}

2.通道采样函数

复制代码
uint16_t AD_GetValue(uint8_t ADC_Channel)
{
    ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    return ADC_GetConversionValue(ADC1);
}

流程:

指定要采样的通道;

软件启动一次采样;

等待采样完成;

返回 12 位 ADC 值(范围 0~4095)。

3.主函数

复制代码
int main(void)
{
    OLED_Init();
    AD_Init();

    OLED_ShowString(1, 1, "AD0:");
    OLED_ShowString(2, 1, "AD1:");
    OLED_ShowString(3, 1, "AD2:");
    OLED_ShowString(4, 1, "AD3:");

    while (1)
    {
        AD0 = AD_GetValue(ADC_Channel_0);
        AD1 = AD_GetValue(ADC_Channel_1);
        AD2 = AD_GetValue(ADC_Channel_2);
        AD3 = AD_GetValue(ADC_Channel_3);

        OLED_ShowNum(1, 5, AD0, 4);
        OLED_ShowNum(2, 5, AD1, 4);
        OLED_ShowNum(3, 5, AD2, 4);
        OLED_ShowNum(4, 5, AD3, 4);

        Delay_ms(100);
    }
}

四、实验现象与结果

程序下载并运行后,OLED 屏幕显示如下格式:

AD0: 1320

AD1: 2750

AD2: 1012

AD3: 3390

当你:

1.用手遮挡光敏传感器;

2.改变温度传感器环境;

3.调节电位器旋钮;

4.在红外传感器前放置障碍物;

OLED 显示的数值会发生明显变化。

这说明多通道采样已正常工作。

五、总结

本实验实现了 STM32F103C8T6 多通道 ADC 采样 的完整流程,采用软件轮询切换通道方式,无需 DMA,即可实现多个传感器的信号采集与显示。

通过本实验你将理解:

1.STM32 ADC 的初始化流程;

2.如何通过 ADC_RegularChannelConfig() 动态切换通道;

3.如何使用 OLED 屏幕实时展示多路采样结果。

相关推荐
深圳光特通信豆子1 小时前
TTL 光模块在工业控制与串口通信中的应用指南(10M BIDI 单模系列)
单片机·嵌入式硬件
桀人1 小时前
SPI概念引入
stm32·单片机·嵌入式硬件
离凌寒2 小时前
一、基于stm32+freertos下LD2410D和R60ADB1两款雷达的使用效果
stm32·单片机·嵌入式硬件
国科安芯2 小时前
商业光学遥感载荷焦平面供电链的低噪声稳压器研究综述——以国科安芯ASP7A84AS型3A低压差线性稳压器为器件级参照
大数据·网络·嵌入式硬件·平面·卫星·商业航天·抗辐射
幼儿园蛋小黄2 小时前
从 STM32N647 的 AI 部署入门嵌入式:一条可落地的学习路线
人工智能·stm32·学习
NamoAmitabha1284 小时前
嵌入式开发中的定时器---deepseek
单片机·嵌入式硬件
福建佰胜张工4 小时前
深度解析 Allen-Bradley 150-B135NBDA 智能电机控制器:选型、参数与工业应用
运维·数据库·单片机·嵌入式硬件·安全·自动化
secondyoung4 小时前
Cortex-R52与TriCore详细对比
arm开发·单片机·嵌入式硬件·mcu
送外卖的工程师5 小时前
STM32仓库环境监测系统
stm32·单片机·嵌入式硬件
芯思路5 小时前
STM32开发学习笔记之十【AI部署】
笔记·stm32·学习