利用定时器实现PWM波对Zigbee上LED亮度进行强弱调整

Catherine ·
更新时间:2024-09-21
· 528 次阅读

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

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

下面开始代码讲解

#include #include #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.最重要的部分是看懂这图,哈哈哈
原创文章 5获赞 5访问量 201 关注 私信 展开阅读全文
作者:橙木



pwm zigbee 定时器

需要 登录 后方可回复, 如果你还没有账号请 注册新账号