项目背景与要求:
根据安装在室外的光照传感器所采集的光照度的不同, 分级控制室内隧道灯亮度值的变化。 由此可达到室内灯的智能控制,应用在其他行业可以达到节省
功耗和防止安全事故的目的,比如在隧道照明。可以根据人眼对亮度值舒适度的区间,智能的控制隧道灯的亮度,使司机在进入隧道和驶离隧道时视觉差降
到最低,以防止安全事故的发生。室内调节与隧道调节刚好相反。室内调节的目的是根据室外光照度值反比式的调节室内亮度,当室外越暗时,室内的亮度
值越高; 隧道照明的目的是为了缩小司机的视觉差,所以在进入隧道和出隧道时隧道灯亮度值应该与隧道外的亮度值正比,比例最好接近1:1.
此项目模拟室内照明,隧道照明同理;
项目耗材:
(1):电力载波模块
(2):光照度传感器、stm32f103zet6开发板两块、隧道灯一个、杜邦线若干、供电模块不计。
项目所用知识点:
modbus通讯协议、串口收发、串口中断、PWM波、定时器。
项目思路整理:
(1)用一块stm32f103zet6开发板采集光照度传感器的数据,采集过程采用modbus通讯协议、485接口。
(2)将采集回来的数据经过485转TTL模块后,通过开发板串口4【PC10 PC11】传送到单片机内。
(3)配置串口4接收中断,等到接收到传感器传回来的数据时,进入串口4接收中断。
(4)中断函数为通过modbus的协议规则,读取正确的传感器数据,并将正确的数据存储在数组里,通过编写的数据读取函数再解析出来。
(5)对解析出来的数据与设定值进行比较,其中设置四个比较值,用于调节灯的不同亮度。
(6)当在不同区间的时候,通过串口2发送不同的数值,比如0x11 0x22 之类的。
(7)剩下的就是通过串口2硬件连接载波的调制模块将数据发送出去。
(8)在接收端,通过载波的解调模块将发送端串口2发送的数据解调出来后,送入接收端开发板。
(9)接收端开发板中是进行PWM波调光功能的,具体配置的是TIM3,PWM模式1,向上计数, PB5引脚输出波。
(10)接收端配置串口接收,当收到从发送端发送过来的数据时,通过接收到的不同值,然后设置不同的CRRX的值,以达到调节占空比的作用,以此调节
灯亮度。
项目硬件设计:
光照度传感器
485转TTL模块
发送端、接收端和隧道灯(由灯控器控制)
项目软件设计:
void UART4_IRQHandler(void)
{
u8 rec_data;
if(USART_GetITStatus(UART4, USART_IT_RXNE) == SET)
{
switch(read_state)
{
case 101:
rec_data =(u8)USART_ReceiveData(UART4);
if(rec_data==0x01)
{
buffer_i_result[0]=rec_data;
byte_count_485=1;
read_state=102;
}
else
{
byte_count_485=0; //½ÓÊÕ×Ö·û´íÎó£¬Çå³ýÊý¾ÝÁ¿
read_state=0;
}
break;/----------------------------------------
case 102:
rec_data =(u8)USART_ReceiveData(UART4);
if(rec_data==0x03)
{
buffer_i_result[1]=rec_data;
byte_count_485++;
read_state=103;
}
else
{
byte_count_485=0;
read_state=0;
}
break;
发送端中断接收程序节选
void ReadTemperatureHumidityIllumination(int* il_n)
{
u8 BUFFER_I_COMMOND[8]={0x01,0x03,0x00,0x06,0x00,0x01,0x64,0x0b};
u8 COMMOND_I_LEN=8;
read_state=101; //准备接收数据
uart4_send_buff(BUFFER_I_COMMOND,COMMOND_I_LEN);
if(read_state==110)
{
read_state=0;
*il_n=100*((buffer_i_result[3]<<8)|buffer_i_result[4]) + ((buffer_i_result[5]
<<8)|buffer_i_result[6]); //解析数据值
}
光照值接收函数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
PWM波配置函数(节选)-选用TIM3-CH2-PB5
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;
for(t=0;t<len;t++)
{
USART3->DR=USART_RX_BUF[t];
while((USART3->SR&0X40)==0);
}
USART_RX_STA=0;
}
if(USART_RX_BUF[0]==0x0A)//通过电力载波模块发送完,数据是以0a 3f开头
{
if(USART_RX_BUF[1]==0x3F)
{
if(USART_RX_BUF[2]==0x00)
{
if(USART_RX_BUF[3]==0x01)
{
LED1 = 1;
TIM_SetCompare2(TIM3,0); //节选程序
接收端PWM 输出程序
项目总结:
此项目最终完美收官,但是它对我的启发还是比较多的,正如我文章前面所说的部分,此项目的应用场景不但可以用来打造室内智慧灯的调节,还
能用来隧道灯的调节,不到节约能耗,而且特定场景下,还能保障生命财产安全。
遇到的困难和解决的办法:
PB.5引脚;输出PWM波后,直接连得灯控器,发现灯的亮度太暗,且以低频不停的闪烁。
解决办法:
分析: 可能是因为PB5输出的PWM波的高电平电压过于低,并且输出的电平不太稳定,或者会有杂波输出。
通过示波器,验证猜想;
通过波形可以看出,输出的波形高电平在合理范围之内,但是波形的高电平不稳定,并且占空比也不是很稳定。由此验证猜想,有杂波输出,影响到了占空
比稳定。基于此,构造一个放大和滤波电路,让输出信号达到稳定状态。
左图中绿色板子为焊接实物图