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

相关推荐
周周记笔记8 小时前
ESP32 初识:WiFi MCU 新时代与国产芯片生态(一)
单片机·嵌入式硬件
驴友花雕9 小时前
【花雕学编程】Arduino BLDC 之群体机器人协同探索
c++·单片机·嵌入式硬件·arduino bldc·群体机器人协同探索
驴友花雕9 小时前
【花雕学编程】Arduino BLDC 之仿人机器人膝关节稳定系统
c++·单片机·嵌入式硬件·arduino bldc·仿人机器人膝关节稳定系统
Zeku9 小时前
20260110 - Linux 驱动开发学习笔记:上下文、中断与休眠
stm32·freertos·linux驱动开发·linux应用开发
linweidong14 小时前
嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
stm32·单片机·算法
Zero_Era15 小时前
高性价比安全MCU——LKT6830C
单片机·嵌入式硬件·安全
国科安芯16 小时前
卫星通讯导航FPGA供电单元DCDC芯片ASP4644S2B可靠性分析
单片机·嵌入式硬件·fpga开发·架构·安全性测试
知南x16 小时前
【STM32MP157 视频监控项目】(2) 移植 Nginx
stm32·nginx·音视频
易水寒陈18 小时前
单片机实现的工厂模式
单片机
别了,李亚普诺夫19 小时前
PCB设计大师篇笔记
笔记·嵌入式硬件·学习