欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

cc2530之定时器1的输出比较模式(PWM实验)

程序员文章站 2022-06-09 19:29:26
...

PWM实验是通过调节高低电平所占的时间比,控制灯的亮暗程度

1. 查看灯的原理图
cc2530之定时器1的输出比较模式(PWM实验)
之前在第一篇博客中有写道led的配置和相关知识,此处就不再重复了.这里我们使用D3LED来进行实验,可以从原理图中看出D3LED是由P1_0口控制的

P1SEL |= 0x01;	//设置P1_0口为外设口
P1DIR |= 0x01;	//设置P1_0口为输出端口

2. 查看外设io图
cc2530之定时器1的输出比较模式(PWM实验)
由上图中可以看出定时器1要选择备用位置2以及通道2
cc2530之定时器1的输出比较模式(PWM实验)
cc2530之定时器1的输出比较模式(PWM实验)
cc2530之定时器1的输出比较模式(PWM实验)

PERCFG |= 0x40;	//选择定时器备用位置2
T1CCTL2 |= 0x1c;	//选择比较模式,以及选择比较模式4
P2SEL &= ~0x10;   //定时器1优先

3.查看输出比较模式
cc2530之定时器1的输出比较模式(PWM实验)
*模式下的比较模式: 当计数器的值等于比较寄存器中的值时,输出高电平,当计数器的值等于0的时候清除,也就是输出低电平
cc2530之定时器1的输出比较模式(PWM实验)
cc2530之定时器1的输出比较模式(PWM实验)
cc2530之定时器1的输出比较模式(PWM实验)
我们选择*模式,而且选择128分频

T1CTL |= 0x0d; 	//选择*模式,128分频

cc2530之定时器1的输出比较模式(PWM实验)

T1CC0H = 0x40;	//先初始化这两个比较寄存器为4040,即16448
T1CC0L = 0x40;

通过修改T1CC0寄存器的值就可以修改LED的亮度

T1CC0H = 0xE6;	
T1CC0L = 0x66;		//正占空比10%
T1CC0H = 0xB3;	
T1CC0L = 0x33;		//正占空比30%
T1CC0H = 0x80;	
T1CC0L = 0x00;		//正占空比50%
T1CC0H = 0x4C;	
T1CC0L = 0xCD;		//正占空比70%
T1CC0H = 0x19;	
T1CC0L = 0x9A;		//正占空比90%

总代码

#include<ioCC2530.h>

typedef unsigned int  uint;

void delay(int ms)
{
  int i,j;
  for(i=0; i<ms; i++)
    for(j=0; j<120; j++);
}

void InitLED()
{
  P1SEL |= 0x01;	//设置P1_0口为外设口
  P1DIR |= 0x01;        //设置P1_0口为输出端口 
}

void InitTimer()
{
  P2SEL &= ~0x10;       //定时器1优先
  PERCFG |= 0x40;	//选择定时器备用位置2
  T1CCTL2 |= 0x1c;	//选择比较模式,以及选择比较模式4
  
  T1CTL |= 0x0d; 	//选择*模式,128分频
  
  T1CC0H = 0x40;	//先初始化这两个比较寄存器为4040,即16448
  T1CC0L = 0x40;
}

void main()
{
  int i;
  uint rateH[5] = {0xE6, 0xB3, 0x80, 0x4C, 0x19}; //10% 30% 50% 70% 90%
  uint rateL[5] = {0x66, 0x33, 0x00, 0xCD, 0x9A};
  
  InitLED();
  InitTimer();
    //逐渐变亮 逐渐变暗 逐渐变亮 逐渐变暗 
  while(1)
  {
    for(i=0; i<5; i++)
    {
      T1CC0H = rateH[i];
      T1CC0L = rateL[i];
      delay(1000);
    }
  }
}
相关标签: cc2530