软件实现PWM信号,LED闪烁
2012-10-26 19:36
323 查看
【原创作品,转帖注明出处:blog.csdn.net/lanmanck】
假设一个GPIO接了一个LED,低电平就点亮LED。现在使用一个定时器,来实现LED的各种闪烁状态。
又假设一个闪烁波形为:1秒内闪2次,如下:
----| |-----| |-------------------
|___| |___|
|(起始处)------------------------>|(1秒到)
我把每次定时器进来叫做一个step,这里假设定时器时间为100ms,以step为单位定义整个周期为total_period,定义亮的时间为on_period,定义灭的时间为off_period。
最后,还要定义亮多少次为blink_cnt.
因此,如果定义一个周期为1秒,则1个total_period=1000/100ms=10个step,这样比较好计算。例如上述波形,假设:
亮200ms,灭200ms,亮2次。
则
total_period = 1000/100ms=10,
on_period=200ms/100ms=2,
off_period=200ms/100ms=2.
变量定义好了,说下产生波形的思路。定义好一个数组,用来记录哪个step需要亮灯:
u8 steps_on[128];
例如上面波形,steps_on[0/1/4/5]都等于1表示亮灯,然后呢,在定时器里面每次step++,如果发现steps_on[step]==1,那就置低电平让LED亮,这就可以了!
那么,如何初始化steps_on[]呢?看代码:
大体思路如下,在每次开始我就认为要点亮,然后记录这个step,因为点亮有时间,则使用on_period看到了没有,没有就记录一次,下次重复波形的时候就检查
是不是闪烁的次数够了,不够就继续记录。
最后实现定时器函数,比较简单了:
讲的不是很明白,有问题欢迎探讨哈!
假设一个GPIO接了一个LED,低电平就点亮LED。现在使用一个定时器,来实现LED的各种闪烁状态。
又假设一个闪烁波形为:1秒内闪2次,如下:
----| |-----| |-------------------
|___| |___|
|(起始处)------------------------>|(1秒到)
我把每次定时器进来叫做一个step,这里假设定时器时间为100ms,以step为单位定义整个周期为total_period,定义亮的时间为on_period,定义灭的时间为off_period。
最后,还要定义亮多少次为blink_cnt.
因此,如果定义一个周期为1秒,则1个total_period=1000/100ms=10个step,这样比较好计算。例如上述波形,假设:
亮200ms,灭200ms,亮2次。
则
total_period = 1000/100ms=10,
on_period=200ms/100ms=2,
off_period=200ms/100ms=2.
变量定义好了,说下产生波形的思路。定义好一个数组,用来记录哪个step需要亮灯:
u8 steps_on[128];
例如上面波形,steps_on[0/1/4/5]都等于1表示亮灯,然后呢,在定时器里面每次step++,如果发现steps_on[step]==1,那就置低电平让LED亮,这就可以了!
那么,如何初始化steps_on[]呢?看代码:
int i,j,b_cnt=0,continue_cnt=0; for(i=0;i<total_period;i++){ j = i%(on_period+off_period); /* 一个周期的开始 */ if(j==0){ if(b_cnt<blink_cnt){ continue_cnt = 0; b_cnt++; if(continue_cnt<on_period){ continue_cnt++; steps_on[i] = 1; } } }else { if(continue_cnt<on_period){ continue_cnt++; steps_on[i] = 1; } } }
大体思路如下,在每次开始我就认为要点亮,然后记录这个step,因为点亮有时间,则使用on_period看到了没有,没有就记录一次,下次重复波形的时候就检查
是不是闪烁的次数够了,不够就继续记录。
最后实现定时器函数,比较简单了:
static int led_status=LED_STATUS_OFF; if(steps_on[steps] == LED_STATUS_ON){ if(led_status!=LED_STATUS_ON){ led_status = LED_STATUS_ON; led_on(GPIO_LED); } } else{ if(led_status!=LED_STATUS_OFF){ led_status = LED_STATUS_OFF; led_off(GPIO_LED); } } steps++; steps %= total_period;
讲的不是很明白,有问题欢迎探讨哈!
相关文章推荐
- STM32F030, 使用嘀嗒定时器Systick实现LED闪烁
- 一步步点亮LED5_汇编编写延时函数并实现LED闪烁效果
- stm32实现LED灯的闪烁
- 利用51单片机实现LED闪烁
- RK3066 实现LED闪烁的代码分析
- imx6q工作队列实现led闪烁
- FPGA 降频实现led的闪烁,LED不闪烁
- 1-1 实验1 LED不停地实现闪烁(一亮一灭)
- NIOS实现LED走马灯闪烁
- 51单片机定时器实现LED闪烁
- 第二节:delay()延时实现LED灯的闪烁。
- STM32F030, 使用嘀嗒定时器Systick实现LED闪烁
- 单片机设计流水灯和实现LED的闪烁
- 用定时器实现led闪烁(间隔1s)
- STM32通用定时器实现LED灯闪烁
- 定时器查询法和定时器中断法实现LED闪烁
- 用uno实现简单的单led灯闪烁
- RK3066 实现LED闪烁的代码分析
- imx6q内核定时器实现led闪烁
- Esp8266学习之旅③ 利用 " 软件定时器 "或“硬件定时器” 定时0.5秒闪烁点亮一盏LED。(附带demo)