STM8S003F3通过PWM波实现三基色呼吸灯.docx

上传人:b****2 文档编号:669557 上传时间:2022-10-12 格式:DOCX 页数:15 大小:25.25KB
下载 相关 举报
STM8S003F3通过PWM波实现三基色呼吸灯.docx_第1页
第1页 / 共15页
STM8S003F3通过PWM波实现三基色呼吸灯.docx_第2页
第2页 / 共15页
STM8S003F3通过PWM波实现三基色呼吸灯.docx_第3页
第3页 / 共15页
STM8S003F3通过PWM波实现三基色呼吸灯.docx_第4页
第4页 / 共15页
STM8S003F3通过PWM波实现三基色呼吸灯.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

STM8S003F3通过PWM波实现三基色呼吸灯.docx

《STM8S003F3通过PWM波实现三基色呼吸灯.docx》由会员分享,可在线阅读,更多相关《STM8S003F3通过PWM波实现三基色呼吸灯.docx(15页珍藏版)》请在冰豆网上搜索。

STM8S003F3通过PWM波实现三基色呼吸灯.docx

STM8S003F3通过PWM波实现三基色呼吸灯

前段时间使用STM8S003F3实现了一个三基色灯的各种效果,故写一篇文章作为一个记录。

1综述

我们知道,要是的LED灯亮直接通电即可。

而要改变灯的亮度,我们有两种方法:

改变电流和PWM调光。

我们首先想到的就是改变它的驱动电流,因为LED的亮度是几乎和它的电流直接成正比关系。

然而用调正向电流的方法来调节亮度会产生一个问题:

在调亮度的同时也会改变它的光谱和色温,这样就会会产生色偏。

因为目前白光LED都是用蓝光LED加黄色荧光粉而产生,当正向电流减小时,蓝光LED亮度增加而黄色荧光粉的厚度并没有按比例减薄,从而使其光谱的主波长增长。

这个问题对于一般的照明是没有问题的,因为色温的变化量毕竟不是很大。

但是对电源来说当电流过小时会产生闪烁,除非电源的恒流范围很宽,完全可以从0到最大。

这样才没有问题。

简而言之,电流调光有色温变化和电源电流过小产生闪烁的问题。

曾经做过一个项目,用于某设备上需要非常非常平稳的调光,显然电流调光是无法实现。

同时像本文介绍的三基色调光有颜色要求的显然也不行。

因此我们使用PWM调光。

既然PWM调光可以避免上面的两个问题,为什么不直接都用PWM调光呢因为我们毕竟是做产品,要考虑成本问题。

使用PWM调光至少需要一颗能支持PWM的芯片(当然还有外围电路,但是电流调光也是有电路的。

我们也应该知道PWM信号也可以由脉冲发生器提供),另外它需要编写程序。

所以只有在需要的场合才使用PWM调光(使用PWM调光需要注意的问题是频率不能太低或者太高,推荐150-400Hz之间。

)。

PWM的优点如下:

•PWM调光就不会产生色偏,因为它总是工作在0或者最大两种状态。

•PWM的占空比很好控制,而且精度高

•对电源没有影响,因为不会改变电源的工作条件,只是给电源开或者关。

2PWM波调光的原理

脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的的技术,广泛应用在从测量、通信到功率控制与变换及LED照明等许多领域中。

通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。

此外,许多微控制器和DSP已经在芯片上包含了PWM控制器,这使数字控制的实现变得更加容易了。

简言之,PWM是一种对模拟信号电平进行数字编码的方法。

通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。

PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。

电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。

通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。

只要带宽足够,任何模拟值都可以使用PWM进行编码。

占空比(DutyCycleorDutyRatio)首先我们需要了解占空比,占空比的解释可以归纳为如下几种:

•在一串理想的脉冲序列中(如方波),正脉冲的持续时间与脉冲总周期的比值。

例如:

脉冲宽度1卩§信号周期4ys的脉冲序列占空比为。

•在一段连续工作时间内脉冲占用的时间与总时间的比值。

•在周期型的现象中,现象发生的时间与总时间的比。

通俗一点讲就是电路释放能量的有效时间与总释放时间的比。

调光比

然后我们需要了解调光比,调光比则是按下面的方法计算(Foper:

工作频率;

Fpwm:

调光频率;):

调光比率=Foper/Fpwm,(其实也就是调光的最低有效占空比)

比如Foper=100KHZ;Fpwm=200Hz,则调光比为:

100K/200=500;这个指标在很多驱动芯片的规格书里会说明的。

调光调光原理•若一个占空比为10%的PWM输出,即10%的时间通,90%的时间断;•若一个占空比为50%的PWM输出,即50%的时间通,50%的时间断;•若一个占空比为90%的PWM输出,即90%的时间通,10%的时间断;

我们知道,人眼是有视觉暂留的,打个比方,人眼只能识别1us((这个比方没有

任何科学依据,仅仅为了便于理解)内光子的数量从而判断亮暗,如果1us接收

了1000个光子,那么我们就会认为是一个亮度,至于这1000个光子是在1us什么时候收到,是没有任何影响的,也就是说,在的时候收到和的时候收到是没有区别的,我们需要关心的只是数量。

这就是为什么我们进行PWM调光的时候不能太慢(视觉暂留可以分辨)也不能太快(太快就没有区别了,就一直是最亮的)。

这样就好理解了,占空比是10%,就相当于给它加了一个的电压(因为10%通电时间里电流产生的效果和加在周内的时候是一样的)。

所以我们就可以通过占空比来条件亮度。

如果在50ms中,LED在这段时间中得到9V供电。

如果在下一个50ms中将开关断开,灯泡得到的供电将为0V。

如果在1秒钟内将此过程重复10次,灯泡将会点亮并象连接到了一个电池(9V的50%)上一样。

这种情况下,占空比为50%,调制频率为10Hz(T=1/f=1/10=)。

大多数负载(无论是电感性负载还是电容性负载)需要的调制频率高于10Hz。

设想一下如果灯泡先接通5秒再断开5秒,然后再接通、再断开……。

占空比仍然是50%,但灯泡在头5秒钟内将点亮,在下一个5秒钟内将熄灭。

要让灯泡取得电压的供电效果,通断循环周期与负载对开关

状态变化的响应时间相比必须足够短。

要想取得调光灯(但保持点亮)的效果,必

须提高调制频率。

在其他PWM应用场合也有同样的要求。

通常调制频率为1kHz到200kHz之间。

通过上面的介绍,我们就知道了PWM调光的原理,那么我们来看看我们这个项目的原理。

三基色呼吸灯原理

需求说明:

我们需要设置一个灯,它具有常亮、长暗、快闪、慢闪、呼吸5钟效果,并且要求这几种状态是可以变化的。

灯的颜色可以变化。

需求分析:

灯的颜色可以变化——确定使用三基色灯。

状态可以切换,我们使用串口调节灯的状态和灯的颜色(通过串口给单片机发送数据,然后将参数传给灯控制函数)。

我们使用PWM调节灯的亮度,通过改变捕获/比较寄存器的值来改变占空比从而改变亮度。

数学建模:

三个灯和一个灯的控制是一样的,由于我们使用的是PWM波调光所以灯只有两种状态:

断和通。

我们分析5种状态可以抽象成数学模型:

暗、上升、亮、下降4钟状态(长暗就是一直暗,常亮就是一直亮,快闪就是100%占空比

而且频率比较快,慢闪就是100%占空比而且频率比较慢、呼吸就是占空比最低为10%然后以10%逐渐上升)。

然后我们确定需要输入的变量:

Value_LED_Red

(红色灯的亮度)、Value_LED_Green(绿色灯的亮度)、Value_LED_Blue(蓝灯的亮度)、Value_ChangeOnce(上升或下降的速度)、HoldTime_Min(在低电平状态的持续时间)、HoldTime_Max(在高电平状态的持续时间)。

3实现过程

下面是TSSOP20封装的管脚图。

首先,我们要确定硬件管脚,但是事实上,因为我用的最多的就是TIM2和TIM4,因此我选用的TIM2_1(PC5,Red)、TIM2_2(PD3,Green)、TIM2_3(PD2,

Blue),但是发现除了绿色以外都无法用PWM波控制,但是能用10控制亮暗,后来查资料发现TIM2_1和TIM2_3早使用的时候必须给存储器地址分布重映射,也就是我们需要使用管脚的复用功能!

我们通过看《数据手册》发现,使用TIM2只有一个管脚是复用功能,因此选择TIM2。

但是我因为电路限制,所以还是用的上面所说的管脚(注意,TIM2_3有复用和不复用两种,我用的是复用)这也没有什么影响,我们可以学习一下管脚的复用功能。

使用复用功能

我们首先看《数据手册》中关于管脚的描述(第一行是TSSOP20封装的管脚编

号,第二行是UFQFPN20封装的管脚b)

从上面的图中我们可以看到,需要使用15、19管脚复用功能就需要设置AFR0

和AFR1使用复用功能就是设置AFR(Alternatefunctionremappingbits,候补

功能映射位)一一我们继续看芯片资料

其中OPT2【选项字节(Optionbyte)编程】和NOPT2需要是相反的(可能是出于

校验考虑),我们从《数据手册》中可以知道:

应用程序可直接向目标地址进行

写操作。

所以我们直接对这两个地址进行写操作,那么数值是多少呢我们继续看

《数据手册》,如下图所示

从上图中我们可以看到,我们将AFR1设置为1,将AFR0设置成1。

代码如下:

[cpp]

1.

2.*Function:

FLASH」nit

3.*Calls:

void

4.*CalledBy:

5.*lnput:

void

6.*OUTPUT:

void

7.*Return:

void

8.*DESCRIPTION:

1.设置管脚复用功能(AFR0要设置为1AFR1要设置为1)

9.每一次只能操作一个字节

10.*Others:

nothing

AA***************************************************************/

13.volatileunsignedcharflash_NOPT2@0x4804;

14.#defineFLASH_EOP0X04改参数,启用复用功能

15.和NOPT2要相反

AQ****************************/

依据计数器的计数方向)以确定是否符合TIM1_CCR蒋TIM1_CNT或者

TIM1_CNTCTIM1_CCRi(我们在TIM1_CR1中设置为向上计数、边沿对齐模式)。

b.根据TIM1_CR1寄存器中CMS位域的状态,定时器能够产生边沿对齐的PWM信号或中央对齐的PWM信号。

我们查看《数据手册》发现(可以参见向上计数模式):

我们为了调光的均匀,将使得TIM2_ARR=255,根据上图,我们可以知道,最亮为255,最暗为就是PWM波的频率(因为TIM1和TIMX的PWM功能是相同资料互用的,因此上图为TIM1的资料)。

初始化PWM波的亮度

根据上面的内容我们知道占空比(也就是亮度)是TIM2_CCR决定的,我们初

始化为零:

TIM2->CCR1H=0;TIM2->CCR1L=0;

计数器使能、捕获比较寄存器使能

关于这两个使能我们可以自己查询《数据手册》,需要提一点的是TIMx_CCER1控制比较/捕获寄存器1和比较/捕获寄存器2。

TIMx_CCER2控制比较/捕获寄存器3。

产生PWM波的初始化程序

具体代码如下:

[cpp]

1/*************************************************

2.*Function:

TIM2_InitPwmCtrl

3.*Calls:

void

4.*CalledBy:

5.*lnput:

void

6.*OUTPUT:

void

7.*Return:

void

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

23.

24.

25.

26.

27.

28.

29.

30.

31.

32.

33.

34.

35.

36

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1