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