STM32——ADC
目录
1、ADC的介绍
2、ADC主要特征
3、ADC结构与引脚
4、ADC配置流程
5、示例(光敏电阻的ADC采样)
6、提示
7、结语:
1、ADC的介绍
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
2、ADC主要特征
● 12位分辨率
● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断
● 单次和连续转换模式
● 从通道0到通道n的自动扫描模式
● 自校准
● 带内嵌数据一致性的数据对齐
● 采样间隔可以按通道分别编程
● 规则转换和注入转换均有外部触发选项
● 间断模式
● 双重模式(带2个或以上ADC的器件)
● ADC转换时间: ─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs) ─ STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz为1.55μs) ─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs ─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
● ADC供电要求:2.4V到3.6V
● ADC输入范围:VREF- ≤ VIN ≤ VREF+
● 规则通道转换期间有DMA请求产生。
3、ADC结构与引脚
4、ADC配置流程
-
时钟使能: 首先需要使能ADC的时钟。这通常涉及到修改RCC寄存器,具体操作取决于你的芯片型号。例如,
RCC_APB2Periph_ADC1
(假设ADC1)。 你需要查阅你的芯片数据手册确定正确的寄存器和位。 -
ADC复位: 通常需要复位ADC,这可以通过设置相应的寄存器位来实现。
-
ADC配置: 这一步是最关键的,你需要配置ADC的各个参数,这主要通过操作ADC的寄存器来完成。 重要的寄存器包括:
- ADC_CR1 (控制寄存器1): 配置ADC的模式(单次转换、连续转换)、扫描模式、数据对齐等。
- ADC_CR2 (控制寄存器2): 配置ADC的触发方式、转换完成中断等。
- ADC_SMPR1/SMPR2 (采样时间寄存器): 配置ADC的采样时间。
- ADC_SQR1/SQR3 (正则顺序寄存器): 配置ADC的转换顺序,如果进行多通道转换。
- ADC_DR (数据寄存器): 读取转换结果。
- ADC_CSR (校准状态寄存器): 进行ADC校准。
-
通道选择: 选择要使用的ADC通道。这通常涉及到设置
ADC_SQR1
或ADC_SQR3
寄存器。 -
ADC校准 (可选): 为了提高精度,可以进行ADC校准。 这通常涉及到设置
ADC_CR2
寄存器中的CAL
位。 -
ADC使能: 使能ADC,这通常涉及到设置
ADC_CR2
寄存器中的ADON
位。 -
启动转换: 启动ADC转换,这通常涉及到设置
ADC_CR2
寄存器中的SWSTART
位,或者通过触发方式启动转换。 -
读取数据: 从
ADC_DR
寄存器读取转换结果。 -
ADC关闭 (可选): 转换完成后,可以关闭ADC以节省功耗。
5、示例(光敏电阻的ADC采样)
ADC.h
#ifndef _ADC_H_
#define _ADC_H_void Light_Init(void);
int Light_Getval(void);#endif
ADC.c
#include "ADC.h"
#include "stm32f10x.h"//PB0--ADC1_IN8
void Light_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);GPIO_InitTypeDef GPIOB_Struct;GPIOB_Struct.GPIO_Mode = GPIO_Mode_AIN;GPIOB_Struct.GPIO_Pin = GPIO_Pin_0;//GPIOB_Struct.GPIO_SpeedGPIO_Init(GPIOB,&GPIOB_Struct);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//6分频 clock=12mhzADC_InitTypeDef ADC_Struct;ADC_Struct.ADC_ContinuousConvMode = DISABLE;ADC_Struct.ADC_DataAlign = ADC_DataAlign_Right;ADC_Struct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_Struct.ADC_Mode = ADC_Mode_Independent;ADC_Struct.ADC_NbrOfChannel = 1;ADC_Struct.ADC_ScanConvMode = DISABLE;ADC_Init(ADC1,&ADC_Struct);//校准ADC_Cmd(ADC1,ENABLE);//复位校准ADC_ResetCalibration(ADC1);//等待复位结束while(RESET != ADC_GetResetCalibrationStatus(ADC1)){static int count = 0;count++;if(count > 10000){break;}}//开启校准ADC_StartCalibration(ADC1);//等待校准结束while(RESET != ADC_GetCalibrationStatus(ADC1)){static int count = 0;count++;if(count > 10000){break;}}
}int Light_Getval(void)
{//转换顺序,通道选择,采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_55Cycles5);//软件触发ADC_SoftwareStartConvCmd(ADC1,ENABLE);//等待转换结束while(SET != ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)){static int count = 0;count++;if(count > 10000){return -1;}}//获取转换结果uint16_t ret = ADC_GetConversionValue(ADC1);//ret 0~4096return 100 - (ret/41);
}
6、提示
keil经常会报警告
ADC.h(8): warning: #1-D: last line of file ends without a newline
解决办法:在最后一行多敲一行空行
原理:
在Keil MDK中,最后一行添加空行并非强制要求,也不是Keil编译器本身的规定。 它更多的是一种编程风格和习惯,并没有实际的功能影响。 一些人认为这样做可以提高代码的可读性和整洁性,方便阅读和维护。
虽然没有强制要求,但这种习惯在嵌入式开发中比较常见,原因如下:
-
避免潜在的编译器警告或错误: 虽然极少见,但某些编译器在处理文件结尾时可能会有特殊的处理方式,添加空行可以避免一些不必要的警告或错误,特别是对于一些比较老旧的编译器。
-
版本控制系统: 在使用版本控制系统(如Git)时,在文件末尾添加空行可以避免不必要的冲突,因为不同的编辑器可能会在文件末尾添加不同的换行符。
-
代码美观和可读性: 这可能是最主要的原因。一个干净整洁的代码文件,在结尾处留一个空行,视觉上会更舒服,也更易于阅读和理解。 这是一种良好的编程习惯,有利于团队合作和代码维护。
-
习惯: 很多程序员都习惯在文件末尾添加空行,这已经成为一种约定俗成的习惯。
总而言之,在Keil中最后一行加空行主要是一种代码风格和习惯问题,对编译和运行没有任何实际影响,但有助于提高代码的可读性和可维护性。 是否添加完全取决于个人或团队的代码规范。
我的个人意见:好像与团队项目中,代码移植之类的有关系,如果是个人项目,完全可以忽略,如果是团队项目,好像是最后一行会有一些缓存之类的操作,可能团队项目时,整合会发生别人的代码的第一行和你的最后一行在一行里;所以团队项目可以加上空行
7、结语:
还有很多东西没有讲解:比如双adc,比如注入与规则通道等;
本文的目的在于辅助上手;具体的原理在芯片手册中有完整的讲解;有兴趣的同学可以自行查阅
相关文章:

STM32——ADC
目录 1、ADC的介绍 2、ADC主要特征 3、ADC结构与引脚 4、ADC配置流程 5、示例(光敏电阻的ADC采样) 6、提示 7、结语: 1、ADC的介绍 12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号…...

Unity SRP学习笔记(二)
Unity SRP学习笔记(二) 主要参考: https://catlikecoding.com/unity/tutorials/custom-srp/ https://docs.unity.cn/cn/2022.3/ScriptReference/index.html 中文教程部分参考(可选): https://tuncle.blog/c…...

数据库第五次作业
一要求 二建库建表 触发器 存储过程 三查询 触发器 1 建立触发器,订单表中增加订单数量后,商品表商品数量同步减少对应的商品订单出数量,并测试 测试 2 建立触发器,实现功能:客户取消订单,恢复商品表对应商品的数量 测试 3…...

健身房业务流程优化:SpringBoot解决方案
3系统分析 3.1可行性分析 通过对本健身房管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本健身房管理系统采用SSM框架,JAVA作为开发语言&a…...

【产品经理】工业互联网企业上市之路
树根互联2022年6月2日提交招股书之后,因财务资料超过六个月有效期加三个月延长期,2022年9月30日上市审核中止;2022年12月26日树根互联更新了2022年半年度财务资料,又九个月过去了,其上市进程将面临再一次中止。 处于上…...
Java学习教程,从入门到精通,Java对象和类语法知识点(20)
1、Java对象和类语法知识点 类的定义 使用class关键字定义类。类名通常使用大写驼峰命名法(PascalCase)。类与对象 类是创建对象的模板或蓝图,它定义了对象的属性和行为。对象是类的实例,它包含了类定义的数据(属性&am…...
金融场中的量化交易:民锋数据驱动策略的优势解析市
随着科技的发展,量化交易成为金融市场的重要组成部分。民锋公司通过智能算法和大数据分析,设计了一系列量化交易策略,帮助投资者实现科学投资。本文将探讨民锋在数据驱动策略上的优势,并展示如何通过量化模型在复杂的市场中获得收…...
Docker 配置镜像加速
docker 拉取代码时出现 ERROR: failed to solve: node:16: unexpected status from HEAD request to https:// xxxxxx.mirror.aliyuncs.com/v2/library/node/m…...

HTTP慢速攻击原理及解决办法
目录 引言 HTTP慢速攻击原理 解决办法 Nginx Tomcat 华宇TAS IIS 结论 引言 HTTP慢速攻击(Slow HTTP Attack)是一种拒绝服务攻击(DoS),攻击者通过故意缓慢地发送HTTP请求来耗尽服务器资源,导致合法…...

【系统面试篇】进程和线程类(1)(笔记)——区别、通讯方式、同步、互斥、锁分类
目录 一、问题综述 1. 进程和线程的区别? 2. 进程的状态有哪些? 3. 进程之间的通信方式? (1)管道 (2)消息队列 (3)共享内存 (4)信号量 (…...

[C++]——哈希(附源码)
目录 编辑 编辑 一、前言 二、正文 2.1 unorder系列关联式容器 2.1.1 unordered_map 2.1.1.1 unorderer_map的介绍 ①unordered_map的构造 ②unordered_map的容量 ③unordered_map的迭代器 ④unordered_map的元素访问 ⑤unordered_map的查询 ⑥unordered_map的修改操…...

2024中国自动化大会(CAC2024)“智慧化工及复合人才培养”平行会议圆满落幕
2024中国自动化大会于11月1-3日在青岛举行,本次大会由中国自动化学会主办,青岛科技大学(简称“青科大”)承办。北京和隆优化科技股份有限公司(简称“和隆优化”)承办了重要的“智慧化工及复合人才培养”平行…...
计算机毕业设计——ssm基于JAVA的求职招聘网站的设计与实现演示录像 2021
作者:程序媛9688开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 🌟文末获取源码数据库🌟感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题)࿰…...
跨平台Flutter 、ReactNative 开发原理
一、跨平台Flutter开发原理 Flutter是一个跨平台的应用程序开发框架,它允许你使用一组代码库来构建同时运行在Android和iOS上的应用程序。 1.1.Flutter的核心原理基于以下几点: Dart异步、Widget构建块灵活配置、自工化工具链、热重载、Skia图库、Dar…...

qt QToolBar详解
1、概述 QToolBar是Qt框架中的一个控件,用于在工具栏中显示一组操作按钮和其他控件。它提供了一种方便的方式来组织和管理应用程序中的工具和操作。工具栏通常位于软件或应用程序界面的上方,包含一系列常用工具和命令按钮,用于快速访问和执行…...

MongoDB基础介绍以及从0~1语法介绍
目录 MongoDB 教程导读 NoSQL 简介 关系型数据库遵循ACID规则 分布式系统 分布式计算的优点 分布式计算的缺点 什么是NoSQL? 为什么使用NoSQL ? RDBMS vs NoSQL NoSQL 简史 CAP定理(CAP theorem) NoSQL的优点/缺点 BASE ACID vs BASE N…...

利用Docker Compose构建微服务架构
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 利用Docker Compose构建微服务架构 引言 Docker Compose 简介 安装 Docker Compose 创建项目结构 编写 Dockerfile 前端 Dockerf…...

数据中台一键大解析!
自从互联玩企业掀起了数据中台风,数据中台这个点马上就火起来了,短短几年数据中台就得到了极高的热度,一大堆企业也在跟风做数据中台,都把数据中台作为企业数字化转型的救命稻草,可是如果我告诉你数据中台并不是万能钥…...

MySQL45讲 第十六讲 “order by”是怎么工作的?
文章目录 MySQL45讲 第十六讲 “order by”是怎么工作的?一、引言二、全字段排序(一)索引创建与执行情况分析(二)执行流程(三)查看是否使用临时文件 三、rowid 排序(一)参…...

智慧商城项目-VUE2
实现效果 项目收获 通过本项目的练习,可以掌握以下内容: 创建项目 ##基本创建 基于 VueCli 自定义创建项目架子,并对相关的配置进行选择 vue create demo-shopping调整目录 删除文件 删除初始化的一些默认文件 src/assets/logo.pngsrc/components…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...