利用定时器实现PWM波对Zigbee上LED控制

**PWM波是啥?**

PWM就是脉冲宽度调制,也就是占空比可变的脉冲波形,即输出脉冲周期在信号周期内稳定占一定比重的输出脉冲,其中有个概念,称为占空比,就是PWM波在一定信号周期能脉冲周期所占时长的量,例如一秒的信号周期内,某引脚有0.5秒输出高电平脉冲周期,则占空比为0.5。

在对PWM波有了基础的了解后,我们明白了其实就是通过在一定时间内间断且规律性给脉冲时间,完成电流/电压大小的控制(有点类似我们在生活中踩自行车,我们可以持续不断的踩脚踏板,稳定的达到我们输出力大小所能达到的速度,也可以踩半圈,另外半圈不踩,此时速度肯定会因为我们做工的减少而降低)

**下面开始代码讲解**

#include <ioCC2530.h>
#include <string.h>


#define uint unsigned int
#define uchar unsigned char


//定义控制LED灯的端口
#define LED1 P1_0	//定义LED1为P10口控制


void InitLed(void)
{
     P1DIR |= 0x01;           //P1.0定义为输出
     LED1 = 1;                //使LED1灯上电默认为熄灭     
}
void InitT1()
{
    CLKCONCMD &= ~0x40;      //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40); //等待晶振稳定为32M
    CLKCONCMD &= ~0x07;      //设置系统主时钟频率为32MHZ   
    CLKCONCMD |= 0x38;       //设置定时器所分频率为250KHZ


    PERCFG |= 0x40;          //选择定时器1映射的IO口位置
    						 //此处我们选择备用位置2,它映射的IO口就是我们想控制的灯P1_0 
    P2SEL &= ~0x10;          //设置端口外设功能的优先级,此时设定定时器1优先
    P2DIR |= 0xC0;           //当PERCFG分配给一些外设到相同引脚的时候,此时设定谁的优先级高,此处设定第1优先级:定时器1通道2-3


    P1DIR |= 0x01;           //设置P1_0为输出    
    P1SEL |= 0x01;           //此时将P1_0配置为外设功能,即响应定时器1
     
    T1CC2H = 0x00;           //T1CC2H为T1CC0的高位,T1CC2L为T1CC0的低位
    T1CC2L = 0x00;           //修改T1CC2L可调整占空比,此处的设置决定比较时的值
    T1CC0H = 0x00;           //同理
    T1CC0L = 0xff; 			//设定整个信号周期为1ms的周期时钟,频率为976.516HZ
    T1CCTL2 = 0x1c;          //设置模式,选择通道2为比较模式,并设定比较时的输出规定
    T1CTL = 0x02;            //设定定时器频率250KHz 1分频,设定运行模式为模模式,即从0x0000到T1CC0反复计数
}
void Delay_us(uint value)//延时函数,便于观察现象
{
  while(value--)
  {
  asm("NOP"); //一个指令周期占用一个时钟周期
  asm("NOP");
  asm("NOP");
  }
}
void main(void)
{
    InitLed();                //调用初始化函数
    InitT1();                //定时器初始化及pwm配置
    uint a = 0x00;
    uint b = 0x00;
    while(1)
    {
      a++;//改变通道2设置的定时值
      Delay_us(10000);
      T1CC2H = b;
      T1CC2L = a;
      if(a == 0xff)
      {
              while(1)
              {
                      a--;//改变通道2设置的定时值
                      Delay_us(10000);
                      T1CC2H = b;
                      T1CC2L = a;
                      if(a == 0)
                              break;
              }
      }
    }
}



**Tips**

1.需要知道外设功能映射的关系,比如在本案例中,定时器1选择了备用位置2,它映射的位置就是P1_0。

2.需要知晓外设功能的选择以及优先级的设置细节,避免设置错外设功能,或者因为优先级问题观察不到现象。

3.最重要的部分是看懂这图,哈哈哈

其中选择比较模式比较好理解,但是比较模式输出的选择这段文字有点难懂,比如我们设置的CMP为011(即在向上比较设置输出,在0清除,否则在比较设置输出,在0清楚),我也没看懂这段文字,但是我在实际测试后,发现我设置的T1CC2L从0x00到0xFe取值,数值越大则亮度越低,应是指变化的T1CC0的值和T1CC2的设定值进行比较如果大于则输出1的脉冲,此处的向上应该是翻译的问题,找到原文手册对应的位置,内容为:(Set output on compare-up, clear on compare down in up-down mode. Otherwise set output on compare, clear on 0.)

全部评论

相关推荐

立讯精密 项目管理 8k 本科其他
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-25 15:05
歌尔科技有限公司 结构设计 16500×14 硕士985
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务