当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/573836.html

相关文章:

  • 刷网站建设免费模板下载个人简历
  • MTK平台WiFi学习--BeToCQ 测试须知
  • 【C++】哈希表详解(开放定址法+哈希桶)
  • 住房与住房建设部网站首页热力图 wordpress
  • MySQL 锁详解
  • Spring AOP和事物
  • 系列文章<九>(从LED显示屏的偏色问题问题到手机影像):从LED冬奥会、奥运会及春晚等大屏,到手机小屏,快来挖一挖里面都有什么
  • linux上从 MySQL 官方二进制包安装 MySQL
  • 网络通信---OSI七层模型
  • 淘宝客如何做淘宝客网站网站特色分析
  • 问题:编译jetson-inference,找不到-lnpymath
  • redis集群下如何使用lua脚本
  • 剪贴板管理工具,高效管理复制内容
  • 2.1 python装饰器基础:从语法糖到高阶函数
  • 什么是网站维护中珠宝 网站欣赏
  • 《投资-162》谨慎参与大涨之后的大跌的反弹。
  • 【区块链】一、原理与起源
  • LeetCode算法日记 - Day 94: 最长的斐波那契子序列的长度
  • 站长之家特效网站成都记者留言网站
  • 从咨询师到产品创造者:当AI让‘重复劳动‘变成创业金矿
  • 浅学Java-设计模式
  • Java Vector集合全面解析:线程安全的动态数组
  • FIB为什么要用液态镓来做离子源?
  • zabbix深度监控之邮件告警、微信群和微信告警
  • h5手机网站建设网页制作开版费
  • 企业做网站需要多少钱江西省住房建设厅统计网站
  • 游戏登录接口被爆破?从限流到 AI 防护的完整防御方案
  • 【训练技巧】优化器adam和adamw的公式推导详解及区别
  • 网易云网站开发网页开发的基本过程
  • 网站建设实训报告作业惠民网站建设