STM32 AD多通道

server/2025/2/4 12:40:30/

接线图:

代码配置:

与单通道相比,将多路选择从初始化函数,调用到功能函数里,在功能函数里以此调用需要使用的通道

整体代码:

//AD多通道
void AD_Init2(void)
{//定义结构体变量GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量ADC_InitTypeDef ADC_InitStructure;  //定义ADC结构体变量//开启RCC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIO A族时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);                   //配置分频器 选择6分频 分频之后ADCCLK = 72MHz/6 = 12MHz//配置GPIOGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//选择模拟输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;    //配置引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速率GPIO_Init(GPIOA, &GPIO_InitStructure);   //GPIO初始化//配置ADC转换器ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//选择连续转换模式还是单次转换 本次单次转换ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right; //指定ADC数据是左对齐还是右对齐 这次选择右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//触发控制的触发源 本次使用软件触发ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//配置独立模式还是双ADC模式 这里选独立模式ADC_InitStructure.ADC_NbrOfChannel = 1;//在扫描模式下,总共会用到几个通道 ADC_InitStructure.ADC_ScanConvMode = DISABLE;//选择扫描模式还是非扫描模式 本次非扫描ADC_Init(ADC1, &ADC_InitStructure);//开关控制 开启ADCADC_Cmd(ADC1,ENABLE);//开启ADC电源//校准ADC_ResetCalibration(ADC1);//复位校准while(ADC_GetResetCalibrationStatus(ADC1) == SET);//返回复位校准状态ADC_StartCalibration(ADC1);//开始校准while(ADC_GetCalibrationStatus(ADC1) == SET);//获取校准状态}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);//获取转换结果}

主函数:

#include "AD.h"
int main(void)
{uint16_t AD0, AD1, AD2, AD3;OLED_Init();AD_Init2();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);}}


http://www.ppmy.cn/server/164884.html

相关文章

C++ Primer 自定义数据结构

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

Java知识速记:Lambda表达式

Java知识速记:Lambda表达式 一、什么是Lambda表达式? Lambda表达式是Java 8引入的一种简洁的表示函数式接口的方法,它使得可以将函数作为参数传递,并且可以在代码中以更简洁的方式实现函数式编程。Lambda表达式的基本语法如下&a…

Linux网络 | 理解运营商与网段划分、理解NAT技术和分片

前言:本节内容结束IP层。 主要带友友们理解一下运营商的作用以及网段划分。 另外也要理解一下分片,什么是分片以及NAT技术。 那么废话不多说, 开始我们的学习吧! ps:本节内容友友们最好了解一下IP层的报文哦&#xff0…

使用Express.js和SQLite3构建简单TODO应用的后端API

使用Express.js和SQLite3构建简单TODO应用的后端API 引言环境准备代码解析1. 导入必要的模块2. 创建Express应用实例3. 设置数据库连接4. 初始化数据库表5. 配置中间件6. 定义数据接口7. 定义路由7.1 获取所有TODO项7.2 创建TODO项7.3 更新TODO项7.4 删除TODO项 8. 启动服务器 …

DeepSeek-R1-Distill-Qwen-1.5B 本地部署报错解决

from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer import torch# 加载模型和分词器 model_name "D:\\Algorithm\\DeepSeek-R1-Distill-Qwen-1.5B\\DeepSeek-R1-Distill-Qwen-1.5B" tokenizer AutoTokenizer.from_pretrained(model_nam…

Mac M1 Comfyui 使用MMAudio遇到的问题解决?

问题1: AssertionError: Torch not compiled with CUDA enabled? 解决办法:修改代码以 CPU 运行 第一步:找到 /ComfyUI/custom_nodes/ComfyUI-MMAudio/mmaudio/ext/autoencoder/vae.py文件中的下面这两行代码 self.data_mean = nn.Buffer(torch.tensor(DATA_MEAN_128D, d…

MATLAB中insertBefore函数用法

目录 语法 说明 示例 在子字符串前插入文本 使用模式在文件名前插入文本 在指定位置前插入子字符串 在字符向量中的指定位置前插入文本 insertBefore函数的功能是在指定的子字符串前插入字符串。 语法 newStr insertBefore(str,pat,newText) newStr insertBefore(st…

4 Spark Streaming

4 Spark Streaming 一级目录1. 整体流程2. 数据抽象3. DStream 相关操作4. Spark Streaming 完成实时需求1) WordCount2) updateStateByKey3) reduceByKeyAndWindow 一级目录 Spark Streaming 是一个基于 Spark Core 之上的实时计算框架,可以从很多数据源消费数据并…