利用定时器实现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.)