基于FPGA的智能台灯系统设计与实现(附带完整工程+论文)

首先先声明一下,本项目已经结题,可以放心根据我的设计进行二次开发和直接套用!!!

代码每行都标有注释,方便同学进行学习!!

完整工程文件下载:基于FPGA的智能台灯系统  

https://pan.baidu.com/s/1bgGqChhUrTPyvn7ITrZSqA?pwd=8l29


引言

        本课题设计的目标,本设计主要通过Altera公司的Cyclone Ⅳ系列的EP4CE6E22C8实现多功能智能台灯的设计与制作。

        该智能台灯的主要功能是完成按键实现自动、手动调光切换,以及测距,语音播报等功能。晶振模块主要作用是给开发板提供稳定的时钟脉冲信号,电源为系统提供一个稳定的电压源。通过超声波以及光照传感器实现距离以及光照强度数据的采集,然后将这些数据再传输到主控芯片上,由主控芯片进行数据处理,一旦测距小于设置阈值则触发语音提醒,按键控制光照的手动、自动调节,并且可以根据光照的大小实现自适应调光,还可以通过按键设置闹钟,FPGA将处理好的数据传输到数码管显示模块。

一、设计背景

        随着科技的不断发展,智能家居逐渐成为人们日常生活的一部分。智能台灯作为智能家居系统中的一个重要组成部分,具备多种智能功能,能够满足用户对照明、环境监测等方面的需求。本设计旨在基于Altera公司Cyclone IV系列FPGA芯片(EP4CE6E22C8),实现一款多功能智能台灯。

        本设计的实现不仅提高了台灯的智能化程度,还为用户提供了更加人性化的操作体验,具备较高的市场应用价值。

二、设计实现功能

(1)光照强度数据的采集,并传入FPGA

(2)超声波测距,测量主人和桌子的距离

(3)按键控制光照的手动、自动调节

(4)最小距离时,语音播报提醒

(5)数码管显示数字钟,可设置闹铃

三、设计选型

(1)FPGA芯片:Inter 公司 EP4CE6E22C8 主芯片

(2)测距模块:超声波模块 HC-SR04 

(3)感光模块:光照传感模块 AP3216C

(4)数码管模块:共阳极数码管

四、设计方案

        通过超声波以及光照传感器实现距离以及光照强度数据的采集,然后将这些数据再传输到主控芯片上,由主控芯片进行数据处理,一旦测距小于设置阈值则触发语音提醒,按键控制光照的手动、自动调节,并且可以根据光照的大小实现自适应调光,还可以通过按键设置闹钟,FPGA将处理好的数据传输到数码管显示模块。基于FPGA的智能台灯设计的系统框图如下图所示:

 

五、硬件介绍

1、开发板介绍

        本设计FPGA部分没有进行硬件画板子设计,采用的是小精灵V2(Spirit_V2)开发板,该开发板正好可以满足我这次设计的所以外设,并且资源够用,如果大家没有这个开发板的话,也可以随便找一个你自己的开发板,工程可以完全移植

2、测距模块介绍

        本设计的测距模块选择的是大家经常使用的超声波测距模块,型号为HC-SR04,提供2cm~400cm的测距功能,精度达3mm。大家可以自行在某宝购买(超便宜)。

3、感光模块介绍

        本设计感光模块选择的是光照传感AP3216C,AP3216C是敦南科技出品的一款集成sensor, 其中包括 :ALS(数字型环境光线感应 sensor),PS(测距sensor)IR(照射sensor)。这款sensor主要用在手机、平板电脑、电视、显示器、数码相机等产品上。驱动方式: 采用标准的I2C接口,且工作在快速模式(400K Hz)。

六、设计思路

1、整体设计

        本设计为多功能智能台灯设计,采用FPGA作为核心控制整个电路,预期对需要的功能绘制流程图和各个子模块框图,导出数据通道和控制单元,编写Verilog代码,对代码进行仿真和验证。

        整个系统设计分为超声波雷达模块(hc_sr05),光照传感模块(ap3216c),按键控制模块(xiaodou),超声波测距模块(uart),数码管显示模块(seg_led)以及LED驱动模块(led_control)。

2、超声波模块设计

         超声波模块实现时序图如下,通过时序图我们可以知道,我们给HC-SR04发送长达10us的TTL脉冲,然后模块就会进行测距,测距的结果通过回响信号传达,回响的TTL电平信号时间即是超声波从HC-SR04模块发出,触碰到障碍物后返回到HC-SR04模块的时间总和。

        TTL是逻辑电平标准,当电压达到2.4V~5V之间,那么为逻辑1(高电平),电压在0V~0.4V之间,那么为逻辑0(低电平)。所以我们可以直接通过GPIO口来输出以及输入时序所需的电平信号。

3、光感传感器设计

        AP3216C内部有一些寄存器,每个寄存器的位宽为8bit,我们可通过只写寄存器设置AP3216C的工作模式、中断方式、数据参数等。这里仅为大家介绍本次实验所配置到的寄存器,其余寄存器,感兴趣的读者可以参考AP3216C数据手册进行进一步了解。

写寄存器时序

读寄存器时序

七、设计代码

1、超声波雷达模块(hc_sr05_module.v)

        该模块hc_sr05_module是用于控制 HC-SR05 超声波测距模块的接口模块,主要功能是通过超声波传感器测量距离,并将采集到的数据传输给主控系统。

代码如下:

module hc_sr05_module(
				clk,rst_n,
				trig,echo,
				num_cm,
				num_en
			);
input clk;	//时钟	   
input rst_n;	//复位
output trig;	//超声波测距模块触发信号														
input echo;		//超声波模块回传信号	
output [27:0]num_cm;//采集到的距离数据
output num_en;		//做一个数据有效信号,方便后续处理									
				
	
reg[24:0] cnt;	          //计数器		
reg[23:0] cnt_time;	          //计数器								
reg[19:0] pulse;				
reg[19:0] pulse_r;
reg cnt_flag;
reg nege_echo_r1;
reg clk_25M;
reg adc_en ;

/*
字数太多省略
*/

wire [21:0] s0;
wire [25:0] s1;
assign s0= {pulse_r[19:0],2'd0};
assign s1= {pulse_r[19:0],6'd0};
reg [27:0] s;   
always @(posedge clk_25M or negedge rst_n)
	if(!rst_n) 
		s <= 20'd0;
	else 
		s <= {5'd0,s0} + {1'd0,s1};   //超声波的高电平时钟周期数乘以68就是测出来的距离
  

assign num_cm = s;
assign num_en = nege_echor3;

2、光感传感器模块(ap3216c.v)

        该模块 ap3216c是一个针对 AP3216C 传感器的接口模块,AP3216C 是一款集成了环境光传感器(ALS)和接近传感器(PS)的I2C接口传感器。它能够提供环境光强度和接近检测数据,广泛应用于智能设备中的自动亮度调节和接近检测。

代码如下:

module ap3216c(
    //system clock
    input                 clk        ,    // 时钟信号
    input                 rst_n      ,    // 复位信号

    //i2c interface
    output   reg          i2c_rh_wl  ,    // I2C读写控制信号
    output   reg          i2c_exec   ,    // I2C触发执行信号
    output   reg  [15:0]  i2c_addr   ,    // I2C器件内地址
    output   reg  [ 7:0]  i2c_data_w ,    // I2C要写的数据
    input         [ 7:0]  i2c_data_r ,    // I2C读出的数据
    input                 i2c_done   ,    // I2C一次操作完成

    //user interface
    output   reg  [15:0]  als_data   ,    // ALS的数据
    output   reg  [ 9:0]  ps_data         // PS的数据
);

//parameter define
parameter      TIME_PS   = 14'd12_500  ;  // PS转换时间为12.5ms(clk = 1MHz)
parameter      TIME_ALS  = 17'd100_000 ;  // ALS转换时间为100ms(clk = 1MHz)
parameter      TIME_REST =  8'd2       ;  // 停止后重新开始的时间间隔控制


/*
字数有限省略部分代码
*/

//当采集的环境光转换成光照强度(单位:lux)
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        als_data_r1 <= 16'd0;
    else if(als_done)
        als_data_r1 = als_data_t * 6'd35;
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        als_done_r1 <= 1'd0;
    else 
        als_done_r1 = als_done;
end


always @(posedge clk or negedge rst_n) begin
    if(!rst_n)
        als_data <= 16'd0;
    else if(als_done_r1)
        als_data = als_data_r1  / 7'd100;
end


endmodule

3、iic驱动模块

此模块主要是IIC驱动,用于光感传感器模块

部分代码如下

/localparam define
localparam  st_idle     = 8'b0000_0001; //空闲状态
localparam  st_sladdr   = 8'b0000_0010; //发送器件地址(slave address)
localparam  st_addr16   = 8'b0000_0100; //发送16位字地址
localparam  st_addr8    = 8'b0000_1000; //发送8位字地址
localparam  st_data_wr  = 8'b0001_0000; //写数据(8 bit)
localparam  st_addr_rd  = 8'b0010_0000; //发送器件地址读
localparam  st_data_rd  = 8'b0100_0000; //读数据(8 bit)
localparam  st_stop     = 8'b1000_0000; //结束I2C操作

//reg define
reg            sda_dir   ; //I2C数据(SDA)方向控制
reg            sda_out   ; //SDA输出信号
reg            st_done   ; //状态结束
reg            wr_flag   ; //写标志
reg    [ 6:0]  cnt       ; //计数
reg    [ 7:0]  cur_state ; //状态机当前状态
reg    [ 7:0]  next_state; //状态机下一状态
reg    [15:0]  addr_t    ; //地址
reg    [ 7:0]  data_r    ; //读取的数据
reg    [ 7:0]  data_wr_t ; //I2C需写的数据的临时寄存
reg    [ 9:0]  clk_cnt   ; //分频时钟计数

//wire define
wire          sda_in     ; //SDA输入信号
wire   [8:0]  clk_divide ; //模块驱动时钟的分频系数

//*****************************************************
//**                    main code
//*****************************************************

//SDA控制
assign  sda     = sda_dir ?  sda_out : 1'bz;     //SDA数据输出或高阻
assign  sda_in  = sda ;                          //SDA数据输入
assign  clk_divide = (CLK_FREQ/I2C_FREQ) >> 2'd2;//模块驱动时钟的分频系数

4、顶层模块

此模块主要例化各个分模块,把所有功能集合再一次,也可以展示所有的端口

部分例化代码:



//例化AP3216C测量模块
ap3216c u_ap3216c(
    //system clock
    .clk         (iic_clk   ),               // 时钟信号
    .rst_n       (sys_rst_n ),               // 复位信号
    //i2c interface
    .i2c_rh_wl   (i2c_rh_wl ),               // I2C读写控制信号
    .i2c_exec    (i2c_exec  ),               // I2C触发执行信号
    .i2c_addr    (i2c_addr  ),               // I2C器件内地址
    .i2c_data_w  (i2c_data_w),               // I2C要写的数据
    .i2c_data_r  (i2c_data_r),               // I2C读出的数据
    .i2c_done    (i2c_done  ),               // I2C一次操作完成
    //user interface
    .als_data    (als_data  ),               // ALS的数据
    .ps_data     (          )                // PS的数据
);

hc_sr05_module U_hc_sr05_module(
    .clk         (sys_clk   ),               // 时钟信号
    .rst_n       (sys_rst_n ),               // 复位信号
    .trig        (trig      ),               // 超声波触发信号
    .echo        (echo      ),               // 超声波回传信号
    .num_en      (distance_en),               // 距离有效信号
    .num_cm      (num_cm    )               // 距离数据
);



//报警模块
warning warning(
    .clk         (sys_clk   ),               // 时钟信号
    .rst_n       (sys_rst_n ),               // 复位信号
	.distance    (num_cm    ),              // 距离数据
	.busy        (mp3_busy  ) ,              //播报模块忙信号
	.uart_tx_mp3 (uart_tx_mp3),             //串口信号信号
    .distance_en (distance_en)               // 距离有效信号
	);

其余的代码就不一个一个展示了,文章最开的时候有下载链接,可供学生下载使用。

八、modelsim仿真

仿真主要通过modelsim进行,每个模块都有独立的仿真测试,可供学生一步一步查看。

具体测试的截图如下所示

九、下板测试

        把所有外设对应引脚连接好之后,通过JTAG把工程生成的sof文件烧写到开发板

光照强的时候测试结果:

        如上图所示可以看到大致的一个硬件组成,左边是本次使用的FPGA开发板、右边分别是超声波传感器以及光照传感器,可以看到此时的数码管上显示的时间与闹钟。可以看到当前用手机模拟了一个光照比较强的环境,此刻的LED也就是本文设计的智能台灯会自动关闭8个表示完成了当前的智能调节,接下来测试光照比较弱的环境下的测试。

光照弱强的时候测试结果:

从上面的测试结果可以看到当光照比较弱的时候此刻的LED全亮,接下来验证当坐姿不正确,看书离桌子过近的情况,

可以看到此时将超声波传感器离桌面过近的时候语音会播报“距离探测过近”的警报,实践证明使用FPGA设计智能台灯是可行的,各项功能都能达到预期效果。

十、结论

本文针对智能台灯设计当中完成了以下的功能设计。

1、用按键实现自动/手动调光切换,在自动调光时,驱动光照传感器模块采集光照数据利用光照数据大小进行调光/手动时利用按键进行调光。

2、将测距模块作为台灯总开关,当检测到有人时才会开启台灯,并且测量使用者和台灯的距离,达到一定值时进行报警。

3、设计扬声器模块驱动电路,完成了语音播报提醒。


这样我们项目的完整功能就测试完毕,后期可根据需求在进行更新!!!

完整工程文件下载:基于FPGA的智能台灯系统   提取码:8l29

如果感觉文章对您有用,麻烦三连支持一下,方便下次用到的时候,就可以快速找到我,非常感谢您的支持!!!

posted @ 2025-01-09 14:22  FPGAmaster  阅读(291)  评论(0)    收藏  举报