概要
脉冲宽度调制(Pulse Width Modulation,PWM),可实现对脉冲宽度进行控制。
在MCU中,使用定时器实现的。TIM2,3,4,5,9~14都支持PWM输出。定时器框图的输出部分。
原理如下图所示,计数值从0到CCRx,输出低电平,计数值从CCRx到ARR,输出高电平。
时序图如下
操作步骤
- 使能定时器时钟,配置对应的输出引脚,复用功能
- 设置自动重载值
- 设置定时器的PWM模式(共两个)
- 使能定时器输出通道,使能定时器
- 设置CCR,调整占空比
实验要求
使用定时器14的PWM功能,输出占空比可变的PWM波,用来驱动LED灯,从而达到LED【PF9]亮度由暗变亮,又从亮变暗,如此循环。
void TIM14_PWM_Init(u32 arr, u32 psc)
{
RCC->APB1ENR |= 1<<8;
RCC->AHB1ENR |= 1<<5;
GPIO_Set(GPIOF, PIN9, GPIO_MODE_AF, GPIO_OTYPE_PP, GPIO_SPEED_100M, GPIO_PUPD_PU);
GPIO_AF_Set(GPIOF, 9, 9);
TIM14->ARR = arr;
TIM14->PSC = psc;
TIM14->CCMR1 |= 6<<4;
TIM14->CCMR1 |= 1<<3;
TIM14->CCER |= 1<<0;
TIM14->CCER |= 1<<1;
TIM14->CR1 |= 1<<7;
TIM14->CR1 |= 1<<0;
}
int main(void)
{
u16 pwm_val = 0;
u8 dir = 1;
sys_init();
while(1)
{
delay_ms(10);
if(dir) pwm_val++;
else pwm_val--;
if(pwm_val>300) dir = 0;
if(pwm_val==0) dir = 1;
LED0_PWM_VAL = pwm_val;
}
}
static void sys_init(void)
{
Stm32_Clock_Init(336, 8, 2, 7);
delay_init(168);
TIM14_PWM_Init(500-1, 84-1);
}
参考
STM32F3与 F4 系列 Cortex M4 内核编程手册
STM32F4xxx中文参考手册
STM32F4xxx英文参考手册
STM32F4 开发指南(寄存器版)