STM32第十一课:ADC采集光照
文章目录
- 需求
- 一、ADC概要
- 二、实现流程
- 1.开时钟,分频,配IO
- 2.配置ADC工作模式
- 3.配置通道
- 4.复位校准
- 5.数值的获取
- 三、需求的实现
- 总结
需求
通过ADC转换实现光照亮度的数字化测量,最后将实时测量的结果打印在串口上。
一、ADC概要
ADC全称是Analog-to-Digital Converter模数转换器,一般我们把模拟信号(Analog signal) 用A来进行简写,数字信号(digital signal) 用D来表示。
自然界中绝大部分都是模拟信号,例如压力或温度的测量,为了方便储存,处理和传输,我们会通过ADC把模拟信号转化成数字形式给计算机处理。将模拟转换成数字的形式有两个步骤:采样和量化。
本例中就是将光照亮度这种模拟量转换为具体的数字量。
本次使用的ADC:
二、实现流程
1.开时钟,分频,配IO
先打开原理图,找到该光敏电阻的位置。
由该电路可知VAL测量的是该光敏电阻的分压,而随着光照的变化,该光敏电阻的电压也会发生实时的波动。
此时我们就利于该光敏电压的变化来实现需求。
先找到CPU上对应的引脚
由上图可知该模块对应的引脚为PA5,ADC为ADC12_IN5,代表该引脚PA5是ADC1/2的通道5。
此时我们就开GPIOA的时钟和ADC1的通道(1,2都行,无所谓)
代码如下:
RCC->APB2ENR |= 0x01<<9;//ADC1通道RCC->APB2ENR |= 0x01<<2;//使能GPIOA
下面就要进行分频了,由于本次使用的ADC的特征为12分辨率,而APB2所传输的频率为72M,所以此时我们要进行6分频(72 ÷ 6 = 12)
RCC->CFGR &= ~(0x03<<14);RCC->CFGR |= (0x02<<14);//6分频
最后进行PA5引脚的模式配置,由于要获得该引脚的电压值,而该电压值为动态变化的模拟量,所以此处要将模式置为模拟输入模式(0000)
GPIOA->CRL &= ~(0x0F<<20);//配置成模拟输入
2.配置ADC工作模式
首先打开手册找ADC1的控制寄存器(CR1,CR2),一个一个查看,看是否需要配置。
一般常用的是第8位扫描模式
不过此处只传输光照一个变量,所以可以不开置零就行。
双模式选择也是必要的,此处选独立模式就行,因为只用这一个ADC1。
到这里ADC1的CR1寄存器的基本配置就算完成了。
下面来看ADC1的CR2寄存器。
先来看第20位规则通道的外部触发转换模式。规则通道组每转换一次,代表着ADC1把数据传输到DR规则组通道数据寄存器上,该寄存器为16位,并且每传输一次,数据就会被覆盖一次。
此处我们选择开启1:使用外部时间启动转换
再来看19-17位,规则通道组转换的外部触发条件。
我们这里选择111:SWSTART(软件触发)因为是通过软件代码置位来触发。
第十一位数据对齐的模式要选择为右对齐,方便后续操作。
第一位的连续转换可开可关,因为只有光照一个量。
最后使能一下第0位:开启ADC并启动转换。
//3、配置ADC的工作模式ADC1->CR1 &= ~(0x0F<<16);//独立模式ADC1->CR1 &= ~(0x01<<8);//不开扫描ADC1->CR2 |= 0x01<<20;//选择开启外部触发ADC1->CR2 |= 0x07<<17;//触发方式swsatrt(软件触发)ADC1->CR2 &= ~(0x01<<11);//选择数据右对齐ADC1->CR2 &= ~(0x01<<1);//关闭连续转换ADC1->CR2 |= 0x01<<0;//ADC使能
3.配置通道
由于该引脚PA5对应的是ADC12_IN5,所以我们只需要配置通道5即可。
配置通道在ADC规则序列寄存器和ADC采样时间寄存器中。
先找到SQR1寄存器
ADC规则序列寄存器负责通道数量的选择,共有16个,由于我们只用通道5,所以此时我们将L配置成0000,只配只配一个通道。
接下来配置我们选的SQ1通道,将其配成通道0x05。
最后配置一下采样周期,周期越大越准,所以我选择了111:239.5周期。
//配置一个通道:通道5,第一个转换,采样周期最大(239.5)ADC1->SQR1 &= ~(0x0F<<20);//规则组通道只转换一个(配置通道数量)//具体某个通道的配置ADC1->SQR3 &= ~(0x1F<<0);//0-5位清0ADC1->SQR3 |= 0x05<<0;//选择第一个转换通道5ADC1->SMPR2 |= 0x07<<15;//采样周期最大(239.5)
4.复位校准
复位校准可有可无,不过为了更加保险,我还是加上了。
总共校准了两次,校准位在CR2寄存器的第三位。
每次校准后会自动置位0,所以此处while(1)等待非0,若为1就等待,为0就校准完成,继续往下执行。
ADC1->CR2 |= 0x01<<3;//启动复位校准//等待复位校准结束while((ADC1->CR2&(0x01<<3))!=0)//判断寄存器的位3是不是等于1{}ADC1->CR2 |= 0x01<<2;//启动AD校准//等待AD校准结束while((ADC1->CR2&(0x01<<2))!=0)//判断寄存器的位2是不是等于1,是1就等待{}
5.数值的获取
对于数值的获取,我是单独写了个函数来执行,放便主函数调用并发送给串口。
想要获取数据,就要让ADC的CR2寄存器的第22位置1转换一下。
每转换一次,就代表着ADC1把数据传输到DR规则组通道数据寄存器上,该寄存器为16位,并且每传输一次,数据就会被覆盖一次。
所以此时我们让ADC的CR2寄存器的第22位置为1
那么什么时候代表转换完了?此时就要查看ADC的状态寄存器SR了
可以看到,每一次转换结束时,ADC_SR寄存器的第一位就会置1,并且不用我们去清零,每当我们去ADC_DR读取数据时,就会自动清除。
那么此时我们就可判断转换结束位的0,1来进行数据的读取了。
最后,将读取到的光照强度数据打印即可。(之前已经给printf重定向了,会自动打印到串口中)
void GetLightValue()
{uint16_t Light=0;//让规则通道转换一次ADC1->CR2 |= 0x01<<22;while((ADC1->SR&(0x01<<1))==0)//判断寄存器的位2是不是等于1,是0就等待转换完成{}Light = ADC1->DR; //读规则组通道数据寄存器printf("光照强度参数 = %d \r\n",Light);
}
三、需求的实现
关键代码如下:
main.c
#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"
#include "delay.h"
#include "string.h"
#include "pwm.h"
#include "adc.h"int main()
{NVIC_SetPriorityGrouping(5);//两位抢占两位次级Usart1_Config(); SysTick_Config(72000);RGBpwm_Config();uint8_t cai_count=0;uint16_t cont=0;Adc_Config();while(1){ if(ledcnt[0]>=ledcnt[1]){//过去500msledcnt[0]=0;GetLightValue();}}
}
adc.c
#include "ADC.h"void Adc_Config(void)
{//PA5//1、设置ADC的时钟(开时钟和时钟分频6分频)RCC->APB2ENR |= 0x01<<9;//ADC1通道RCC->APB2ENR |= 0x01<<2;//使能GPIOARCC->CFGR &= ~(0x03<<14);RCC->CFGR |= (0x02<<14);//6分频//2、配置IO模式(模拟输入)GPIOA->CRL &= ~(0x0F<<20);//配置成模拟输入//3、配置ADC的工作模式ADC1->CR1 &= ~(0x0F<<16);//独立模式ADC1->CR1 &= ~(0x01<<8);//不开扫描ADC1->CR2 |= 0x01<<20;//选择开启外部触发ADC1->CR2 |= 0x07<<17;//触发方式swsatrt(软件触发)ADC1->CR2 &= ~(0x01<<11);//选择数据右对齐ADC1->CR2 &= ~(0x01<<1);//关闭连续转换ADC1->CR2 |= 0x01<<0;//ADC使能//配置一个通道:通道5,第一个转换,采样周期最大(239.5)ADC1->SQR1 &= ~(0x0F<<20);//规则组通道只转换一个(配置通道数量)//具体某个通道的配置ADC1->SQR3 &= ~(0x1F<<0);//0-5位清0ADC1->SQR3 |= 0x05<<0;//选择第一个转换通道5ADC1->SMPR2 |= 0x07<<15;//采样周期最大(239.5)ADC1->CR2 |= 0x01<<3;//启动复位校准//等待复位校准结束while((ADC1->CR2&(0x01<<3))!=0)//判断寄存器的位3是不是等于1{}ADC1->CR2 |= 0x01<<2;//启动AD校准//等待AD校准结束while((ADC1->CR2&(0x01<<2))!=0)//判断寄存器的位2是不是等于1,是1就等待{}
}void GetLightValue()
{uint16_t Light=0;//让规则通道转换一次ADC1->CR2 |= 0x01<<22;while((ADC1->SR&(0x01<<1))==0)//判断寄存器的位2是不是等于1,是0就等待转换完成{}Light = ADC1->DR; //读规则组通道数据寄存器printf("光照强度参数 = %d \r\n",Light);
}
adc.h
#ifndef _ADC_H_
#define _ADC_H_
#include "stm32f10x.h"
#include "stdio.h"
void GetLightValue();void Adc_Config(void);
#endif
delay.c
#include "stm32f10x.h"
#include "delay.h"uint32_t systicktime=0;uint16_t ledcnt[2]={0,1000};//500ms 每个任务执行的时间
uint16_t led2cnt[2]={0,2000};//700ms
uint16_t keycnt[2]={0,10};//10ms检测一次
void SysTick_Handler(void)//1ms调用一次
{//不需要清中断挂起位systicktime++;ledcnt[0]++;led2cnt[0]++;keycnt[0]++;
}void Delay_ms(uint32_t time)
{uint32_t nowtime = systicktime;while(systicktime < time+nowtime);
}void Delay_nus(uint32_t time)
{uint32_t i=0;for(i=0;i<time;i++){delay1us();}
}void Delay_nms(uint32_t time)
{uint32_t i=0;for(i=0;i<time;i++){Delay_nus(1000);//延时1ms}
}
delay.h
#ifndef _DELAY_H_
#define _DELAY_H_
#include "stm32f10x.h"#define delay1us() {__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();}extern uint16_t ledcnt[2];
extern uint16_t led2cnt[2];
extern uint16_t keycnt[2]; void Delay_nus(uint32_t time);
void Delay_ms(uint32_t time);
void Delay_nms(uint32_t time);
#endif
总结
1.先看该光敏电阻的电路图,分析如何获取光照的数值。
2.想到可以通过ADC转换得到光照的树数值,开始学习ADC的知识。
3.先看ADC的功能描述,然后开时钟,分频,配IO。
4.看手册中的ADC的控制寄存器,一个一个查看,看看究竟需要配置那些。
5.看该引脚的ADC是那个通道的,开始配置通道。
6.都配置完后进行复位校准和数据获取函数的编写。
7.最后在主函数按照需求调用即可。
相关文章:
STM32第十一课:ADC采集光照
文章目录 需求一、ADC概要二、实现流程1.开时钟,分频,配IO2.配置ADC工作模式3.配置通道4.复位校准5.数值的获取 三、需求的实现总结 需求 通过ADC转换实现光照亮度的数字化测量,最后将实时测量的结果打印在串口上。 一、ADC概要 ADC全称是A…...
python查找支撑数 青少年编程电子学会python编程等级考试三级真题解析2022年3月
目录 python查找支撑数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python查找支撑数 2022年3月 python编程等级考试级编程题 一、题目要求…...
创建一个快速、高效的网络爬虫:PHP和Selenium示例
随着互联网的不断发展,数据爬取已经成为了许多人的必备技能。而网络爬虫则是实现数据爬取的重要工具之一。 网络爬虫可以自动化地访问网站、获取内容、分析页面并提取所需数据。其中,Selenium是一款非常优秀的网络自动化测试工具,能够模拟真…...
两张图片怎样拼在一起?将两张图片拼在一起的几种方法介绍
两张图片怎样拼在一起?拼接两张图片是一种常见的编辑技巧,能够将不同的视觉元素融合成一个整体,从而创造出更加生动和丰富的图像效果。无论是为了设计创意作品、制作社交媒体内容,还是简单地为个人相册增添趣味,掌握如…...
百日筑基第五天-关于maven
百日筑基第五天-关于maven Maven 是什么 Maven 是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),反映在配置中,就是一个 pom.xml 文件。是一组标准集合,一个项目的生命周期、一个依赖…...
【CSS in Depth 2 精译】2.2 em 和 rem + 2.2.1 使用 em 定义字号
当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力 2.1.1 响应式设计的兴起 2.2 em 与 rem ✔️ 2.2.1 使用 em 定义字号 ✔️2.2.2 使用 rem 设置字号 2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 2.…...
C++Primer Plus 第十四章代码重用:14.4.4 数组模板示例和非类型参数
系列文章目录 14.4.4 数组模板示例和非类型参数 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录14.4.4 数组模板示例和非类型参数 14.4.4 数组模板示例和非类型参数 模板常用作容器类,这…...
短视频哪个软件好用?成都柏煜文化传媒有限公司
短视频哪个软件好用?一文带你了解各大平台特色 随着移动互联网的飞速发展,短视频已经成为现代人生活中不可或缺的一部分。市面上涌现出众多短视频平台,它们各具特色,满足了不同用户的需求。那么,短视频哪个软件好用呢…...
金融科技:重塑用户体验,驱动满意度飙升
随着科技的飞速发展,金融科技(FinTech)已经深入到我们生活的每一个角落,从日常支付到投资理财,再到跨境汇款,它都在悄无声息地改变着我们的金融行为。而在这背后一个不可忽视的驱动力就是金融科技对用户体验…...
JavaScript——算术运算符
目录 任务描述 相关知识 - * / %运算符 递增运算符和递减运算符 编程要求 任务描述 本关任务:给定两个字符串变量,把它们转为数字后相除,拼接被除数、除数和余数为一个新的字符串。 例如:a 为 "5",b 为…...
备份SQL Server数据库并还原到另一台服务器
我可以将SQL Server数据库备份到另一台服务器吗? 有时您可能希望将 SQL数据库从一台服务器复制到另一台服务器,或者将计算机复制到计算机。可能的场景包括测试、检查一致性、从崩溃的机器恢复数据库、在不同的机器上处理同一个项目等。 是的,…...
二刷算法训练营Day45 | 动态规划(7/17)
目录 详细布置: 1. 139. 单词拆分 2. 多重背包理论基础 3. 背包总结 3.1 背包递推公式 3.2 遍历顺序 01背包 完全背包 详细布置: 1. 139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单…...
大模型项目落地时,该如何估算模型所需GPU算力资源
近期公司有大模型项目落地。在前期沟通时,对于算力估算和采购方案许多小伙伴不太了解,在此对相关的算力估算和选择进行一些总结。 不喜欢过程的可以直接 跳到HF上提供的模型计算器 要估算大模型的所需的显卡算力,首先要了解大模型的参数基础知识。 大模型的规模、参数的理解…...
LLM应用开发-RAG系统评估与优化
前言 Hello,大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者,在上一篇文章中,我们学习了如何基于LangChain构建RAG应用,并且通过Streamlit将这个RAG应用部署到了阿里云服务器;&am…...
秋招突击——第七弹——Redis快速入门
文章目录 引言Redis是什么 正文对象String字符串面试重点 List面试考点 压缩列表ZipList面试题 Set面试题讲解 Hash面试重点 HASHTABLE底层面试考点 跳表面试重点 ZSET有序链表面试重点 总结 引言 在项目和redis之间,我犹豫了一下,觉得还是了解学习一下…...
软考初级网络管理员__操作系统单选题
1.在Windows资源管理器中,假设已经选定文件,以下关于“复制”操作的叙述中,正确的有()。 按住Ctr键,拖至不同驱动器的图标上 按住AIt键,拖至不同驱动器的图标上 直接拖至不同驱动器的图标上 按住Shift键࿰…...
从入门到精通:网络编程套接字(万字详解,小白友好,建议收藏)
一、预备知识 1.1 理解源IP地址和目的IP地址 在网络编程中,IP地址(Internet Protocol Address)是每个连接到互联网的设备的唯一标识符。IP地址可以分为IPv4和IPv6两种类型。IPv4地址是由32位二进制数表示,通常分为四个八位组&am…...
dledger原理源码分析系列(一)架构,核心组件和rpc组件
简介 dledger是openmessaging的一个组件, raft算法实现,用于分布式日志,本系列分析dledger如何实现raft概念,以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的架构,核心组件;rpc组…...
第七节:如何浅显易懂地理解Spring Boot中的依赖注入(自学Spring boot 3.x的第二天)
大家好,我是网创有方,今天我开始学习spring boot的第一天,一口气写了这么多。 这节通过一个非常浅显易懂的列子来讲解依赖注入。 在Spring Boot 3.x中,依赖注入(Dependency Injection, DI)是一个核心概念…...
Postman自动化测试实战:使用脚本提升测试效率
在软件开发过程中,接口测试是确保后端服务稳定性和可靠性的关键步骤。Postman作为一个流行的API开发工具,提供了强大的脚本功能来实现自动化测试。通过在Postman中使用脚本,测试人员可以编写测试逻辑,实现测试用例的自动化执行&am…...
CSMA/CA并不是“公平”的
CSMA/CA会造成过于公平,对于最需要流量的节点,是最不友好的,而对于最不需要流量的节点,则是最友好的。 CSMA/CA是优先公平来工作的。 CSMA/CA首先各节点使用DIFS界定air idle,在此期间大家都等待 其次,为了同时发送引起碰撞,在DIFS之后随机从CWmin和CWmax之间选择一个时…...
【漏洞复现】I doc view——任意文件读取
声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 I doc view 在线文档预览是一个用于查看、编辑、管理文档的工具…...
图数据库 vs 向量数据库
最近大模型出来之后,向量数据库重新翻红,业界和市场上有不少声音认为向量数据库会极大的影响图数据库,图数据库市场会萎缩甚至消失,今天就从技术原理角度来讨论下图数据库和向量数据库到底差别在哪里,适合什么场景&…...
企业品牌出海第一站 维基百科词条创建
维基百科是一部内容开放、自由的网络百科全书,旨在创造一个涵盖所有领域知识,服务所有互联网用户的知识性百科全书。其在国外应用非常广泛且认可度很高,国内品牌出海或国际品牌都很有必要创建企业自己的维基百科页面,以及企业高管的个人维基百科页面。 如…...
Windows下activemq集群配置(broker-network)
1.activemq版本信息 activemq:apache-activemq-5.18.4 2.activemq架构 3.activemq集群配置 activemq集群配置基于Networks of Brokers 这种HA方案的优点:是占用的节点数更少(只需要2个节点),而且2个broker都可以响应消息的接收与发送。不足ÿ…...
心理辅导平台系统
摘 要 中文本论文基于Java Web技术设计与实现了一个心理辅导平台。通过对国内外心理辅导平台发展现状的调研,本文分析了心理辅导平台的背景与意义,并提出了论文研究内容与创新点。在相关技术介绍部分,对Java Web、SpringBoot、B/S架构、MVC模…...
代理IP对SEO影响分析:提升网站排名的关键策略
你是否曾经为网站排名难以提升而苦恼?代理服务器或许就是你忽略的关键因素。在竞争激烈的互联网环境中,了解代理服务器对SEO的影响,有助于你采取更有效的策略,提高网站的搜索引擎排名。本文将为你详细分析代理服务器在SEO优化中的…...
【leetcode--三数之和】
这道题记得之前做过,但是想不起来了。。总结一下: 函数的主要步骤和关键点: 排序:对输入的整数数组nums进行排序。这是非常重要的,因为它允许我们使用双指针技巧来高效地找到满足条件的三元组。初始化:定…...
解决Java中的ClassCastException问题
解决Java中的ClassCastException问题 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java编程中,ClassCastException是一个常见的运行时异常&am…...
【TensorFlow深度学习】混合生成模型:结合AR与AE的创新尝试
混合生成模型:结合AR与AE的创新尝试 引言自回归模型与自动编码器的简述混合模型的创新尝试组合AR与AE:MADE混合模型在图学习中的应用 结论与展望 在自我监督学习的广阔天地里,混合生成模型以其独特的魅力,跨越了自回归(…...
网站建设初衷/淘宝店铺运营推广
解决步骤:1、top命令查看CPU占用情况可以看到11042进程占用了非常多的CPU资源2、查看F5并发曲线:为什么应用耗费了这么多的线程,难道是用户量突然上来了,调取了F5的访问曲线图,可以看到在15:57左右并发量突然猛涨&…...
网站跟域名是什么关系/360社区app
创建文件对象的三种方式 文件常用方法 IO流 输入流从文件输入到程序内存,输出流从程序内存输出到文件 流的分类 字节流分为字节输入流和字节输出流 InputStream是一个抽象类 IO流分为字节流和字符流。 字节流分为字节输入流【InputStream】和字节输出流【OutputS…...
如何在年报网站上做遗失公告/今日最新国内新闻重大事件
合理维护网络服务器安全的七个小技巧对于一个网络而言,维护其服务器安全的重要性是不言而喻的,那么作为管理员的你如何来更好地保障服务器的安全呢?本文较系统地给您介绍一些实用的技巧。 技巧一:从基本做起 ***开始对你的网络发起***的时候&…...
平板电脑可以做网站吗/郑州网站建设方案
导读随着信息化技术的不断发展,整个社会对于信息化技术的依赖程度越来越高,在这种情况下,学习编程将对未来的工作和学习具有更多的实际意义。未来编程将不仅仅是程序员的事情,对于广大职场人来说,编程也将是一个重要的…...
禹州做网站/互动营销的方式有哪些
Go语言连接Oracle首先交代一下运行环境和工具版本:WIN10MINGW64ORACLEINSTANCCLIENT_18_3 x64Jetbrins Goland编译阶段:1. exec: "gcc": executable file not found in %PATH%2. exec: "pkg-config": executable file not found in %PATH%3. ca…...
高性能网站开发/今日最新新闻
所有使用 /proc 的模块应当包含 <linux/proc_fs.h> 来定义正确的函数. 要创建一个只读 /proc 文件, 你的驱动必须实现一个函数来在文件被读时产生数据. 当 某个进程读文件时(使用 read 系统调用), 这个请求通过这个函数到达你的模块. 我们先 看看这个函数并在本章后面讨论…...