集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1671|回复: 1

呼吸灯原理

[复制链接]
zxopenluyutong 发表于 2021-4-27 18:14:52 | 显示全部楼层 |阅读模式

1.呼吸灯原理分析:模拟人体呼吸,吸气和呼气各占1.5S,人眼的图像滞留时间0.04s(1/24帧画面),按最快0.04s算,就是40ms。亮0.02S,灭0.02s,人眼看到的应该是一直亮(可以实验)。


2.呼吸灯程序设计:就是改变这40ms中,亮和灭所占的百分比(40ms相对不柔和,20ms效果柔和)。


亮的百分比多,人眼看到的就亮,反之就是暗(实验,为了提高呼吸灯的柔和效果,采用设置20ms一个周期,20ms内调整亮和灭的比例)


因此程序设计:1.5S需要1500/20=75个周期,75个周期中,亮度百分比有0%增长到100%,因此每个周期增长时间为20ms/75=266us(点亮)。熄灭的原理,正好相反,熄灭时间增长。程序中需要两个循环,一个用来点亮一个用来熄灭。3.STM32程序实现代码 程序要灵活设计,能够调整呼吸时间的长短,1.5s这个参数。可以调整柔和度,可以调整40ms这个周期参数,这样就实现了呼吸灯的灵活调整。源代码先不放出来了,等做完实验放出。 ***********





//=======================================


void LedOnOff(uint32_t t,uint32_t xx) //T代表整个周期的时间,xx代表周期中点亮时间的长度


{


HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET); //GPIO_PIN_SET


HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);


mydely_us(xx); //点亮时间


HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);


HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);


mydely_us(t-xx); //熄灭时间


}


//*****************


*****************************************


int main(void)


{


int i;


int myLongTime=1500; //ms 呼吸总体时间


int myshortTime=40; //ms


int myCYC=myLongTime/myshortTime;


delay_init(); //初始化延时函数


LED_Init(); //初始化LED端口


while(1)


{


for(i=1; i<myCYC; i++)


LedOnOff(myshortTime*1000,i*myshortTime*1000.0/myCYC);


for(i=myCYC; i>1; i-=1)


LedOnOff(myshortTime*1000,i*myshortTime*1000.0/myCYC);


}


}


/*





4.原理分析,


模拟人体呼吸,吸气和呼气各占1.5S,人眼的图像滞留时间0.04s(1/24帧画面)


按最快0.04s算,就是40ms。亮0.02S,灭0.02s,人眼看到的应该是一直亮(可以实验)


呼吸灯,就是改变这40ms中,亮和灭所占的百分比。


1500/40=38周期,40ms/37=1052us。38个周期变比中,每个周期增长1个单位1052us,38个周期刚好是40ms.这样达到全亮


亮的百分比多,人眼看到的就亮,反之就是暗。


利用40ms这个时间,目测感觉有闪烁,减少这个时间,变化就会缓慢,没有闪烁感。参考用20ms


//us延时函数的实现


void mydely_us(uint32_t count)


{


HAL_TIM_Base_Stop_IT(&htim1);


my_tim1_count=0;


HAL_TIM_Base_Start_IT(&htim1);


while(my_tim1_count<count);


HAL_TIM_Base_Stop_IT(&htim1);


}


void TIM1_UP_IRQHandler(void)


{


/* USER CODE BEGIN TIM1_UP_IRQn 0 */


extern uint32_t my_tim1_count;


my_tim1_count++;


__HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);


/* USER CODE END TIM1_UP_IRQn 0 */


//HAL_TIM_IRQHandler(&htim1);


/* USER CODE BEGIN TIM1_UP_IRQn 1 */


/* USER CODE END TIM1_UP_IRQn 1 */


}





5.说明:


利用HAL库,默认没有办法实现us的定时器,方法是。利用硬件定时器,产生一个1us的周期中断,每进入一次中断,一个全局变量加1,通过判断这个变量的值,来确定当前的延时时间。6.问题:1.HAL库的执行效率比较低,1us中断的实际,还没有处理完中断过程,因此需要手动修改中断函数,添加__HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);屏蔽: //HAL_TIM_IRQHandler(&htim1);这样中断处理时间会减少很多。2.全局变量的变化,如果总开着定时中断,会影响正常程序的执行,因此,需要延时的时候,开启定时器,延时结束,关闭定时器


void mydely_us(uint32_t count)


{


HAL_TIM_Base_Stop_IT(&htim1);


my_tim1_count=0;


HAL_TIM_Base_Start_IT(&htim1);


while(my_tim1_count<count);


HAL_TIM_Base_Stop_IT(&htim1);
 楼主| zxopenluyutong 发表于 2021-4-28 11:19:23 | 显示全部楼层
呼吸灯原理呼吸灯原理
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-19 07:40 , Processed in 0.054577 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表