stm32f407VET6 系统学习 day08 利用adc 模数转换 监控光敏电阻。

news2024/9/27 15:27:01

1. ADC 的知识

1.基本概念 : Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件  。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。


2.STM32F4x ADC特点

1. 可配置12位、10位、8位或6位分辨率
2. 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断单次和连续转换模式
3. 用于自动将通道О转换为通道“n”的扫描模式数据对齐以保持内置数据一致性
4. 可独立设置各通道采样时间
5. 外部触发器选项,可为规则转换和注入转换配置极性不连续采样模式。
6. 双重/三重模式(具有2个或更多ADC的器件提供)
7. 双重/三重ADC模式下可配置的 DMA数据存储双重/三重交替模式下可配置的转换间延迟
8. ADC转换类型(参见数据手册)
9. ADC电源要求:全速运行时为2.4V到3.6 V,慢速运行时为1.8 VADC

10.输入范围:VREF-≤VIN ≤VREF+
11. 规则通道转换期间可产生DMA请求。


3. STM32F40x系列ADC外部通道和引脚对应关系


4.ADC引脚

5.STM32通道组

理解图:


6. ADC 通道执行的模式

STM32F4的ADC的各通道可以单次,连续,扫描或者间断模式执行。


7. 单次转化VS连续转换

 

 


 8.ADC中断


9. ADC的采样时间
 


10 . ADC 的实验步骤


11. 中文手册  (原理图)

 

 


12. 光敏电阻

 光照越大, 电阻越小, 电压越小

光照越小, 电阻越大, 电阻越大


 13. 代码:

头文件:

#ifndef __ADC_H
#define __ADC_H	

#include "sys.h" 

 							   
void  myAdcInit(void); 				//ADC通道初始化
u16   getAdc(u8 ch); 				//获得某个通道值 
u16   getAdcAverage(u8 ch,u8 times);//得到某个通道给定次数采样的平均值  



#endif 















 

 .cpp 文件

#include "myadc.h"
#include "delay.h"		

/*

 使用ADC1

 ADC_IN0 --->光照--->PA0
 ADC_IN10 --->可变电压输入--->PC0
 
 ADC_IN8--->J15-->PB0---烟雾传感器
 ADC_IN9--->J14-->PB1 --->酒精传感器
*/

//初始化ADC															   
void  myAdcInit(void)
{    
	
	GPIO_InitTypeDef       GPIO_InitStructure;
	ADC_CommonInitTypeDef  ADC_CommonInitStructure;
	ADC_InitTypeDef        ADC_InitStructure;
	
	//1.A组时钟配置
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
	
//	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOC时钟
//	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟

	//2.配置adc1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
	
	//3先初始化ADC1通道0 IO口 PA0
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0 通道0
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化 PA0 

	//4.重新启动时钟命令函数
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);	  //ADC1复位
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);	//复位结束	 
	
	//独立模式
	ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
	
	//两个采样阶段之间的延迟5个时钟
	ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
	 //DMA失能
	ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
	
	//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz 
	ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
	//5.adc  341行
	ADC_CommonInit(&ADC_CommonInitStructure);//初始化
	
	//12位模式
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	//非扫描模式	
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	//关闭连续转换
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	//禁止触发检测,使用软件触发
	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
	//右对齐	
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	//1个转换在规则序列中 也就是只转换规则序列1 
	ADC_InitStructure.ADC_NbrOfConversion = 1;
	//6.adc初始化
	ADC_Init(ADC1, &ADC_InitStructure);
	
	//7开启AD转换器	
	ADC_Cmd(ADC1, ENABLE);

//	//初始化ADC1 通道10 IO口  PC0
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;			//PC0 通道10
//	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化 PC0 

//	//初始化ADC1 通道8(PB0),通道9(PB1) GPIO口
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;//PB0 通道8
//	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 PB1 通道9
}				


//获得ADC值
//ch: @ref ADC_channels 
//通道值 0~16取值范围为:ADC_Channel_0~ADC_Channel_16
//返回值:转换结果
u16 getAdc(u8 ch)   
{
	//ADC1,ADC通道,480个周期,提高采样时间可以提高精确度
	//设置指定ADC的规则组通道,一个序列,采样时间 
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );		
	
  //使能指定的ADC1的软件转换启动功能
	ADC_SoftwareStartConv(ADC1);			
	
	 //等待转换结束
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

	//返回最近一次ADC1规则组的转换结果
	return ADC_GetConversionValue(ADC1);	
}

//获取通道ch的转换值,取times次,然后平均 
//ch:通道编号
//times:获取次数
//返回值:通道ch的times次转换结果平均值
u16 getAdcAverage(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val+=getAdc(ch);
		delay_ms(5);
	}
	
	return temp_val/times;
} 
	 









 

 main.cpp  (可能你用不了)


#include "stm32f4xx.h"
#include "oled.h"
#include "beep.h"
#include "led.h"
#include "iic.h"
#include "delay.h"
#include "mydht11.h"
#include "myadc.h"

#include "stdio.h"
//主程序:新数组存储数据  你采集到的数据

//字符数组
char guangzhao[30];

int main(void)
{
	//各种初始化
	delay_init(168);
	IIC_Init();
	InitOLed();
	myAdcInit();
	//usartinit();

	while(1)
	{	
		//显示光照汉字
		OLed_ShowLight();
		//显示光照数值
		sprintf(guangzhao,"%d",getAdcAverage(0,4));
		
//		if(key1 == 0 )
//		{
//					reslight = getAdcAverage(0,4);
//		}
		//串口传递字符数组
		OLed_ShowASCII(56,4,guangzhao);
	}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git操作

删除暂存区文件&#xff1a; git rm --cached 完整文件名 git rm --cached xxx.txt这个删&#xff0c;只是把暂存区里的文件删了&#xff0c;工作区里面的没有删 把本地文件添加到暂存区 git add完整文件名 例如&#xff1a;git add xxx.txt git add xxx.txt此时xxx.txt已经…

Linux 权限理解和学习

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Don’t argue with the people of strong determination, because they may ch…

AtCoder Beginner Contest 283 Ex. Popcount Sum(类欧经典问题:数x在二进制表示下第k位的值)

题目 t(t<1e5)组样例&#xff0c;每组样例给定n,m,r(1<m<n<1e9,0<r<m) 求[1,n]这n个数中&#xff0c;所有满足i%mr的数i的二进制的1的个数之和 即&#xff1a;&#xff0c; 其中&#xff0c;__builtin_popcount(i)统计的是i的二进制表示中&#xff0c;1的…

Web APIs

文章目录一. Web API介绍1. Web APIs 和 JS 基础关联性1.1 JS 的组成1.2 JS 基础阶段以及 Web APIs 阶段2. API的概念[3.Web API的概念](https://developer.mozilla.org/zh-CN/docs/Web/API)4. API 和 Web API 总结二. DOM 介绍1. DOM 简介1.1 什么是 DOM1.2 DOM 树2. 获取元素…

Linux-6 三剑客命令

Linux-6 三剑客命令 awk&#xff08;取列&#xff09; 将系统的IP地址打印出来 [rootdestiny ~]# yum install net-tools -y #分析&#xff1a;#1.肯定是需要拿到IP地址&#xff0c;仅看某一个特定的网卡&#xff1b;ifconfig#2.先想办法过滤出数据的那一行&#xff1b; ###行#…

5)Django Admin管理工具,Form组件,Auth

目录 一 Django Admin管理工具 激活管理工具 使用管理工具 复杂模型 自定义表单 内联(Inline)显示 列表页的显示 二 django Form组件 局部钩子和全局钩子 三 Django 用户认证&#xff08;Auth&#xff09;组件 一 Django Admin管理工具 Django 提供了基于 web 的管理…

年终报告撰写小技巧,你学会了吗?

年年岁岁花相似&#xff0c;岁岁年年人不同。 临近年底&#xff0c;又到了一年一度的年终报告时段了。同事间见面最让人头疼的问候&#xff0c;莫过于&#xff0c;“你的年终报告写了吗&#xff1f;” 有的人东拼西凑、应付了事&#xff0c;汇报内容乏善可陈&#xff0c;领导…

美美的圣诞树画出来-CoCube

2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ CSDN诚邀各位技术er分享关于圣诞节的各种技术创意&#xff0c;展现你与众不同的精彩&#xff01;参与本次投稿即可获得【话题达人】勋章【圣诞快乐】定制勋章&#xff08;1年1次&#xff0c;错过要等下一年喔&#…

尚医通-上传医院接口实现(十八)

目录&#xff1a; &#xff08;1&#xff09;上传医院接口-基础类的创建 &#xff08;2&#xff09;数据接口-上传医院接口-初步实现 &#xff08;3&#xff09;上传医院接口-最终实现 &#xff08;1&#xff09;上传医院接口-基础类的创建 复制相关的工具类&#xff1a;这…

Redis Windows版安装和使用

下载地址&#xff0c;亲已测试可放心使用 https://github.com/tporadowski/redis/releases Redis安装和基本使用&#xff08;windows版&#xff09; 1.Redis简介 完全开源免费的高性能的key-value的数据库 支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&…

【函数】一篇文章带你看懂控制流、递归、高阶函数

目录 控制流 条件语句 迭代语句 示例&#xff1a;质因数分解 递归 示例&#xff1a;阶乘 示例&#xff1a;斐波那契数列 示例&#xff1a;判断奇偶数 高阶函数 lambda 表达式 设计函数 示例&#xff1a;累加计算 示例&#xff1a;柯里化 Lab 1: Functions, Control …

个人能用的短信平台有哪些?看这一篇就够了

对于程序员个人来说&#xff0c;在做开发或者是接项目的时候&#xff0c;常常会用到发送短信功能模块&#xff0c;而自己写这个模块会要相当多的精力和时间&#xff0c;去找短信平台来解决问题&#xff0c;已经成了不少程序员的共识。 但市面上的短信平台确实很杂&#xff0c;鱼…

服务注册与发现原理

一、什么是服务注册与发现&#xff1f; 服务注册与发现就是一套管理微服务的组件&#xff0c;方便各拆分的服务平滑上线和下线&#xff0c;以及某个服务出现故障自动剔除。其实质就是维护一张记录各在线服务的表。让消费服知道服务在线可以请求。。。。。。 二、服务注册与发现…

SQL限制

SQL限制目录概述需求&#xff1a;设计思路实现思路分析1.URL管理参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy…

PLL实验

PLL实验 开发板上面只有一个200MHz时钟输入&#xff0c;对于其它频率的时钟怎么办&#xff1f; 介绍 其实在很多 FPGA 芯片内部都集成了 PLL &#xff0c;其他厂商可能不叫 PLL &#xff0c;但是也有类似的功能模块&#xff0c;通过 PLL 可以倍频分频&#xff0c;产生其他很…

pytorch搭建yolov3网络

yolov3的整体网络结构 主要包含了两个部分。左边的Darknet-53主干特征提取网络主要用于提取特征。右边是一个FPN金字塔结构。 主干特征提取网络&#xff08;提取特征&#xff09; import math from collections import OrderedDict import torch.nn as nn#------------------…

MySQL事务相关知识

实践阅读&#xff1a;一文彻底读懂MySQL事务的四大隔离级别 1、什么是事务&#xff1f; 数据库事务&#xff08;简称&#xff1a;事务&#xff09;&#xff0c;是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成&#xff0c;这些操作要么全…

AcWing 4645. 选数异或(预处理小区间 + 二分优化找)

题目如下&#xff1a; 题解 or 思路 在 [l,r][l, r][l,r] 区间内找到两个数 a,ba, ba,b 使得 a ^ b x 通过异或的性质&#xff1a; a ^ b ^ b x ^ b > a x ^ b 我们可以通过 b 可以迅速找到 a, a x ^ b 我们可以现预处理出所有小区间(大区间可以不需要&#xff0c;因为…

win11怎么分回c盘空间

有网友反映自己的win11系统有多个分区&#xff0c;c盘分区的空间比较小&#xff0c;便想通过win11分盘功能&#xff0c;将临近的磁盘空间分给c盘。那么win11怎么分回c盘空间&#xff1f;下面就教下大家win11将其他盘空间分回c盘的方法步骤。 工具/原料&#xff1a; 系统版本&am…

最近几年-基于深度学习自然语言处理的推荐系统-必读论文整理分享

基于内容的推荐&#xff08;Content-based Recommendation&#xff09;是信息过滤技术的延续与发展&#xff0c;它是建立在项目的内容信息上作出推荐的&#xff0c;而不需要依据用户对项目的评价意见&#xff0c;更多地需要用机器学习的方法从关于内容的特征描述的事例中得到用…