植物百科网
当前位置: 首页 农业百科

stm32光照强度设计方案(零基础学习STM32智能家居系统之光照检测控制系统)

时间:2023-07-19 作者: 小编 阅读量: 1 栏目名: 农业百科

图1项目整体图7.2光敏传感器如图2所示,光敏传感器通过PB0引脚接入STM32。7.3采用ADC方式采集数据ADC是将采集的模拟量转化成数字量,对于STM32而言,它需要一个输入的基准电压,用于和待测的模拟电压做对比。STM32f103系列最多有3个ADC,精度为12位,每个ADC最多有16个外部通道。ADC的输入时钟不得超过14MHz,其时钟频率由PCLK2分频产生。STM32将ADC的转换分为2个通道组:规则通道组和注入通道组。

前面我们学习了STM32智能家居系统中的温湿度检测及控制系统。这一期我们学习光照检测控制系统。

7.1 项目的介绍

如图1所示。整体项目采用光敏传感器采取环境的光照强度,当光照强度的值高于某一设定值时(光照强度的数值与外界环境的亮度成反比,外界越亮,值越小),电机逆时针转动,模仿打开遮阳帘,LED灯点亮;当光照强度的值低于某一设定值时,电机顺时针转动,模仿关闭遮阳帘。

图1 项目整体图

7.2 光敏传感器

如图2所示,光敏传感器通过PB0引脚接入STM32。

囷2 光敏传感器与STM32连接原理图

图中,LS1是光敏二极管,R1为其提供反向电压,当环境光线变化时,LS1两端的电压也会随之改变,从而通过ADC1_IN6通道,读取LIGHT_SENSOR(PB0)上面的电压,即可得到环境光线的强弱。光线越强,电压越低,光线越暗,电压越高

7.3 采用ADC方式采集数据

ADC是将采集的模拟量转化成数字量,对于STM32而言,它需要一个输入的基准电压,用于和待测的模拟电压做对比。

STM32f103系列最多有3个ADC,精度为12位,每个ADC最多有16个外部通道。其中ADC1和ADC2都有16个外部通道,ADC3一般有8个外部通道,各通道的A/D转换可以单次、连续、扫描或间断执行,ADC转换的结果可以左对齐或右对齐储存在16位数据寄存器中。ADC的输入时钟不得超过14MHz,其时钟频率由PCLK2分频产生。

STM32将ADC的转换分为2个通道组:规则通道组和注入通道组。规则通道相当于正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。

图3是STM32的ADC通道与GPIO对应表:

图3 STM32的ADC通道与GPIO对应表

利用ADC完成数据采集需要采取以下步骤:

图4 ADC采集逻辑图

代码如下:

adc.h

#ifndef __ADC_H

#define __ADC_H

#include "sys.h"

void Adc_Init(void);

u16 Get_Adc(u8 ch);

u16 Get_Adc_Average(u8 ch,u8 times);

#endif

adc.h是ADC完成数据采集代码的头文件,在头文件中,定义了三个函数,一个是void Adc_Init(void),进行Adc通道的初始化,主要完成Adc1通道的引脚的定义(PB0)和ADC模式的定义;第二个函数是u16 Get_Adc(u8 ch),这个函数完成对Adc通道数据的采集;第三函数是u16 Get_Adc_Average(u8 ch,u8 times),完成对该通道多次采集的数据平均值。

adc.c

#include "adc.h"

#include "delay.h"

#include "usart.h"

//初始化ADC

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

//我们默认将开启通道0~3

void Adc_Init(void)

{

ADC_InitTypeDef ADC_InitStructure; //声明ADC结构体

GPIO_InitTypeDef GPIO_InitStructure;//声明GPIO结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道时钟

RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

//PA1 作为模拟通道输入引脚

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

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

GPIO_Init(GPIOB, &GPIO_InitStructure);

ADC_DeInit(ADC1); //复位ADC1

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式

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

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

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

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

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

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

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

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

while(ADC_GetResetCalibrationStatus(ADC1));

ADC_StartCalibration(ADC1);

while(ADC_GetCalibrationStatus(ADC1));

}

//获得ADC值

//ch:通道值 0~3

u16 Get_Adc(u8 ch)

{

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

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

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

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

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

}

u16 Get_Adc_Average(u8 ch,u8 times)

{

u32 beam_value=0;

u8 t;

for(t=0;t<times;t)

{

beam_value =Get_Adc(ch);

delay_ms(5);

}

return beam_value/times;

7.4 串口通信

为了显示光照强度的数值,我们在项目中开始设置串口进行显示所采集的数值。

首先,我们先来了解串口通信的基本概念。

串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。具体如图5所示。

图5 串口通信示意图

从图5中可知, 串口是一位一位地将数据发送出去,接收时也是一位一位的进行接收,但是,在计算机当中 ,数据的处理是按字节进行并行处理的,所以要想把数据按位的进行发送和接收,就需要串行接口电路的工作。

串行接口电路就是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件的接口电路。

在串口接口电路的帮助下,串口通信可以很顺利地实现,那么串口通信有哪些优点和缺点呢?

串口通信的缺点非常明显,就是按位的串行通行比按字节(byte)的并行通信慢;但是串口通信的优点也同时非常明显。

第一:结构简单:串口可以使用四根线就完成通信,一根为VCC电源,一根为GND地线,另外两根线分别为RXD和TXD,RXD完成发送数据,TXD完成接收数据。

第三:通信距离长:相对于其他的通信方式,串口通信的距离可达1200米,这个距离已经很长了。

配置串口通信需要多个参数,其中最重要的是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

波特率

波特率用来衡量符号传输的速率。具体指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位*240个/秒=2400bps。波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信。

数据位

这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

停止位

停止位用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

奇偶校验位

在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

串口设置的一般步骤可以总结为如下几个步骤:

1) 串口时钟使能,GPIO时钟使能;

2) 串口复位;

3) GPIO端口模式设置;

4) 串口参数初始化;

5) 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤);

6) 使能串口;

7) 编写中断处理函数;

相关程序以及解释如下:

首先定义一个函数,函数命名为uart_init,函数的输入变量为波特率bound。

在函数uart_init中是按照上面的7个步骤进行定义。

void uart_init(u32 bound){

//定义三个结构体:GPIO、串口、中断

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

//使能USART1,GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);

//定义串口的TX和RX的GPIO

//定义USART1_TX ,使用GPIOA.9,发送数据,采用推挽输出

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

//定义USART1_RX,使用 GPIOA.10,接收数据,采取浮空输入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10

//Usart1 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;//串口波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

//初始化串口

USART_Init(USART1, &USART_InitStructure); //初始化串口1

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

USART_Cmd(USART1, ENABLE); //使能串口1

}

定义好串口之后,就可以调用了,在需要的地方,使用uart_init(******)进行初始化,中间的****为设定的波特率。同时采取printf(*****)输出串口的数据,在本例中,串口只是用来输出光敏电阻的数据,所以串口只用来输出数据;

以上是STM32 智能家居系统中光敏传感器和串口的工作。欢迎共同讨论,纠错。期待关注、点赞、转发。粉丝朋友可直接私信索要相关资料(项目源码)。

    推荐阅读
  • 突触名词解释(突触是什么意思)

    突触名词解释突触是指一个神经元的冲动传到另一个神经元或传到另一细胞间的相互接触的结构。突触是神经元之间在功能上发生联系的部位,也是信息传递的关键部位。在光学显微镜下,可以看到一个神经元的轴突末梢经过多次分支,最后每一小支的末端膨大呈杯状或球状,叫做突触小体。这些突触小体可以与多个神经元的细胞体或树突相接触,形成突触。从电子显微镜下观察,可以看到,这种突触是由突触前膜、突触间隙和突触后膜三部分构成。

  • 《守望先锋》对战局影响大招top一览 守望先锋对局战绩

    今天小编要为大家带来的是玩家“黑呦酱”分享的《守望先锋》对战局影响大招top一览,感兴趣的玩家赶紧一起来看看吧!守望先锋大招分为四类,控制类,自身BUFF类,辅助类以及伤害类,由于伤害类大部分使用大招时,本体无法进行有效杀伤,且控制类及自身BUFF类需要其他技能的配合,so,此间因素也要加入考量。

  • 运动后喝黑咖啡还能燃脂吗 运动时喝黑咖啡会加快燃脂吗?

    2、运动过程中身体脂肪会加速燃烧,从而具有一定减肥作用;而黑咖啡热量比较小,加上其中含有大量的咖啡因以及维生素、纤维素物质,适量喝可以促进人体肠胃蠕动,加速脂肪代谢分解,对减肥具有促进作用。

  • 斯威汽车质量怎么样(斯威质量好不好)

    2018年6月起,斯威“品质特工队”以四大火炉的重庆作为起点,途径海南、吐鲁番、格尔木三地,历时近一年进行了数十万公里极限环境适应性试验。极端干燥高温环境下,常见车内温度往往会狂飙到60℃以上,而在斯威G01的车厢里,却始终能够保持清新凉爽的状态。一整套严酷考验下来,斯威G01的性能表现完全得以充分认证。这样一算,斯威G01差不多完成了近百万公里的专业级严酷考验。

  • 春天兰花怎么养 春天兰花怎么养浇水

    白墨兰花哪个品种最好白墨兰花是墨兰的珍贵变异品种假鳞茎椭圆形,已有数百年栽培历史,流传至今,不下十数个品种,它叶色莹润、体态优雅、幽香静远、且抗病,白墨兰花比较好的品种一般分企剑和软剑两个品系。什么兰花开花最香兰花品种很多,按花香来排,在兰花界春兰居首,惠兰次之,随后便是建兰、墨兰和寒兰,春兰的花香味最正宗,持久性也极强。

  • 奔驰e300l前进挡总共有几个(你看了奔驰22款E300L升级这套原厂HUD抬头显示效果觉得怎么样)

    从行车安全的角度来考虑,加装一台HUD是非常有必要的。HUD的全称是HeadUpDisplay,中文翻译过来就是抬头显示器。今天星骏汇小陈通过以上的产品配件图了解,我们看到这台奔驰22款E300L升级HUD抬头显示所需要更换的配件有,抬显仪器,高配仪表盖板,高配仪表电脑,雨量传感器,空调管升级HUD抬头显示把仪表台上的那一块盖板换掉,换成高配的预留好显示器孔位的盖板,装上显示器,从而使仪表显示的内容投射到挡风玻璃上面。

  • 儿童葫芦丝表演(通城千人共奏葫芦丝)

    儿童葫芦丝表演香城都市报讯 10月27日,通城县隽水中学参加湖北省“黄鹤杯”美育节节目视频录制现场,七、八年级千名学生,同奏乐曲《龙的传人》。该校相关负责人介绍,本学期,每天下午预备铃响5分钟,七、八年级各班集体合奏葫芦丝。丝竹声声,已渐成校园一道靓丽的风景线。近年来,该校贯彻落实社会主义核心价值观,注重未成年人思想道德建设,坚持开设中华传统和特色民族特色教育课程,促进学生“德智体”全面发展。

  • 鸡娃时代孩子的成长之道(与其1岁就开始鸡娃)

    出生时大脑发育已经完成25%,1岁完成了50%,3岁完成了60%,6岁达到90%。现在小学虽然是零基础入学,取消了统一考试,但是它对学生的要求并没有降低。吃够了佛系养娃的亏,橙子家的老二断然不肯再佛系养了。北京卫视于2018年摄制的纪录片《起跑线》中,有一个7岁的北京女孩令人印象深刻。她的家庭,在北京三环内有一套房,一辆车。妈妈认为,孩子从小培养兴趣,靠的是父母的指引。

  • 环氧树脂的作用与用途(环氧树脂有什么作用与用途)

    环氧树脂的作用与用途具有优良的物理和电绝缘性能,强度高、收缩性低,耐腐蚀以及有高绝缘的优势,所以被称为万能胶。电器、电机绝缘封装件的浇注。从常压浇注、真空浇注已发展到自动压力凝胶成型。长时间接触胶水时,有人会有细微的皮肤过敏和细微瘙痒疼痛的情况,建议在运用时戴上防护手套,如果出现了这样的情况,需要用酒精擦洗,然后用清水冲洗干净。

  • 明月曾照江东寒剧情(明月曾照江东寒剧情介绍)

    明月曾照江东寒剧情剧情简介:美少女战清泓是武林副盟主战破敌之女,从小被父亲禁止涉及江湖事。十年一期的武林大会即将来临,战清泓瞒着家人偷跑下山,立志夺取武林盟主之位。战清泓与温宥也开始互生情愫,奈何最终被世俗礼法所阻碍。与此同时,江湖上风起云涌,战清泓发现自己自幼背诵的家训竟是人人趋之若鹜的第一神功《鹤羽剑法》。