STM32学习之搭建光敏二极管电路并采集判断光强

发布者:书香墨意最新更新时间:2019-09-10 来源: eefocus关键字:STM32  光敏二极管电路  采集判断光强 手机看文章 扫描二维码
随时随地手机看文章

硬件部分:先来看硬件连接图,此次实验选择ADC3的通道7,硬件原理图如图1所示,光敏电阻的原理在图1中已经说明,这里就不再多说。图2是stm32的部分引脚图。


图1

图 2


软件部分:


软件部分主要是三个方面,一是使用ADC时对ADC的初始化,初始化之后获取某个ADC某个通道的值,这里就是ADC3的通道7,而是哪一个通道使通过函数u16 Get_Adc3(u8 ch)  中的ch传入的。主要代码如下:


//初始化ADC3

//这里我们仅以规则通道为例

//我们默认仅开启通道7   

void  Adc3_Init(void)

{      

ADC_InitTypeDef ADC_InitStructure; 



RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3,ENABLE); //使能ADC3通道时钟

RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE);//ADC复位

RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE);//复位结束    


ADC_DeInit(ADC3);  //复位ADC3,将外设 ADC3的全部寄存器重设为缺省值


ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式: 独立模式

ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式

ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐

ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目

ADC_Init(ADC3, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器  



ADC_Cmd(ADC3, ENABLE); //使能指定的ADC3


ADC_ResetCalibration(ADC3); //使能复位校准  

 

while(ADC_GetResetCalibrationStatus(ADC3)); //等待复位校准结束


ADC_StartCalibration(ADC3); //开启AD校准

 

while(ADC_GetCalibrationStatus(ADC3)); //等待校准结束

}  

//获得ADC3某个通道的值

//ch:通道值 0~16

//返回值:转换结果

u16 Get_Adc3(u8 ch)   

{

  //设置指定ADC的规则组通道,一个序列,采样时间

ADC_RegularChannelConfig(ADC3, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC3,ADC通道,采样时间为239.5周期

ADC_SoftwareStartConvCmd(ADC3, ENABLE); //使能指定的ADC3的软件转换启动功能

while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC ));//等待转换结束

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


二是因为我们的电压输入需要用到GPIOF,所以我们需要对其进行初始化:


void Lsens_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);//使能PORTF时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//PF9 anolog输入

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚

  GPIO_Init(GPIOF, &GPIO_InitStructure);

  Adc3_Init();//这里我们可以直接调用ADC的初始化,从而将整个函数封装成光敏传感器的初始化函数,一会儿主函数中直接调用


}


对光敏传感器初始化之后需要将我们ADC3采集到的值进行一些转换,从而直接通过LCD上显示出来的值的大小判断光强,其范围设置为0~100。封装函数如下:


//读取Light Sens的值

//0~100:0,最暗;100,最亮 

u8 Lsens_Get_Val(void)

{

u32 temp_val=0;

u8 t;

for(t=0;t{

temp_val+=Get_Adc3(LSENS_ADC_CHX); //读取ADC值

delay_ms(5);

}


temp_val/=LSENS_READ_TIMES;//得到平均值 


//3.3V对应4096,而光敏电阻分得的电压值不可能大于3.3V,也就是说ADC采集到的值不可能大于4096,这里以最大4000为界


if(temp_val>4000)temp_val=4000;


//光敏电阻分得的电压值越大,则(temp_val/40)的值越大,即光敏电阻分得的电压值越大;也就是是说,光照强度越弱,所以这里在分成0~100后,用100-100-(temp_val/40)的值也就越小


return (u8)(100-(temp_val/40));

}


三是主函数部分,主函数直接调用光敏传感器的初始化函数,并在while循环中不停的获取ADC3采集后的光照强度值,代码如下:


#include

#include "stm32f10x.h"

#include "led.h"

#include "delay.h"

#include "key.h"

#include "time.h"

#include "usart.h"

#include "lcd.h"

#include "adc.h"

#include "lsens.h"



int main(void)

{

u8 adcx; 

delay_init();     //延时函数初始化  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

LED_Init(); //初始化与LED连接的硬件接口

  LCD_Init(); //初始化LCD

Lsens_Init(); //初始化光敏传感器

POINT_COLOR=RED;//设置字体为红色 

//显示提示信息      

LCD_ShowString(30,50,200,16,24,"Name:Li Hai");

LCD_ShowString(30,80,200,16,24,"Age:25");

LCD_ShowString(30,110,200,16,24,"Tel:XX");

LCD_ShowString(30,140,200,16,24,"Date:2018/3/24");  

POINT_COLOR=BLUE;//设置字体为蓝色

LCD_ShowString(30,170,200,16,24,"LSENS_VAL:");             

while(1)

{

adcx=Lsens_Get_Val();

LCD_ShowxNum(30+10*12,170,adcx,3,24,0);//显示ADC的值 

LED2_REV;

delay_ms(250);

}

}


最后将HEX文件烧写如单片机中,显示结果如图3所示。

图3

关键字:STM32  光敏二极管电路  采集判断光强 引用地址:STM32学习之搭建光敏二极管电路并采集判断光强

上一篇:STM32模拟4线 SPI驱动OLED(SSD1306)
下一篇:stm32位带操作,实现51类似的GPIO控制功能

推荐阅读最新更新时间:2024-11-09 00:23

基于STM32+JAVA宠物管理系统的设计与实现
【摘要】 本系统主要是由RFID自动识别技术,通过无线射频方式对宠物的电子标签进行读取,获取宠物的基本信息和在店内的所有消费,然后将数据通过网络传输至服务器。在应用层开发一个管理系统,对宠物信息、店内消费等各种行为进行管理。同时系统需有登录注册功能,宠物信息管理,店内消费管理等功能。 一、设计需求 本系统主要是由RFID自动识别技术,通过无线射频方式对宠物的电子标签进行读取,获取宠物的基本信息和在店内的所有消费,然后将数据通过网络传输至服务器。在应用层开发一个管理系统,对宠物信息、店内消费等各种行为进行管理。同时系统需有登录注册功能,宠物信息管理,店内消费管理等功能。 宠物店管理系统主要分为以下模块: 1.RFID模块:由天线
[单片机]
基于STM32+JAVA宠物管理系统的设计与实现
STM32外部中断配置方法讲解
01 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平、低电平)、边沿变化(上升沿、下降沿)等。51单片机有5个中断源,其中有两个是外部中断,分别为INT0和INT1,INT0被分配在P3.2引脚,INT1被分配在P3.2引脚,也即是说如果使用51单片机的外部中断0,则必须将信号接在P3.2上,否则无效。 02 举例说明什么是中断 单片机在执行程序时有两种方式: 查询方式 中断方式 所谓查询方式就是单片机一遍一遍的扫描,查看所监视的目标有没有发生变化,是一种主动式的监视方法,用一个成语可以很客观的描述:守株待兔。 所谓中断方式就是单片机不主动去监视
[单片机]
<font color='red'>STM32</font>外部中断配置方法讲解
STM32之DAC原理
1.DAC模块 1.数模转换功能 2.可以配置为8位和12位模式(8位右对齐,12位左对齐,12位右对齐) 3.DAC模块有两个单独的控制器,每个通道有着单独的转换器,可以独立转换,也可以同时转换 4.可以实现噪声波形和三角波形的生成 5.每个通道有着DMA功能 6.图示: PS:左上方为一些触发的条件,左下方为一些数字电源(VDDA,VSSA) Vref+为参考电压,DAC_OUT_x为DAC的输出通道,(2.4v Vref VDDA) 数据并不是直接传入DORx的,需要先传入DHRx(如果没有选择硬件触发(TENx=0),在一个时间周期后传入DORx),同时,又经过Tsetting(大约3us)
[单片机]
<font color='red'>STM32</font>之DAC原理
stm32 ADC知识总结(二)
关于STM32的ADC的一些重要特点需要记住: 1)STM32F103系列至少有2个ADC,这些ADC可以独立使用,也可以使用双重模式(提高采样率); 2)STM32的ADC是12位逐次逼近型的模数转换器,一共有18个通道,可以测量16个外部信号和2个内部信号源; 3)每个通道的ADC可以在单次、连续、扫描或者间断模式下进行; 4)前面讲过STM32的ADC是12位的,结果存储在16位的数据寄存器中,有4位用不到,所以ADC存在左对齐或右对齐的方式; 5)模拟看门狗允许应用程序检测输入电压是否超出用户定义的高低阈值; 6)STM32的ADC最大的转换速率为1MHz,也就是说最快转换时间为1us,为了保证ADC转换结果的
[单片机]
<font color='red'>stm32</font> ADC知识总结(二)
TLC2543和TLV5614的STM32程序
使用STM32的两个硬件SPI完成数据的读写,具体的见程序注释 1 /**************************(C) COPYRIGHT SunHao 2011*************************** 2 名称:ADDA.c 3 功能:ADDA的相关配置以及读取函数 4 作者:孙浩 5 时间:2011.4.25 6 版本:1.0 7 注意:对照TLC2543时序图,确保对应时序一致,读写速度不宜太快 8 *******************************************************************************/ 9 #include
[单片机]
STM32中断源位置
在...CMSISDeviceSTSTM32F10x中的stm32f10x.h, 然后在结构体IRQn_Type找到对应单片机型号的代码片段。 比如STM32F103C8T6属于STM32F10X_MD, 那对应的中断源为: 再比如STM32F103ZET6对应的是STM32F10X_HD
[单片机]
<font color='red'>STM32</font>中断源位置
stm32 bootloader更新固件重启 IWDG独立看门狗
问题现象:直接从固件soft reset到bootloader更新中途,pcb板子会重启 问题原因:固件程序中开启了IWDG(独立看门狗),在进行固件更新的时候没有喂狗,导致 计数计到0,看门狗重进行reset。 问题解决: 1、因为独立看门狗一旦开启是不能关闭的,所以要么在bootloader中喂狗要么不启动。 2、改用窗口看门狗,在soft reset之前将看门狗关闭。
[单片机]
STM32启动解析,启动代码,__main main
启动代码看这里: http://blog.csdn.net/chehlcy/article/details/5164472 在启动文件我们看到了__main和用户写的main,这2个是有区别的,大概流程如下: 1、复位第一条指令:Reset_Handler PROC,这里指定为 LDR R0, =__main。表示调用库函数__main,当然,我们可以在__main前做点事情,比如PLL初始化等。 2、__main()的执行流程参考: 跟一下汇编,大概是__scatterload()- __rt_entry()- __user_setup_stackheap() 3、最后调用用户的main()函数。 4、可以不使用C
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved