呼吸灯程序C代码实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
呼吸灯相关说明(基于 STM8S003F3P6 的 TIM2 定时器的 PWM) 人眼的闪烁分辨率为 50Hz 要使呼吸灯不闪烁,那么 PWM 的频率要高于 50Hz,这里使用 100Hz(周期 10ms) 吸气比呼气的速度要略快一点,吸气与呼气的比率一般为 1:1.5 人正常呼吸一次的时间为 3~5S,一般取中间值 4S 左右 那么吸气取 1.5S,呼气取 2.25S,两者相加约等于 4S 左右 最暗时不能全灭,避免出现闪烁的现象,脉宽调整范围一般设为 10%~100% //这个为简单的 IO 模拟,没有其它任务的话可以用这个实现,如果有其它任务要处理的话, 则不要使用,因为太占 CPU 资源了。 void LED_Breathing(void) //IO 口模拟(约 1S 钟吸的时间和约 1S 钟呼的时间) { s16 i; const s16 PWM = 10000; //脉宽周期 10000us = 10ms = 100Hz const s16 Rate = 100; //每次调整的脉冲宽度 100us //吸,由 0us 按照 100us 递增到 10000us,输出脉宽依次加大,由暗变亮 for(i = 0; i < PWM; i += Rate) //吸的时间,10ms*100 次等于 1S { LED_GREEN = HIGH; //输出脉冲高电平 பைடு நூலகம்elay_us(i); //脉冲高电平持续时间(即 PWM 高电平宽度) LED_GREEN = LOW; //输出脉冲低电平 Delay_us(PWM - i); //脉冲低电平持续时间(即 PWM 低电平宽度) } //呼,由 10000us 按照 100us 递减到 0us,输出脉宽依次减小,由亮变暗 for(i = PWM; i > 0; i -= Rate) //呼的时间,10ms*100 次等于 1S { LED_GREEN = HIGH; //输出脉冲高电平 Delay_us(i); //脉冲高电平持续时间(即 PWM 高电平宽度) LED_GREEN = LOW; //输出脉冲低电平 Delay_us(PWM - i); //脉冲低电平持续时间(即 PWM 低电平宽度) } }
吸气的脉宽调整率为 6us(脉冲宽度从 1000us 调整到 10000us,10%~100%) 脉宽加大调整最小值为( 1000us) 脉宽加大调整最大值为( 10000us) 那么吸气的调整次数为: (10000us - 1000us) / 6us = 1500 次 那么吸气的周期为: 1500 * 1ms = 1500ms = 1.5s 呼气的脉宽调整率为 4us(脉冲宽度从 10000us 调整到 1000us,100%~10%) 脉宽减小调整最大值为( 10000us) 脉宽减小调整最小值为( 1000us) 那么呼气的调整次数为: (10000us - 1000us) / 4us = 2250 次 那么呼气的周期为: 2250 * 1ms = 2250ms = 2.25s //采用定时器 TIM2 的 PWM 功能来实现, PWM 脉宽调整的控制周期定为 1ms void LED_Breathing(void) //定时器 TIM2 的 PWM 模式输出 { #define CT 1 //PWM 脉宽调整控制周期(1ms) #define Max 10000 //脉宽最大值限定(10000us) ,最大为 PWM 周期 #define Min 1000 //脉宽最小值限定( 1000us) ,最小为 0 #define Acc 6 //吸气的脉宽调整率为 6us #define Dec 4 //呼气的脉宽调整率为 4us static s32 count = 0; //1ms 时基计数 static s16 t = 1000; //脉冲宽度初始值为 1000us static flag = 1; //初始化切换标志为吸气状态 if((GetTickCount() - count) >= CT) //判断脉宽调整的控制周期是否到? { count = GetTickCount(); //返回 1ms 时基计数值 TIM2->CCR3H = (u8)(t >> 8); //改变 PWM 输出比较寄存器的值(高 8 位) TIM2->CCR3L = (u8)(t); //改变 PWM 输出比较寄存器的值(低 8 位) if(flag) //吸气与呼气的状态切换标志 { t += Acc; //吸气状态,脉宽加大,由暗变亮 //大于最大值时定为最大值,此时到最亮,下一状态为由亮变暗 if(t > Max){flag = 0; t = Max;} } else { t -= Dec; //呼气状态,脉宽减小,由亮变暗 //小于最小值时定为最小值,此时到最暗,下一状态为由暗变亮 if(t < Min){flag = 1; t = Min;} } } } 2015-6-5 zhouwude
吸气的脉宽调整率为 6us(脉冲宽度从 1000us 调整到 10000us,10%~100%) 脉宽加大调整最小值为( 1000us) 脉宽加大调整最大值为( 10000us) 那么吸气的调整次数为: (10000us - 1000us) / 6us = 1500 次 那么吸气的周期为: 1500 * 1ms = 1500ms = 1.5s 呼气的脉宽调整率为 4us(脉冲宽度从 10000us 调整到 1000us,100%~10%) 脉宽减小调整最大值为( 10000us) 脉宽减小调整最小值为( 1000us) 那么呼气的调整次数为: (10000us - 1000us) / 4us = 2250 次 那么呼气的周期为: 2250 * 1ms = 2250ms = 2.25s //采用定时器 TIM2 的 PWM 功能来实现, PWM 脉宽调整的控制周期定为 1ms void LED_Breathing(void) //定时器 TIM2 的 PWM 模式输出 { #define CT 1 //PWM 脉宽调整控制周期(1ms) #define Max 10000 //脉宽最大值限定(10000us) ,最大为 PWM 周期 #define Min 1000 //脉宽最小值限定( 1000us) ,最小为 0 #define Acc 6 //吸气的脉宽调整率为 6us #define Dec 4 //呼气的脉宽调整率为 4us static s32 count = 0; //1ms 时基计数 static s16 t = 1000; //脉冲宽度初始值为 1000us static flag = 1; //初始化切换标志为吸气状态 if((GetTickCount() - count) >= CT) //判断脉宽调整的控制周期是否到? { count = GetTickCount(); //返回 1ms 时基计数值 TIM2->CCR3H = (u8)(t >> 8); //改变 PWM 输出比较寄存器的值(高 8 位) TIM2->CCR3L = (u8)(t); //改变 PWM 输出比较寄存器的值(低 8 位) if(flag) //吸气与呼气的状态切换标志 { t += Acc; //吸气状态,脉宽加大,由暗变亮 //大于最大值时定为最大值,此时到最亮,下一状态为由亮变暗 if(t > Max){flag = 0; t = Max;} } else { t -= Dec; //呼气状态,脉宽减小,由亮变暗 //小于最小值时定为最小值,此时到最暗,下一状态为由暗变亮 if(t < Min){flag = 1; t = Min;} } } } 2015-6-5 zhouwude