第一个例子:用定时器1产生PWM来控制LED亮度
我们在《[ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)》中讲过定时器1 是一个支持典型的定时/计数功能的独立16 位定时器,支持输入捕获,输出比较和PWM等功能。该工程就是利用定时计数器1产生1毫秒PWM,20%的占空比,用PWM来调节LED的亮度,如果led的亮度比较暗可调整pwm频率和占空比来控制Led灯的亮度。
- /****************************************************************************
- * 文 件 名: main.c
- * 描 述: cc2530 定时计数器1产生1毫秒PWM,20%的占空比,led的亮度比较暗
- * 可调整pwm频率和占空比来控制Led灯的亮度
- ****************************************************************************/
- #include <ioCC2530.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- #define LED1 P1_0 // P1.0口控制LED1
- /****************************************************************************
- * 名 称: InitLed()
- * 功 能: 设置LED灯相应的IO口
- * 入口参数: 无
- * 出口参数: 无
- ****************************************************************************/
- void InitLed(void)
- {
- P1DIR |= 0x01; //P1.0定义为输出
- LED1 = 1; //使LED1灯上电默认为熄灭
- }
- /****************************************************************************
- * 名 称: InitT1()
- * 功 能: 定时器初始化,TICKSPD 是16 MHz系统不配置时默认是2分频,即16MHz
- * 入口参数: 无
- * 出口参数: 无
- ****************************************************************************/
- void InitT1()
- {
- CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
- while(CLKCONSTA & 0x40); //等待晶振稳定为32M
- CLKCONCMD &= ~0x07; //设置系统主时钟频率为32MHZ
- CLKCONCMD |= 0x38; //时钟速度32 MHz 定时器标记输出设置[5:3]250kHz
- PERCFG |= 0x40; //定时器1 的IO位置 1:备用位置2
- P2SEL &= ~0x10; //定时器1优先
- P2DIR |= 0xC0; //第1优先级:定时器1通道2-3
- P1DIR |= 0xff; //端口1为输出
- P1SEL |= 0x01; //timer1 通道2映射口P1_0
-
- T1CC2H = 0x00; //20%占空比为200us
- T1CC2L = 0x32; //修改T1CC2L可调整led的亮度
- T1CC0H = 0x00; //1ms的周期时钟,频率为976.516HZ
- T1CC0L = 0xff;
- T1CCTL2 = 0x1c; // 模式选择 通道2比较模式
- T1CTL = 0x02; //250KHz 1分频
- }
- /****************************************************************************
- * 程序入口函数
- ****************************************************************************/
- void main(void)
- {
- InitLed(); //调用初始化函数
- InitT1(); //定时器初始化及pwm配置
- while(1)
- {
- }
- }
|