二十三、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 屏幕实时展示多路采样结果。

相关推荐
d111111111d3 小时前
STM32外设学习--TIM定时器--编码器接口(程序)
笔记·stm32·嵌入式硬件·学习
辰哥单片机设计3 小时前
STM32项目分享:水质检测系统(升级版)
stm32·单片机·嵌入式硬件
straw_hat.6 小时前
32HAL——RTC时钟
stm32·学习
电子科技圈7 小时前
XMOS与飞腾云联袂以模块化方案大幅加速音频产品落地
经验分享·嵌入式硬件·mcu·自然语言处理·音视频·腾讯会议·游戏机
Tracy9737 小时前
XMSRC4194_VC1:4通道192KHz ASRC音频采样率转换器产品介绍
嵌入式硬件·音视频·智能硬件·xmos模组固件
xiaotianyun888 小时前
NCP13992 CS 分压计算
单片机·嵌入式硬件·ncp13992
偶像你挑的噻9 小时前
Linux应用开发-17-套接字
linux·网络·stm32·嵌入式硬件
Msshu12310 小时前
PD快充诱骗芯片 XSP15 支持获取快充电压可与外部MCU共用D+D-网络与电脑传输数据
单片机·嵌入式硬件
brave and determined10 小时前
MCU学习Day24——STM32G030多路ADC DMA采集深度解析:完全可配置序列器与不完全可配置序列器的陷阱与抉择
stm32·单片机·嵌入式硬件·dma·adc·hal·多通道采集