基于STM32单片机的智能台灯设计
- 1、项目简介
- 1.1 系统功能
- 1.2 演示视频
- 2、部分电路设计
- 2.1 STM32单片机核心板电路设计
- 2.2 热释电传感器及处理电路
- 2.3 光照检测电路
- 2.4 PWM灯光调节电路
- 3、单片机代码展示
- 3.1 系统初始化
- 3.2 按键扫描函数
- 3.3 PWM调光程序设计
1、项目简介
1.1 系统功能
- 功能介绍:
- (1)信息采集部分:主要是通过光敏采集当前光线强度,通过单片机内部AD进行模数转换,通过人体红外检测当前是否有人。
- (2)单片机控制中心:采用STM32单片机系统,它是本系统的数据部分,通过不同光线情况下使用PWM脉冲电路进行调节当前灯光亮度。
- (3)模式显示:我们通过切换不同的LED指示灯来表示自动和手动。
- (4)按键设置电路:通过按键我们可以切换2种模式,手动控制和自动控制。
- (5)灯光控制:通过PMW灯光调节电路,我们可以根据不同的光线亮度,进行3挡调节。
- (6)人体感应:通过人体红外模块检测是否有人,在自动模式下,检测到有人,光线暗的情况下进行开灯。
1.2 演示视频
2、部分电路设计
2.1 STM32单片机核心板电路设计
- 基于 ARM Cortex-M3内核的STM32F1系列单片机属于主流STM32单片机,其中增强型STM32F103子系列单片机的CPU 主频高达72MHz,片内Flash容量高达1MB,芯片引脚数量多达144个,有 QFN、LQFP、CSP、BGA 等多种芯片封装形式,并具有多种片内外设、USB接口和CAN 接口。根据STM32F103单片机片内Flash容量的不同,ST 公司将其分为小容量(16-32KB)、中等容量(64-128KB)、大容量(256KB-1MB)3种。
- 电源电路:为单片机提供稳定的工作电压,通常采用3.3V电源供电。电源电路的设计要保证单片机在不同工作条件下都能获得稳定的电压输出,以确保单片机的正常工作。
- 晶振电路:提供单片机工作所需的时钟信号。晶振电路通过晶振和电容组成,为单片机提供稳定的工作脉冲,确保单片机的定时和同步需求。
- 复位电路:实现单片机的复位功能,类似于电脑的重启。复位电路通过电容和电阻的配合,实现单片机在上电启动时的自动复位,以及通过手动按键实现复位功能,保证单片机在程序跑飞或异常情况下能够重新开始执行程序。
STM32单片机是一种功能强大、易于使用、灵活且可靠的32位微控制器,基于ARM Cortex™-M内核。其主要功能特点包括:
- 高性能和低功耗:STM32系列单片机提供多种内核选择,如Cortex-M0、Cortex-M3、Cortex-M4等,满足不同应用场景对性能的需求,同时保持低功耗特性。
- 多种通信和外设接口:STM32单片机具备广泛的通信和外设接口,如I2C、SPI、USART、USB等,便于开发者实现各种复杂功能。
- 易于开发和调试:STM32单片机提供了丰富的软件和硬件工具,如HAL库、CubeMX等,帮助开发者快速创建和调试嵌入式系统。
- 高集成度和设计灵活性:STM32系列单片机全系列产品共用大部分引脚、软件和外设,优异的兼容性为开发人员带来最大的设计灵活性
单片机最小系统原理图如下图所示:
实物图:
2.2 热释电传感器及处理电路
- 热释电红外传感器能以非接触形式检测出人体辐射的红外线,并将其转变为电压信号。
- 热释电传感器具有成本低、不需要用红外线或电磁波等发射源、灵敏度高、可流动安装等特点。实际使用时,在热释电传感器前需安装菲涅尔透镜,这样可大大提高接收灵敏度,增加检测距离及范围。
- 实验证明,热释电红外传感器若不加菲涅尔透镜,则其检测距离仅为2 m左右;而配上菲涅尔透镜后,其检测距离可增加到10 m以上。由于热释电传感器输出的信号变化缓慢、幅值小(小于1 mV),不能直接作为照明系统的控制信号,因此传感器的输出信号必须经过一个专门的信号处理电路,使得传感器输出信号的不规则波形转变成适合于单片机处理的数字信号。
其具体电路原理图如下图所示:
实物图:
2.3 光照检测电路
- 光线采集电路我们是通过光敏电阻5528进行光线采集,光敏电阻会根据不同的光线值输出不同的电阻,然后把数据通过传输给单片机,单片机通过内部AD进行模数转换,根据不同的光线值单片机在通过PWM脉冲电路进行灯光调节。
其具体电路原理图如下图所示:
实物图如下:
2.4 PWM灯光调节电路
- 脉冲宽度调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。脉宽调制是开关型稳压电源中的术语。这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM、PFM混合型。
其具体电路原理图如下图所示:
3、单片机代码展示
3.1 系统初始化
void HardWare_Init(void)
{
delay_init(); //延时函数初始化
delay_ms(500); //上电瞬间加入一定延时在初始化
KEY_GPIO_Init();
Adc_Init();
LED1 = 1;
LED2 = 0;
TIM2_Init(49,71); //定时器初始化,定时50us
TIM3_Init(499,7199); //定时器初始化,定时50ms
}
3.2 按键扫描函数
void keyscan(void)
{
if(KEY1 == 0)//模式切换按键
{
delay_ms(10);//消抖
if(KEY1 == 0)
{
while(KEY1 == 0);//等待按键松开
mode = 0;
LED1 = 1;
LED2 = 0;
}
}
if(KEY2 == 0)//模式切换按键
{
delay_ms(10);
if(KEY2 == 0)
{
while(KEY2 == 0);
mode = 1;
LED1 = 0;
LED2 = 1;
}
}
if(mode == 1)
{
if(KEY3 == 0)//加键
{
delay_ms(10);
if(KEY3 == 0 )
{
while(KEY3 == 0);
if(GearTemp < 3)GearTemp++;
}
}
if(KEY4 == 0)//减键
{
delay_ms(10);
if(KEY4 == 0 )
{
while(KEY4 == 0);
if(GearTemp > 0)GearTemp--;
}
}
}
}
3.3 PWM调光程序设计
void LedGearHandle(u8 temp)//调节LED档位
{
switch(temp)
{
case(0):PWM_Val = 0xFF;PWM_LED = 0;break;
case(1):PWM_Val = 0x78;break; //120
case(2):PWM_Val = 0x32;break; //50
case(3):PWM_Val = 0x00;PWM_LED = 1;break;
default:PWM_Val = 0x00;PWM_LED = 1;break;
}
}