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
关注
私信
展开阅读全文
作者:橙木