8.3.4 智能路灯控制设计_第1页
8.3.4 智能路灯控制设计_第2页
8.3.4 智能路灯控制设计_第3页
8.3.4 智能路灯控制设计_第4页
8.3.4 智能路灯控制设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8.3.4智能路灯控制设计智能路灯控制设计利用数字型光强度传感器BH1750FVI,采集环境光线强度数据,对道路灯光进行控制,完成智能路灯的控制设计。BH1750FVI是一种两线式串行总线接口的数字型光强度传感器集成电路。BH1750FVI可以探测光线强度,并具有较大范围的光强度变化(1lux-65535lux),可以根据采集到的光线强度值来控制路灯的亮度。BH1750内部结构图,如图所示。认识BH1750FVI(1)PD:具有近似人眼反应的光电二极管(将光信号转换为电信号)。(2)APM:集成运算放大器(将PD电流转换为电压)。(3)ADC:16位AD转换器(电信号转换为数字信号)。(4)Logic+I2Cinterface:环境光计算和I2C总线接口。包括如下2个寄存器:数据寄存器:用环境光数据的存储,初值为0000_0000_0000_0000。测量时间寄存器:用于测量时间的存储,初值为0100_0101。BH1750内部结构(5)OSC:内部振荡器(典型值320kHz),它是内部逻辑的时钟。(6)ADDR:BH1750芯片的地址ADDR引脚为高电平(ADDR≥0.7VCC)时,地址为“1011100”;ADDR引脚为低电平(ADDR≤0.3VCC)地址为“0100011”。(7)DVI:参考电压。当供电后,DVI引脚至少延时1μs后变为高电平。若DVI持续低电平,则芯片不工作。BH1750内部结构测量模式测量时间分辨率L-分辨率模式16ms4lxH-分辨率模式1120ms1lxH-分辨率模式2120ms0.5lx下面以H-分辨率模式2为例,看看如何完成从“写指令”到“读出测量结果”的测量步骤:第1步:发送“连续高分辨率模式”指令;第2步:等待完成第一次高大分辨率模式的测量(最大时间位180ms);第3步:读出测量结果。当数据的高字节为“10000011”、低字节为“10010000”时,通过计算得到如下结果:(215+29+28+21+24)/1.2=28067lx具体的控制指令可以参考BH1750的参考手册。BH1750测量模式在嵌入式智能车的光强度测量电路中,数字型光强度传感器BH1750FVI的ADDR、SCL和SDA引脚分别接PG15、PB6和PB7引脚。BH1750.h头文件代码如下:#ifndef__BH1750_H#define__BH1750_H#include"sys.h"/*宏定义IO位操作*/#define

IIC_SCL

PBout(6)

//SCL输出#define

IIC_SDA

PBout(7)

//SDA输出

#define

READ_SDA

PBin(7)

//SDA输入#define

ADDR

PGout(15)

//ADDR地址输出voidBH1750_Configure(void);uint16_tGet_Bh_Value(void);#endif编写BH1750.h头文件#include"stm32f4xx.h"#include"delay.h"#include"bh1750.h"#defineSlaveAddress0x46//定义器件在IIC总线中的从地址,根据地址引脚不同修改uint8_tBUF[4];

//接收数据缓存区voidBH1750_PortInit()

//初始化SCL、ADDR:PB6和PG15引脚为推挽输出{

GPIO_InitTypeDefGPIO_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOG,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;

//PB6:SCL

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;

//输出模式

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//PG15:ADDR

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

GPIO_Init(GPIOG,&GPIO_InitStructure);}编写BH1750.c文件voidSDA_OUT()//设置SDA引脚:PB7引脚为推挽输出{

GPIO_InitTypeDefGPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;//PB7:SDA

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;

GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;

GPIO_Init(GPIOB,&GPIO_InitStructure);}voidSDA_IN()//设置SDA引脚:PB7引脚为上拉输入{

GPIO_InitTypeDefGPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;//PB7:SDA

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;

GPIO_Init(GPIOB,&GPIO_InitStructure);}编写BH1750.c文件/*产生IIC起始信号*/voidBH1750_Start(){

SDA_OUT();//SDA线输出

IIC_SDA=1;

IIC_SCL=1;

delay_us(4);

IIC_SDA=0;//起始信号:当CLK为高时,DATA从高电平到低电平

delay_us(4);

IIC_SCL=0;//保持IIC总线,准备发送或接收数据}/*产生IIC停止信号*/voidBH1750_Stop(){

SDA_OUT();

//SDA线输出

IIC_SDA=0;//停止信号:当CLK为高时,DATA从低电平到高电平

IIC_SCL=1;

delay_us(4);

IIC_SDA=1;//发送IIC总线结束信号

delay_us(4);}编写BH1750.c文件/*产生IIC应答信号*/voidBH1750_SendACK(uint8_tack){

SDA_OUT();//SDA线输出

if(ack)

IIC_SDA=1;//写应答信号

else

IIC_SDA=0;

IIC_SCL=1;//拉高时钟线

delay_us(2);//延时

IIC_SCL=0;//拉低时钟线

delay_us(2);//延时}/*产生IIC接收信号*/uint8_tBH1750_RecvACK(){

uint8_tdata;

SDA_IN();

//SDA设置为输入

IIC_SCL=1;

//拉高时钟线

delay_us(2);

//延时

data=READ_SDA;//读应答信号

IIC_SCL=0;

//拉低时钟线

delay_us(2);

//延时

returndata;

//返回读到的应答信号}编写BH1750.c文件/*向IIC总线发送一个字节数据*/voidBH1750_SendByte(uint8_tdat){

uint8_ti,bit;

SDA_OUT();

//SDA线输出

for(i=0;i<8;i++)//8位计数器

{

bit=dat&0x80;

if(bit)

IIC_SDA=1;

else

IIC_SDA=0;

dat<<=1;

//移出数据的最高位

IIC_SCL=1;//拉高时钟线

delay_us(2);//延时

IIC_SCL=0;//拉低时钟线

delay_us(2);//延时

}

BH1750_RecvACK();}/*从IIC总线接收一个字节数据*/uint8_tBH1750_RecvByte(){

uint8_ti;

uint8_tdat=0;

SDA_IN();

//SDA设置为输入

IIC_SDA=1;

//使能内部上拉,准备读取数据,

for(i=0;i<8;i++)//8位计数器

{

dat<<=1;

IIC_SCL=1;//拉高时钟线

delay_us(2);//延时

if(READ_SDA)

dat+=1;

IIC_SCL=0;//拉低时钟线

delay_us(2);//延时

}

returndat;//返回接收到的一字节数据}编写BH1750.c文件/*向bh1750写入命令*/voidSingle_Write_BH1750(uint8_tREG_Address){

BH1750_Start();

//起始信号

BH1750_SendByte(SlaveAddress);//发送设备地址+写信号

BH1750_SendByte(REG_Address);

//内部寄存器地址,

BH1750_Stop();

//发送停止信号}/*初始化BH1750*/voidBH1750_Configure(void){

BH1750_PortInit();

Single_Write_BH1750(0x01);

ADDR=0;//将ADDR位初始化拉低}编写BH1750.c文件/*连续读出BH1750内部数据*/voidMultiple_Read_BH1750(void){

uint8_ti;

BH1750_Start();

//起始信号

BH1750_SendByte(SlaveAddress+1);//发送设备地址+读信号

for(i=0;i<3;i++)

//连续读取2个地址数据,存储中BUF

{

BUF[i]=BH1750_RecvByte();//BUF[0]存储0x32地址中的数据

if(i==3)

{

BH1750_SendACK(1);//最后一个数据需要回NOACK

}

else

{

BH1750_SendACK(0);//回应ACK

}

}

BH1750_Stop();//停止信号}编写BH1750.c文件/*读取光强度值*/uint16_tGet_Bh_Value(void){

floattemp;

unsigned

intdata;

intdis_data;

Single_Write_BH1750(0x01);//开电源

Single_Write_BH1750(0x10);//H-分辨率模式

Multiple_Read_BH1750();

//连续读出数据,存储在BUF中

dis_data=BUF[0];

dis_data=(dis_data<<8)+BUF[1];//合成数据,即光强度数据

temp=(float)(dis_data/1.2);

data=(int)temp;

returndata;//返回光强度值}编写BH1750.c文件前面定义的红外发射控制数组有光档加1、光档加2和光档加3,智能路灯光档控制函数Light_Gear(),代码如下:voidLight_Gear(u8temp)//temp=1:光档加1,=2:光档加2,=3:光档加3{

if(temp==1)

{

Transmition(H_1,4);//H_1是光档加1的红外发射控制数组,4个字节

}

else

if(temp==2)

{

Transmition(H_2,4);//H_2是光档加2的红外发射控制数组,4个字节

}

else

if(temp==3)

{

Transmition(H_3,4);//H_3是光档加3的红外发射控制数组,4个字节

}

delay_ms(1000);}红外发射智能路灯的光档程序设计其中,光档加1、光档加2和光档加3的红外发射控制数组是在主文件中定义的,代码如下:u8H_1[4]={0x00,0xFF,0x0C,~(0x0C)};//光源档位加1u8H_2[4]={0x00,0xFF,0x18,~(0x18)};//光源档位加2u8H_3[4]={0x00,0xFF,0x5E,~(0x5E)};//光源档位加3红外发射智能路灯的光档程序设计通过数字型光强度传感器BH1750FVI获得光强度值后,通过冒泡排序法即可得知当前光照档位,根据当前的光强度值,来设置智能路灯指定的光档位。智能路灯的光档控制函数Light_Inf(),代码如下:智能路灯的光档程序设计uint8_tLight_Inf(uint8_tgear){

uint8_ti;

uint8_tgear_init=0;//初始挡位值

uint16_tarray[2];

//缓存自学习的光档位数组

if((gear>0)&&(gear<5))

{

delay_ms(100);

array[0]=Get_Bh_Value();//读取当前光强度值,保存在array[0]中

for(i=0;i<4;i++)

{

gear_init++;

Infrared_Send(Light_plus1,4);//光源档位加1

delay

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论