stm32-模拟数字转化器ADC

















接线图:

#include "stm32f10x.h" // Device header//1: 开启RCC时钟,包括ADC和GPIO的时钟//2:配置GPIO将GPIO配置为模拟输入模式//3:配置多路开关将左边的通道接入到规则组中//4:配置ADC转换器,单次转换,连续转换,扫描还是非扫描//5:开关控制调用ADC_COM参数ADC配置完成就能正常工作
void AD_Init(void){
// void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); RCC_ADCCLKConfig配置ADCCLK分频器
// void ADC_DeInit(ADC_TypeDef* ADCx); 恢复缺省配置
// void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); Init初始化
// void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); 结构体初始化
// void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); 给ADC上电
// void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); 开始DMA输出信号
// void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); // 中断输出控制
// void ADC_ResetCalibration(ADC_TypeDef* ADCx); 复位校准
// FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);获取复位校准状态
// void ADC_StartCalibration(ADC_TypeDef* ADCx); 开始校准
// FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx); 获取开始校准状态
// void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); ADC软件开始转换函数用于软件触发的函数
// FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); ADC获取软件开始转换状态
// void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); 配置间断模式每隔几个通道间断一次
// void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); 是否启用间断模式
// void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); ADC规则组通道配置
// void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); ADC外部触发转换控制是否允许外部触发转换
// uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); ADC获取外部触发转换值
// uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); 获取ADC转换的数据寄存器,读取电平转换结果需要使用这个函数
// uint32_t ADC_GetDualModeConversionValue(void); ADC_获取双模式转换值,ADC双模式读取转换结果的函数
// 以下的三个函数是对模拟看门狗进行配置的函数:第一个是是否启动模拟看门狗,第二个是配置高低阈值,第三个是配置看门的通道
// void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
// void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
// void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
// void ADC_TempSensorVrefintCmd(FunctionalState NewState); ADC温度传感器,内部参考电压控制
// 以下的4个函数:第一个是获取标志位状态,第二个是清除标志位,第三个获取中断状态,第四个清除中断挂起位
// FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
// void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
// ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);
// void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);}
AD.C代码
#include "stm32f10x.h" // Device header// 1: 开启RCC时钟,包括ADC和GPIO的时钟// 2:配置GPIO将GPIO配置为模拟输入模式// 3:配置多路开关将左边的通道接入到规则组中// 4:配置ADC转换器,单次转换,连续转换,扫描还是非扫描// 5:开关控制调用ADC_COM参数ADC配置完成就能正常工作void AD_Init(void){// 开启ADC的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);// 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 配置ADC_CLK,72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);// 配置GPIOGPIO_InitTypeDef GPIO_InitStructre;// 将GPIO的模式引用出来GPIO_InitStructre.GPIO_Mode =GPIO_Mode_AIN; // 选择GPIO的模式,设置为AN模拟输入的模式在AIN模式下GPIO口是没有效果的GPIO_InitStructre.GPIO_Pin = GPIO_Pin_0; // 选择GPIO的输出模式,选择输出的管脚GPIO_InitStructre.GPIO_Speed = GPIO_Speed_50MHz; // 选择GPIO的时钟频率GPIO_Init(GPIOA,&GPIO_InitStructre); // 初始化GPIO// 第二步 ---》 选择规则组的输入通道,参数二:指定通道,参数三:规则组序列器里面的次序1-16之间,参数4:指定通道的采样时间ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); // 第三步 ---> 使用结构体初始化ADCADC_InitTypeDef ADC_InitStructure;// 引出结构体成员ADC_InitStructure.ADC_ContinuousConvMode = DISABLE ; // 配置扫描的模式ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 配置ADC的数据对齐方式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 配置ADC的外部触发转换选择:这里使用内部软件触发的方式ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 配置ADC的工作模式为独立模式ADC_InitStructure.ADC_NbrOfChannel = 1; // 配置通道数目ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 配置扫描的模式ADC_Init(ADC1,&ADC_InitStructure);// 以下还可以配置中断和模拟看门狗,根据自己的需求进行配置// 开启ADC设置,第一个ENABLE第二个开启ADC的电源ADC_Cmd(ADC1,ENABLE); // 对ADC进行校准,这里分别有四个函数可以进行配置ADC_ResetCalibration(ADC1); // 复位校准while(ADC_GetResetCalibrationStatus(ADC1) == SET); // 返回复位校准的状态ADC_StartCalibration(ADC1); // 启动校准while(ADC_GetCalibrationStatus(ADC1) == SET); // 获取校准后的状态 }
uint16_t AD_GetValue(void){// 1: 软件触发转换 2:等待触发完成也就是等待EOC标志位设置为1,3:读取ADC数据寄存器ADC_SoftwareStartConvCmd(ADC1,ENABLE); // 获取标志位状态共有5个参数,// 第一个参数AWD模拟看门狗标志位,// 第二个参数EOC规则组转换完成标志位,// 第三个参数JEOC注入组转换完成标志位,// 第四个参数:JSTRT:注入组开始转换标志位,// 第五个参数:STRT规则组开始转换标志位while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 这里添加一个while空循环实现一个等待的过程// 获取ADC的结果--->使用ADC获取转换值的方式return ADC_GetConversionValue(ADC1);
}
AD.H代码
#ifndef __AD_H
#define __AD_Huint16_t AD_GetValue(void);
void AD_Init(void);#endif
main函数代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"uint16_t ADValue;
float Votage;
int main(void)
{// 初始化oledOLED_Init();AD_Init();OLED_ShowString(1,1,"ADVALUE!");OLED_ShowString(2,1,"Votage:0.00V");while (1){ADValue = AD_GetValue();Votage = (float)ADValue / 4095 * 3.3;OLED_ShowNum(1, 9, ADValue, 4); OLED_ShowNum(2, 9, Votage, 1); OLED_ShowNum(2, 11, (int)(Votage * 100) % 100, 1);Delay_ms(100);}
}
切换为连续转换模式需要修改的代码



ADC多通道实现
接线图:


#include "stm32f10x.h" // Device header// 1: 开启RCC时钟,包括ADC和GPIO的时钟// 2:配置GPIO将GPIO配置为模拟输入模式// 3:配置多路开关将左边的通道接入到规则组中// 4:配置ADC转换器,单次转换,连续转换,扫描还是非扫描// 5:开关控制调用ADC_COM参数ADC配置完成就能正常工作void AD_Init(void){// 开启ADC的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);// 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 配置ADC_CLK,72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);// 配置GPIOGPIO_InitTypeDef GPIO_InitStructre;// 将GPIO的模式引用出来GPIO_InitStructre.GPIO_Mode =GPIO_Mode_AIN; // 选择GPIO的模式,设置为AN模拟输入的模式在AIN模式下GPIO口是没有效果的GPIO_InitStructre.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3; // 选择GPIO的输出模式,选择输出的管脚GPIO_InitStructre.GPIO_Speed = GPIO_Speed_50MHz; // 选择GPIO的时钟频率GPIO_Init(GPIOA,&GPIO_InitStructre); // 初始化GPIO// 第三步 ---> 使用结构体初始化ADCADC_InitTypeDef ADC_InitStructure;// 引出结构体成员ADC_InitStructure.ADC_ContinuousConvMode = ENABLE ; // 配置扫描的模式ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 配置ADC的数据对齐方式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 配置ADC的外部触发转换选择:这里使用内部软件触发的方式ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 配置ADC的工作模式为独立模式ADC_InitStructure.ADC_NbrOfChannel = 1; // 配置通道数目ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 配置扫描的模式ADC_Init(ADC1,&ADC_InitStructure);// 以下还可以配置中断和模拟看门狗,根据自己的需求进行配置// 开启ADC设置,第一个ENABLE第二个开启ADC的电源ADC_Cmd(ADC1,ENABLE); // 对ADC进行校准,这里分别有四个函数可以进行配置ADC_ResetCalibration(ADC1); // 复位校准while(ADC_GetResetCalibrationStatus(ADC1) == SET); // 返回复位校准的状态ADC_StartCalibration(ADC1); // 启动校准while(ADC_GetCalibrationStatus(ADC1) == SET); // 获取校准后的状态 // 1: 软件触发转换 2:等待触发完成也就是等待EOC标志位设置为1,3:读取ADC数据寄存器ADC_SoftwareStartConvCmd(ADC1,ENABLE);}
uint16_t AD_GetValue(uint8_t ADC_Channel){// 第二步 ---》 选择规则组的输入通道,参数二:指定通道,参数三:规则组序列器里面的次序1-16之间,参数4:指定通道的采样时间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);
}
main函数部分代码编译和下载
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"uint16_t AD0,AD1,AD2,AD3;
float Votage;
int main(void)
{// 初始化oledOLED_Init();AD_Init();OLED_ShowString(1,1,"AD0:");OLED_ShowString(2,1,"AD1:");OLED_ShowString(3,1,"AD3:");OLED_ShowString(4,1,"AD4:");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);}
}
相关文章:
stm32-模拟数字转化器ADC
接线图: #include "stm32f10x.h" // Device header//1: 开启RCC时钟,包括ADC和GPIO的时钟//2:配置GPIO将GPIO配置为模拟输入模式//3:配置多路开关将左边的通道接入到规则组中//4:配置ADC转…...
[Repo Git] manifests的写法
manifests是个啥 在Repo中manifests描述了Repo客户端的结构,也就是可以从manifests中知道各个模块的代码应该从代码管理仓库当中哪个位置去获取。 manifests的基本结构是一个Git存储库,在顶层目录中持有一个default.xml文件。 由于m…...
位置编码与长度外推
位置编码 位置编码从前到后包括:绝对位置编码、余弦位置编码、旋转位置编码、ALiBi相对位置编码。 1 绝对位置编码(Absolute Positional Encoding) 应用的模型:BERT、GPT等Transformer基础模型广泛使用绝对位置编码来处理序列数据。 算法思想:绝对位置编码通过为序列中的…...
Linux信号补充——信号发送和保存
三、信号的发送与保存 3.1信号的发送 必须有操作系统来保存信号,因为他是管理者; 信号给进程的task_struct发送信号,在task_struct中维护了一个整数signal有0-31位,共32个bit位;对于信号的管理使用的是位图结…...
Vue3 中应该使用 Ref 还是 Reactive?
一、引言 在Vue 3中,构建响应式数据结构是构建用户界面和交互体验的核心部分。而在创建这些响应式数据时,我们有两个主要工具:reactive和ref。选择使用哪一个,实际上取决于你的数据结构和访问需求。 reactive主要用于处理复杂的数…...
红外相机和RGB相机标定:实现两种模态数据融合
1. 前期准备 RGB相机:森云智能SG2-IMX390,1个红外相机:艾睿光电IR-Pilot 640X-32G,1个红外标定板:https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…...
前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】
目录 1、图片懒加载 步骤一:自定义全局指令 步骤二:代码中使用 编辑步骤三:效果查看 步骤四:代码优化 2、封装组件案例-传对象 3、路由配置——tab标签 4、根据tab标签添加面包屑 4.1、实现 4.2、bug:需要…...
【MySQL】2.MySQL数据库的基本操作
目录 数据库基本操作 查看数据库信息 查看数据库结构 显示数据表的结构(字段) 常用的数据类型 数据库管理操作 SQL语句概述 SQL分类 1.DDL:数据定义语言 1.1创建数据库和表 创建数据库 创建数据表 1.2删除数据库和表 删除数据表…...
常见技术难点及方案
1. 分布式锁 1.1 难点 1.1.1 锁延期 同一时间内不允许多个客户端同时获得锁; 1.1.2 防止死锁 需要确保在任何故障场景下,都不会出现死锁; 1.2.3 可重入 特殊的锁机制,它允许同一个线程多次获取同一个锁而不会被阻塞。 1.2…...
c#关键字 static
static 修饰符可用于声明 static 类。 在类、接口和结构中,可以将 static 修饰符添加到字段、方法、属性、运算符、事件和构造函数。 static 修饰符不能用于索引器或终结器 尽管类的实例包含该类的所有实例字段的单独副本,但每个 static 字段只有一个副…...
redis 如何保证数据同步(数据变化时)
redis 如何保证数据同步(数据变化时) 思路 1.新增、删除和修改都先对数据库进行操作,这时数据库的数据将域缓存中数据不同。 2.数据库进行变动后,返回结果,根据返回的结果判断数据库操作是否成功。 3.如果数据库操…...
Ubuntu18.04桌面版设置静态IP地址
引用: Ubuntu配置静态IP_ubuntu配置静态ip地址-CSDN博客 正文 默认Unbuntu 18.04 Desktop桌面版使用 netplan 管理网卡网络地址。使用Unbuntu 18.04 桌面版配置,可以通过桌面上的设置图标配置网卡的静态IP地址。 点击桌面右上角下拉框,点击“设置”按…...
Aztec的客户端证明
1. 引言 隐私保护 zk-rollup 的证明生成与通用 zk-rollup 的证明生成有很大不同。原因是给定交易中存在特定数据(由私有函数处理),我们希望保持完全私有。在本文中,我们探讨了用于证明私有函数正确执行的客户端证明生成ÿ…...
面试官:小伙子知道synchronized的优化过程吗?我:嘚吧嘚吧嘚,面试官:出去!
写在开头 面试官:小伙子,多线程中锁用过吗? 我:那是自然! 面试官:那你知道synchronized的优化吗? 我:synchronized作为重锁,开销大,在早期不被推荐使用&…...
100天精通风控建模(原理+Python实现)——第23天:风控建模中的贝叶斯优化是什么?怎么实现?
在当今风险多变的环境下,风控建模已经成为金融机构、企业等组织的核心工作之一。在各大银行和公司都实际运用于业务,用于营销和风险控制等。本文以视频的形式阐述风控建模中的召回率是什么,怎么实现。并提供风控建模原理和Python实现文章清单。 之前已经阐述了100天精通…...
Http 超文本传输协议基本概念学习摘录
目录 HTTP协议 超文本传输协议 HyperText超文本 HTML超文本标记语言 HTTP协议原理 请求发送 服务器处理 响应发送 连接关闭或保持 HTTP协议版本 HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2 HTTP/3 HTTP请求方法 GET POST PUT DELETE HEAD OPTIONS HTTP请求头字…...
模拟-算法
文章目录 替换所有的问号提莫攻击Z字形变换外观数列数青蛙 替换所有的问号 算法思路: 从前往后遍历整个字符串,找到问号之后,就遍历 a ~ z 去尝试替换即可。 class Solution {public String modifyString(String s) {char[] ss s.toCharA…...
深入了解鸿鹄工程项目管理系统源码:功能清单与项目模块的深度解析
工程项目管理软件是现代项目管理中不可或缺的工具,它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件,该软件采用先进的Vue、Uniapp、Layui等技术框架,涵盖了项目策划决策、规划设计、施工建设到竣工交付…...
Unbuntu20.04 git push和pull相关问题
文章目录 Unbuntu20.04 git push和pull使用1.下载[Git工具包](https://git-scm.com/downloads)2.建立本地仓库3.将本地仓库与github远程仓库关联4.将本地仓库文件上传到github远程仓…...
hive SQL 移位、运算符、REGEXP正则等常用函数
orderflag & shiftleft(1,14) shiftleft(1,14) SQL中使用的运算符号详解_sql中各种符号-CSDN博客 Hive函数_hive shift-CSDN博客 (内建函数(类型排序)_云原生大数据计算服务 MaxCompute(MaxCompute)-阿里云帮助中心)...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
