本章介绍如何使用定时器来产生PWM输出。在本章中,我们将使用定时器来产生PWM控制LED的亮度。
1、PWM简介
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字数出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制,PWM原理如图14.1.1所示:
图14.1.1就是ige简单的PWM原理示意图。图中,我们假定定时器工作在向上计数PWM模式,且当CNT<CCRx时,输出0,当CNT>=CCRx时输出1,那么就可以得到如上的PWM示意图:当CNT值小于CCRx的时候,IO输出低电平(0),当CNT值大于等于CCRx的时候,IO输出高电平(1),当CNT达到ARR值的时候,重新归零,然后重新向上计数,依次循环。改变CCRx的值,就可以改变PWM输出的占空比,改变ARR的值,就可以改变PWM输出的频率,这就是PWM输出的原理。
PWM实际上跟定时器的功能一样,在.cysch文件中进行设置:
2、硬件设计
本实验用到的硬件资源有:
(1)指示灯
(2)定时器
定时器可以通过P5[4]输出PWM,而LED直接连接在P5[4]上。
3、软件设计
在Timer.c文件中:
void LedPwmFunction(void)
{
static uint16_t ledpwmval = 0;
static uint8_t dir = 1;
if(dir)
{
ledpwmval++;
}else
{
ledpwmval--;
}
if(ledpwmval > 1000)
{
dir = 0;
}
if(ledpwmval == 0)
{
dir = 1;
}
TCPWM_1_WriteCompare(ledpwmval);
CyDelay(1);
}
//初始化
void LedPwmInit(void)
{
TCPWM_1_Start();
}
在main.c文件中:
void InitFuction(void)
{
Debug_UART_Start(); //串口初始化
Key_Init();
//TimerInit();
LedPwmInit();
}
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
InitFuction();
printf("hello world ");
for(;;)
{
/* Place your application code here. */
//KeyFunction();
LedPwmFunction();
}
}
将LedPwmFunction() 函数放入for循环中欧给你,将ledpwmval 这个值设置为PWM比较值,也就是通过ledpwmval来控制PWM的占空比,然后控制ledpwmval的值从0变到1000,然后又从1000变到0,如此循环,因此LED的亮度也会跟着信号的占空比变化从暗变道亮,然后从亮变得暗。