ZigBee基础实验(十一)--PWM来控制LED亮度

发布者:VelvetSoul最新更新时间:2019-04-09 来源: eefocus关键字:ZigBee  PWM  控制LED亮度 手机看文章 扫描二维码
随时随地手机看文章

引言:PWM对于很多软件工程师可能又熟悉又陌生,以PWM调节LED亮度为例,其本质是在每个周期都偷工减料一些,整体表现出LED欠压亮度不同的效果。像大家看到的七色彩灯其原理也类似,只是用3路PWM分别控制红、绿、蓝三种颜色的灯输出亮度,再结合混色原理表现出丰富多彩的炫光效果~

 

写在前面:前十几篇介绍了CC2530的一些外设的基本用法,接下来几篇拿几个例子回顾并加深一下之前的知识点,上面引言是普及、下面高能预警!

 

第一个例子:用定时器1产生PWM来控制LED亮度

  我们在《[ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)》中讲过定时器1 是一个支持典型的定时/计数功能的独立16 位定时器,支持输入捕获,输出比较和PWM等功能。该工程就是利用定时计数器1产生1毫秒PWM,20%的占空比,用PWM来调节LED的亮度,如果led的亮度比较暗可调整pwm频率和占空比来控制Led灯的亮度。

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

 2 * 文 件 名: main.c

 3 * 描    述: cc2530 定时计数器1产生1毫秒PWM,20%的占空比,led的亮度比较暗

 4 *           可调整pwm频率和占空比来控制Led灯的亮度

 5 ****************************************************************************/

 6 #include

 7 

 8 typedef unsigned char uchar;

 9 typedef unsigned int  uint;

10 

11 #define LED1 P1_0       // P1.0口控制LED1

12 

13 

14 /****************************************************************************

15 * 名    称: InitLed()

16 * 功    能: 设置LED灯相应的IO口

17 * 入口参数: 无

18 * 出口参数: 无

19 ****************************************************************************/

20 void InitLed(void)

21 {

22     P1DIR |= 0x01;           //P1.0定义为输出

23     LED1 = 1;                //使LED1灯上电默认为熄灭     

24 }

25 

26 /****************************************************************************

27 * 名    称: InitT1()

28 * 功    能: 定时器初始化,TICKSPD 是16 MHz系统不配置时默认是2分频,即16MHz

29 * 入口参数: 无

30 * 出口参数: 无

31 ****************************************************************************/

32 void InitT1()

33 {

34     CLKCONCMD &= ~0x40;      //设置系统时钟源为32MHZ晶振

35     while(CLKCONSTA & 0x40); //等待晶振稳定为32M

36     CLKCONCMD &= ~0x07;      //设置系统主时钟频率为32MHZ   

37     CLKCONCMD |= 0x38;       //时钟速度32 MHz 定时器标记输出设置[5:3]250kHz

38 

39     PERCFG |= 0x40;          //定时器1 的IO位置   1:备用位置2 

40     P2SEL &= ~0x10;          //定时器1优先

41     P2DIR |= 0xC0;           //第1优先级:定时器1通道2-3

42 

43     P1DIR |= 0xff;           //端口1为输出    

44     P1SEL |= 0x01;           //timer1 通道2映射口P1_0

45     

46     T1CC2H = 0x00;           //20%占空比为200us

47     T1CC2L = 0x32;           //修改T1CC2L可调整led的亮度

48     T1CC0H = 0x00;           //1ms的周期时钟,频率为976.516HZ

49     T1CC0L = 0xff; 

50     T1CCTL2 = 0x1c;          // 模式选择 通道2比较模式

51     T1CTL = 0x02;            //250KHz 1分频

52 }

53 

54 /****************************************************************************

55 * 程序入口函数

56 ****************************************************************************/

57 void main(void)

58 {

59     InitLed();                 //调用初始化函数

60     InitT1();                //定时器初始化及pwm配置

61     while(1)

62     {

63     }

64 }

可见代码中的核心在于39~51行:

39     PERCFG |= 0x40;          //定时器1 的IO位置   1:备用位置2 
40     P2SEL &= ~0x10;          //定时器1优先
41     P2DIR |= 0xC0;           //第1优先级:定时器1通道2-3
42 
43     P1DIR |= 0xff;           //端口1为输出    
44     P1SEL |= 0x01;           //timer1 通道2映射口P1_0
45     
46     T1CC2H = 0x00;           //20%占空比为200us
47     T1CC2L = 0x32;           //修改T1CC2L可调整led的亮度
48     T1CC0H = 0x00;           //1ms的周期时钟,频率为976.516HZ
49     T1CC0L = 0xff; 
50     T1CCTL2 = 0x1c;          // 模式选择 通道2比较模式
51     T1CTL = 0x02;            //250KHz 1分频

 

1.1、第一步:调用外设控制寄存器设置外设所映射IO引脚的方案 

其中第39行令PERCFG |= 0x40,PERCFG是外设控制寄存器,如下图该寄存器用来设置一些外设的I/O的位置。这里操作的是第六位T1CFG,选择定时器1的IO为备用位置2。

这里所说的IO映射位置方案1和方案2需要在表《Peripheral I/O Pin Mapping》中查看,在第七节《[ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)》中我已经用UART的例子详细介绍如何看这个表:

以USART0为例,第一种映射关系是RT-P05\CT-P04\TX-P03\RX-P02;另一种映射关系是TX-P15\RX-P14\RT-P13\CT-P12。

那么在使用过程中,一种模式对应两种映射肯定会出现矛盾!

那么外设控制寄存器就是用来设置选择哪种方案的!这里设置为0x40即选用定时器1的引脚映射方案2:P07对应通道3、P06-通道4、P12-通道0、P11-通道1、P10-通道2~

 

1.2、第二步:调用Port2功能选择和Port1设备优先级控制寄存器,设置timer1占Port1引脚的外设优先级为高

在第七节《[ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)》中同样有介绍,上面外设控制寄存器仅仅解决了同一个外设多个IO映射方案的冲突问题,但是并没有解决不同外设IO映射冲突问题。P2SEL寄存器就是处理这个问题!

3、4、5、6位用于设置同一个IO上两个设备当PERCFG赋值时的优先级,因此这里设置P2SEL &= ~0x10,将定时器设置为最优先。

 

1.3、第三步:调用Port2方向选择和Port0设备优先级控制寄存器,设置timer1占Port0引脚的外设优先级为高

在第七节《[ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)》中同样有介绍,由于timer1引脚映射占了Port0和Port1,因此上面P2SEL寄存器用来设置port1部分timer所占引脚的优先级,这里调用P2DIR设置其占Port0引脚的优先级,代码中P2DIR |= 0xC0,即设置7~6位为11使定时器1通道2-3最优先。

 


规律:不难发现这里timer的用法和第七篇中介绍的uart初始化很类似,前三行做端口映射、优先级选定,一般外设会涉及两个端口,因此需要用P0SEL和P2DIR分别设置。接下来就是针对具体外设的参数设置了!


 

1.4、第四步:选择PWM通道,并使能

在1.1中介绍定时器1的引脚映射方案选用是备用2方案:P07对应通道3、P06-通道4、P12-通道0、P11-通道1、P10-通道2~

在1.3中设置通道2、3优先级最高

从1.1~1.3为timer1的PWM的的初始化,也设置了通道的优先级,如果想使能通道还需要进一步设置:

43     P1DIR |= 0xff;           //端口1为输出    
44     P1SEL |= 0x01;           //timer1 通道2映射口P1_0

其中第43行设置端口1为全部输出,第44行比较关键,用来将IO引脚设置为普通IO引脚还是设置成IO外设引脚,这里将P1_0设置为外设引脚。根据前面的设置,我们知道是将P10设置为了定时器1的通道2输出口。

 

1.5、定时器1通道2输出比较模式选择&设置周期与占空比

关于输出比较模式在《[ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)》里的第9段介绍比较详细:PWM 输出可以通过选择定时器正计数/倒计数模式生成。根据PWM 信号所需的极性选择通道输出比较模式4 或5(由T1CCTLn.CMP 位定义,其中n 是1 或2)。PWM 信号的周期由T1CC0 确定,通道输出的占空比由T1CCn 确定,其中n 是PWM 通道1 或2。某些类型的电机驱动应用程序会需要中心对齐的PWM 模式,一般地这比边沿对齐的PWM 模式产生的噪音更少,因为I/O 引脚传输不集中在同一个时钟边沿上。

46     T1CC2H = 0x00;           //20%占空比为200us
47     T1CC2L = 0x32;           //修改T1CC2L可调整led的亮度
48     T1CC0H = 0x00;           //1ms的周期时钟,频率为976.516HZ
49     T1CC0L = 0xff; 
50     T1CCTL2 = 0x1c;          // 模式选择 通道2比较模式51     T1CTL = 0x02;            //250KHz 1分频

其中第50行用来设置定时器1通道2捕获/比较控制寄存器为0x1C,[5:3]=011则选择了输出比较模式4,其PWM信号周期由T1CC0决定,占空比由T1CCn确定(正计数到计数模式生成PWM比边沿模式生成PWM更适合这里,如果你听不懂这句话请看第5篇)!因此,46~49行就是设置PWM的周期和占空比~

  

 


 

注意:这里0x0032/0x00ff不等于20%,为什么注释中说占空比为20%呢?我们用一个简单的例子解释这个问题的特殊性(绘制定时器counter的值变化线如下):左边的一个设T1CC0=4,T1CC2=2,显然占空比不是2/4,也不是3/9,因为最后一个绿色框内的时期属于下一个周期了,一个完整周期应该为0~4~1,因此占空比为3/8;同理右边的占空比为3/6。这里T1CC2设置为0x0032,则低段有:0~0x0032,0x0032~1,总共(0x0032-0+1)+(0x0032-1+1)=0x0032*2+1=0x0065=101;总周期为0x00FF*2=0x01FE=510,占空比为0x65/0x01FE约等于5


其中最后一行T1CTL = 0x02,用来设置自由运行模式(关于模式也在第七篇介绍),采用1分频,250KHz~

 

总结:这样就能用PWM输出通道2直接关联到P10来控制LED的亮度。


关键字:ZigBee  PWM  控制LED亮度 引用地址:ZigBee基础实验(十一)--PWM来控制LED亮度

上一篇:GPIO模拟IIC过程中对IIC的理解
下一篇:ZigBee串口说明

推荐阅读最新更新时间:2024-03-16 16:27

STM32 HAL+PWM+DMA方式驱动WS2812灯珠波形分析
1. 在DMA传送完PWM波形后不关闭PWM的DMA输出 灯珠显示效果: 灯珠会错乱显示(没有按正常设定的颜色显示) 示波器显示如下: 2. 在DMA传送完PWM波形后,在PWM传输完成后回调函数中关闭PWM的DMA输出 灯珠显示效果: 会按照设定的颜色正常显示,但灯带的起始位置会有绿色的余光(基于自己测试时使用的灯带) 示波器显示如下 3. 在DMA传送完PWM波形后,在DMA中断函数中关闭PWM的DMA输出 灯珠显示效果: 按照设定的颜色模式正常显示 示波器显示效果如下: 分析 方式1在pwm通过DMA的方式传输完成后会保持高电平,且会产生杂波,可能是导致灯珠显示错乱的主要原因. 方式2在DMA传输完成的回调函数关
[单片机]
STM32 HAL+<font color='red'>PWM</font>+DMA方式驱动WS2812灯珠波形分析
51单片机脉冲调制(PWM)控制源程序
要用51产生PWM去控制LED,首先要确定PWM的周期T和占空比D,确定了这些以后,可以用定时器产生一个时间基准T,比如定时器溢出N次的时间是PWM的高电平的时间,则D*T=N*T,类似的可以求出PWM低电平时间需要多少个时间基准N'。 那么就可以编写程序,根据定的时间基准T给定时器赋值初始化,然后开启定时器,定义一个标志位Flag,根据Flag的状态决定输出高平还是低电平,假设 定义Flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次中断就让记录中断次数的变量+1,在中断程序里面判断这个变量的值是否到了 N,如果到了说明高电平的时间够了,那么就改变Flag为0,输出低电平,同时记录中断变量
[单片机]
LED亮度控制方法介绍
引言 为了得到更好的功效和色彩一致性,LED亮度通常通过调节LED驱动器的PWM周期占空比控制。一个PWM周期可以划分成2的“控制位”次方(2CONTROL BITS)个时钟周期。消费类电子应用中,控制位分辨率通常是8位。8位PWM分辨率可对应提供256个不同的亮度电平,相应的PWM周期由256个时钟周期组成。如消费类电子产品中,典型的时钟频率是32kHz,则PWM周期为256/32kHz或8ms。因此,PWM刷新率大约是125Hz,由此得到的PWM分辨率和刷新率足以支持亮度调整,并可消除人眼能够觉察的闪烁。 为LED驱动器提供16位分辨率 对于要求同时达到16位PWM分辨率和2kHz刷新率的应用,设计将面临诸多挑战。16位
[电源管理]
<font color='red'>LED</font><font color='red'>亮度</font><font color='red'>控制</font>方法介绍
Intersil的可扩展PWM控制
2008 年 4 月, Intersil 公司,日前宣布推出产品编号为 ISL8120 的双输出或可变相位 PWM 控制器。 ISL8120 包括宽泛的输入电压 (2.97V to 24V) 、电流分配和可变相位转换等功能。这款 PWM 控制器特有的电流分配技术确保了多种版本的芯片可以被并行应用,以实现一个高性能价格比的双模输出或 n -相 PMW 控制器解决方案,用来满足多种专门设计的需要。 基于 MOSFET 上的选择,每相可输出高达 25A 的电流。每个芯片可以配置成为两个单相输出或者一个双相输出。因为每个 ISL8120 可提供两个单相 25
[电源管理]
STM32 通用定时器的输出PWM功能 学习笔记
首先来说,你要使用PWM模式你得先选择用哪个定时器来输出PWM吧!除了TIM6、TIM7这两个普通的定时器无法输出PWM外,其余的定时器都可以输出PWM,每个通用定时器可以输出4路PWM,高级定时器TIM1、TIM8每个可输出7路PWM。选好定时器及通道后,下一步就是要使能定时器的时钟。先贴代码,再对每条代码做详细分析。 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCI
[单片机]
大联大推出基于ZigBee照明多样化LED调光解决方案
2015年9月8日,致力于亚太地区市场的领先半导体元器件分销商 大联大控股宣布,其旗下世平推出 ZigBee 照明多样化LED调光解决方案,可以实现远程单灯开关、调光、检测等管控功能。在此次推出的方案中,大联大世平为确保高性能和高可靠性,采用了例如ADI、Atmel、CREE、CSR、GainSpan、NXP、ON、TI、Toshiba、Vishay等众多国际大厂的器件。 从现在乃至未来,环保、绿色、节能都将是科技发展的主导方向。将电能直接转化为光的LED技术,电能利用率比荧光灯高,同时也不会对环境产生有害物质,正符合了绿色环保的要求。同时,LED还具有耗电量少、寿命长、色彩丰富、体积小、可控性强等特点,可以广泛
[电源管理]
大联大推出基于<font color='red'>ZigBee</font>照明多样化<font color='red'>LED</font>调光解决方案
STM8S的按键PWM调光灯历程
STM8SPWM应用 前几天有个项目用到PWM,今天整理下,弄个氛围灯;记录下,以后忘记了返回来还能看看。 思路就是在硬件端设置个按键,按下全局变量Key_num的值+1,按键一开始我用轮询法做的,后来觉得轮询法延时可能导致未知的问题,现在用中断法做;根据Key_num的值,用switch语句选择要变换的模样。 上代码: /***************************************************************************** * @function : Tim2_Init * @brief : TIM2初始化函数 CH1用作出LED——G的呼吸变化灯 * @no
[单片机]
SA8282三相PWM发生器的原理与应用
摘要:SA8282是英国MITEL公司推出的三相PWM发生器集成芯片。该芯片采用全数字化操作,工作方式灵活、频率范围宽、精度很高并可与微处理器接口以实现智能化控制。文中介绍了该芯片的内部结构、引脚功能、主要特点和工作原理,给出了典型的应用电路。 关键词:PWM发生器;SA8282;微处理器 1 SA8282的功能特点 PWM控制技术是通过控制电路按一定规律来控制开关管的通断,以得到一组等幅而不等宽的矩形脉冲波形并使其逼近正弦电压波形。其方法有模拟方法和数字方法两种,其中模拟方法的电路比较复杂,且有温漂现象,会影响精度,降低系统的性能。数字方法则是按照不同的数字模型用计算机算出各切换点并将其存入内存,然后通过查表及必要的计算
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved