STM32——ADC读取光敏传感器控制LED灯,看门狗中断

这篇具有很好参考价值的文章主要介绍了STM32——ADC读取光敏传感器控制LED灯,看门狗中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文介绍两种使用方法

一、编写读取AD值的函数,之后判断AD值,进行相应操作,比如点灯。
二、用ADC读取光敏传感器AO口输出,并配置ADC通道看门狗监控这条通道,当光线太暗时打开LED灯。
之后会再介绍可编程RGB灯带WS2812B。

光敏传感器介绍

光敏传感器有两个输出口,一个是DO(Digital Output),一个是AO(Analog Output),DO是数字输出,只会输出0或1,AO是模拟输出,可以配合stm32的ADC转换器得到数值存放在12位的寄存器中,因此AD值的范围是4095 - 0,即2的12次方-1到2的0次方。
STM32——ADC读取光敏传感器控制LED灯,看门狗中断

程序代码

#include "LightAD.h"
#include "stm32f10x.h"                  // Device header
#include "LED.h"

#define RCC_LightADC RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA

#define GPIO_LightADC GPIOA
#define PIN_LightADC GPIO_Pin_0
#define Channel_LightADC ADC_Channel_0

unsigned int HighThreshold = 3000;
unsigned int LowThreshold = 0;

//用AD转换配合模拟看门狗 单次转换非扫描

extern char BrightEnough; 

先宏定义引脚和通道,定义三个变量,两个是看门狗监控的高低阈值,一个是main.c中定义的标志位,判断当前光线是否够亮。

void Light_GPIOInit()
{
	GPIO_InitTypeDef GPIO_AD;
	GPIO_AD.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_AD.GPIO_Pin =  PIN_LightADC;		
	GPIO_AD.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIO_LightADC,&GPIO_AD);	
}

配置GPIO口,注意GPIO模式要选择模拟输入

void WatchDog_ADInit()
{
	ADC_AnalogWatchdogSingleChannelConfig(ADC1, Channel_LightADC);
	ADC_AnalogWatchdogThresholdsConfig(ADC1,HighThreshold,LowThreshold);
	ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleRegEnable);
	
	ADC_ITConfig(ADC1,ADC_IT_AWD,ENABLE);
}

配置看门狗,选择ADC1或2,选择对应通道,这里只有一个光敏传感器,一般选择通道0。

void Light_NVICInit()
{
	NVIC_InitTypeDef nvic_struct;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	nvic_struct.NVIC_IRQChannel = ADC1_2_IRQn;
	nvic_struct.NVIC_IRQChannelCmd = ENABLE;
	nvic_struct.NVIC_IRQChannelPreemptionPriority = 3;
	nvic_struct.NVIC_IRQChannelSubPriority = 3;
	
	NVIC_Init(&nvic_struct);
}

开启NVIC通道,优先级随便填。

void ADC1_2_IRQHandler()
{
	if(ADC_GetITStatus(ADC1,ADC_IT_AWD) == 1)
	{
		BrightEnough = 0;
		LEDOn();
		ADC_ClearITPendingBit(ADC1,ADC_IT_AWD);
	}
}

配置中断函数,当进入中断,则光线不够亮,并打开LED灯,最后清除标志位,注意中断标志位是ADC_IT_AWD。

void Light_ADInit()
{
	//ADC1通道0在PA0
	RCC_APB2PeriphClockCmd(RCC_LightADC,ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//最高14Mhz,72 六分频 12Mhz
	
	Light_GPIOInit();//1
	
	//选择规则组的输入通道
	//通道0,序列1,中等采样时间
	ADC_RegularChannelConfig(ADC1, Channel_LightADC, 1, ADC_SampleTime_55Cycles5);
	
	//初始化ADC
	ADC_InitTypeDef adc_struct;
	adc_struct.ADC_Mode = ADC_Mode_Independent;
	adc_struct.ADC_DataAlign = ADC_DataAlign_Right;
	adc_struct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	adc_struct.ADC_NbrOfChannel = 1;
	adc_struct.ADC_ContinuousConvMode = DISABLE;
	adc_struct.ADC_ScanConvMode = DISABLE;
	//单次转换非扫描,只有一个通道
	ADC_Init(ADC1,&adc_struct);
	
	//配置看门狗和中断
	WatchDog_ADInit();//2
	Light_NVICInit();//3
	
	ADC_Cmd(ADC1,ENABLE);
	
	//先复位校准
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1) == 1);
	//等待复位校准完成,当寄存器软件置1开始校准,校准完硬件置0
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1) == 1);
}

配置ADC,选择规则组的输入通道,选择ADC独立模式,而不是ADC1和ADC2共同工作的合作模式,后者的优势是转换更快,但是没必要,ADC转换时间是很短的,下面会有计算。设置数据对齐方式是右对齐。一般都是设置右对齐,左右对齐的知识大家可以自行搜索。选择不设置外部触发源,选择单次触发,非扫描模式。通道数量设置为1条。之后记得复位校准,否则可能造成数值漂移。

//可以采用单次扫描更改扫描通道的方式来实现多通道采集,注意修改GPIO初始化引脚
unsigned int Light_GetADVal()
{
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);
	while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == 0);
	//等待规则组转换完成
	//采样时间是55.5,转换固定周期是12.5,一共68个周期
	//72MHZ6分频,12Mhz 68个周期,时间大约是1/12M * 68,约5.6us
	ADC_SoftwareStartConvCmd(ADC1,DISABLE);
	return ADC_GetConversionValue(ADC1);
}

读取AD值,AD转换周期如程序中注释所示,得出时间大约为5.6us,时间非常短。同时,如果有多个输入设备,可以采用单次非扫描的方式来达到单次连续扫描的效果,只需要在一个设备读取完之后更改下次要读取的通道,每次读取完之后更新AD数值和通道。
方法一只要在主函数中拿读取到的AD值判断后再执行功能就行,方法二用上面的看门狗代码配置后在看门狗中断中配置函数即可。

结语

STM32的ADC功能很多,这里只是简单介绍基本使用的方法,剩下内容留待读者去探索。文章来源地址https://www.toymoban.com/news/detail-417017.html

到了这里,关于STM32——ADC读取光敏传感器控制LED灯,看门狗中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Stm32_标准库_11_ADC_光敏&热敏传感器_测数值

    在测量光敏传感器数值得基础上手动将通道改成热敏传感器通道即可 由于温度传感器的测量范围是-20 ~ 105摄氏度,所以输出温度得考虑带上符号这就需要在原有输出光照强度代码的基础上新添加几个函数 函数1: 在获取模拟电压函数最开始写入通道函数方便接入GPIO_1或GPIO_

    2024年02月19日
    浏览(15)
  • Stm32_标准库_8_ADC_光敏传感器_测量具体光照强度

    ADC简介 测量方式 采用二分法比较数据 IO通道 ADC基本结构及配置路线 获取数字变量需要用到用到光敏电阻的AO口,AO端口接在PA0引脚即可 测得的模拟数据与实际光照强度之间的关系为 代码: 完整朴素代码: 效果: 此代码的不足之处在于每次写入数字都会提前占据固定位置,

    2024年02月04日
    浏览(15)
  • STM32—ADC详解入门(ADC读取烟雾传感器的值)

    目录 一、ADC是什么 二、ADC的性能指标 三、ADC特性 四、ADC通道 五、ADC转换顺序 六、ADC触发方式 七、ADC转化时间 八、ADC转化模式 九、实验(使用ADC读取烟雾传感器的值) 1、配置 2、代码         ADC是Analog-to-DigitalConverter的缩写。指模/数转换器或者模拟/数字转换器。是指

    2024年02月11日
    浏览(8)
  • DIY_实现光敏电阻传感器简单控制LED

    模块接线图: 1、VCC 接电源正极 3.3-5V 2、GND 接电源负极 3、DO TTL 开关信号输出 4、AO 模拟信号输出 模块特色: 1、工作电压3.3V-5V 2、使用宽电压LM393比较器 3、设有固定螺栓孔,方便安装 4、采用灵敏型光敏电阻传感器 5、小板PCB尺寸:3.2cm x 1.4cm 6、配可调电位器可调节检测光

    2024年02月02日
    浏览(13)
  • STM32-光敏传感器实验

    光敏传感器的主要是光敏二极管,核心是PN结,利用了光电效应,对光强很敏感,有单向导电性,工作时需要加反向电压。光照越强,等效电阻越小。 实验要求通过ADC3通道6(PF8)采集光敏二极管的电压,然后转换为0~100的光纤强度值并显示在液晶屏上。 由下图可知对于的通

    2024年02月05日
    浏览(15)
  • STM32F4_光敏传感器

    目录 1. 什么是光敏传感器、光敏电阻 2. 硬件分析 3. 实验程序 3.1 main.c 3.2 ADC3.c 3.3 ADC3.h 3.4 Lightsensor.c 3.5 Lightsensor.h 光敏传感器 也称为光电传感器。是利用光电器件把光信号转换成电信号的一种传感器。它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感

    2024年02月05日
    浏览(13)
  • STM32学习记录——光敏传感器的使用

    文章目录 前言 一、学习目的 二、模块介绍 三、代码记录 总结        只做 学习记录 ,记录自己如何从零学会使用一个模块,仅仅只是会用,缺乏专业知识。如果需要了解更多原理,可以从我推荐的技术大佬的文章中获取。        我的学习目的就是通过STM32的ADC功能,学

    2024年02月07日
    浏览(28)
  • STM32-风速传感器(ADC)

    目录 0 说明 1 传感器介绍 2 代码说明      2.1 ADC.c      2.2 adc.h     2.3 main.c          本篇文章主要是说明怎么使用STM32单片机读取风速传感器采集到的数据,读取方式是ADC,并且附带着STM32所需要的全部代码,所使用的风速传感器如下图所示。 附: 使用单片机STM32f103系

    2024年02月15日
    浏览(11)
  • STM32开发——ADC(烟雾传感器)

    目录 1.ADC简介 2.项目简介 3.CubeMX设置 4.函数代码 作用:用于读取电压值,然后转换为数字量传给单片机,单片机再通过计算,可以得到电压值。  ADC的性能指标 量程:能测量的电压范围 分辨率:ADC能辨别的最小模拟量,通常以输出二进制数的位数表示,比如:8、10、12、1

    2024年02月09日
    浏览(13)
  • STM32--ADC数值采样/附ADC采集热敏传感器使用

    目录 一丶ADC介绍 二丶ADC工作原理及管脚分布 三丶代码部分详解 (一)库函数介绍 (二)代码部分整合         ADC模块中文名为模拟/数字转换器,是12位逐次逼近型的模拟数字转换器,一般用于数值的采样   可以将引脚上连续变化的模拟电压转换为内存中存储的数字变

    2024年02月03日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包