stm32f407VET6 系统学习 day08 利用adc 模数转换 监控光敏电阻。
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" /*使用ADC1ADC_IN0 --->光照--->PA0ADC_IN10 --->可变电压输入--->PC0ADC_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口 PA0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0 通道0GPIO_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);}
}
stm32f407VET6 系统学习 day08 利用adc 模数转换 监控光敏电阻。相关推荐
- STM32学习笔记(七) ADC模数转换测电平(普通和DMA模式)
嵌入式系统在微控制领域(温度,湿度,压力检测,四轴飞行器)中占据着重要地位,这些功能的实现是由微处理器cpu(如stm32)和传感器以及控制器共同完成的,而连接他们,使它们能够互相正常交流的正是本小节 ...
- java 监听配置文件_java读取系统Properties配置文件利用线程实时监控配置文件变化...
package util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...
- 【深度学习】利用深度学习监控女朋友的微信聊天?
效果 1.概要 利用深度学习模型Seq2Seq模型搭建拼音转中文模型,利用python键盘监控事件模块PyHook3监控女朋友的发送的拼音数据并发送给模型进行中文预测存储到本地日志中. 2.结构 ...
- Linux系统学习: 用户和权限管理指令: 请简述 Linux 权限划分的原则
权限抽象 一个完整的权限管理体系,要有合理的抽象.这里就包括对用户.进程.文件.内存.系统调用等抽象.下面我将带你一一了解. 首先,我们先来说说用户和组.Linux 是一个多用户平台,允许多个用户同时 ...
- 如何从零开始系统学习量化交易-附资料
如何从零开始系统学习量化交易-附资料 一.学习基础知识 二.阅读书籍 三.量化学习平台: 四.学习课程 注意:分享的资料放在文末!!! 一.学习基础知识 要对股票.基金.期权.债权.外汇这些基础知识进 ...
- Red Hat Enterprise Linux 8系统学习(一)
Red Hat Enterprise Linux 8系统学习(一) "工作马马虎虎,只想在兴趣和游戏中寻觅快活,充其量只能获得一时的快感,绝不能尝到从心底涌出的惊喜和快乐.但来自工作的喜悦并 ...
- STM32系统学习——RCC(使用HSE/HSI配置时钟)
** STM32系统学习--RCC(使用HSE/HSI配置时钟) ** RCC :reset clock control 复位和时钟控制器.主要讲解时钟部分,特别是要着重理解时钟树,理解了时钟树,ST ...
- FR8012HAQ利用ADC实现检测电池电压检测的解决方案
今天要跟大家分享的是FR8012HAQ利用ADC实现检测电池电压检测的解决方案. FR8012HAQ是富芮坤的一款通用蓝牙芯片.特性介绍如下图: 我们再来看FR8012HAQ的PMU,它强大的地方还在 ...
- 浅谈性能测试监控系统,做好关键指标的监控
随着业务的增长,服务器部署由单一架构向分布式集群架构转变,性能测试过程中指标监控也由单一服务器向集群服务器转变. 对于性能测试团队来说,需要建立起适用于测试的多机监控系统,以便后期顺利且高效地进行监控 ...
最新文章
- WPF绘制自定义窗口
- 【iBoard 电子学堂 / iCore核心板教程】【verilog / modelsim 基础例程】
- POJ 1696 Space Ant(极角排序)【计算几何】
- Airbnb数据科学团队进化论:如何由内而外实现数据驱动
- python编程内置函数使用方法_python编程(4)--内置函数
- python爬虫学习第一章
- 指标统计:基于流计算 Oceanus(Flink) 实现实时 UVPV 统计
- 机器学习中的特征建模(特征工程)和算法选型建模 - 以暴力破解识别为例
- C main()参数
- 删除华为C8650手机驱动的过程
- linux im-scim-bridge.so 使用,Ubuntu SCIM 输入法不能光标跟随的解决
- 华为服务器找不到阵列卡_DELL R730服务器配置RAID及安装服务器系统
- php验证码 失效,php验证码无法显示的解决方法
- Linux清理入侵痕迹
- 【Errors】Errors during downloading metadata for repository ‘AppStream‘:
- DataTables如何重新加载数据
- 华为云数据库跃进式发展
- 开源SWD脱机烧录器-第二章 SWD协议移植
- Bsp开发的几个层次
- fiddler下载及安装