【微处理器系统原理与应用设计第十二讲】通用定时器设计二之PWM波实现呼吸灯的功能
一、基础知识
1、寄存器的配置
(1)GPIOX_AFRL:GPIO复用功能低位寄存器
GPIOX_AFRH:GPIO复用功能高位寄存器
(2)配置PA5 GPIOA->MODER(端口模式寄存器),10为复用功能,是指除了普通输入/出,还有其他功能TIM等
(3)GPIO->OTYPER:0为推挽,1为开漏输出,推挽输出在示波器上看主要为方波形,而开漏在示波器显示为锯齿波。但要注意使PUPDR设置为上拉电阻状态。
(4)GPIOX_OSPEED(端口输出速度寄存器):低速 2MHz,中速 10~25MHz 高速 20~50MHz,具体的大小与对应连接的电压和电容相关。
(5)设置AFRL寄存器,AF0~15指GPIOX的16种模式(一般AF0~7可改,4~6仅限GPIOA,8~15保留),AFR[0]指GPIOX_AFRL寄存器,管理0~7个管脚;AFR[1]指GPIOX_AFRH寄存器,管理8~15个管脚。
(6)TIM_CCER:捕获使能寄存器,使能输入捕获必须设置CC1E = 1
(7)TIM_CCR1:捕获/比较寄存器1,用来存储捕获发生时TIMX_CNT值,通过了一次上升沿捕获与下降沿捕获差值可算出高电平脉冲宽度。
2、占空比的计算
占空比(Duty Cycle)是脉冲信号中高电平持续时间与整个周期时间的比率。它通常用于描述脉冲宽度调制(PWM)信号,其中信号在一定频率下在高电平和低电平之间切换。
设置寄存器ARR的值确定周期,设置CCRx值设置占空比,CNT小于CCR时输出为高,CNT大于CCR输出为低,占空比 = CCR/ARR = 高电平时间/周期
3、实现逻辑原理
(1)PWM波利用微处理器的数字输出来控制模拟电路
(2)STM32没有专门的PWM引脚,所以采用IO口的复用模式
(3)TIM1是STM32高级定时器,它的每个通道都有对应的互补通道来互补输出PWM
(4)STM32的定时器除了TIM6和TIM7,其他定时器都可用来产生PWM输出。
(5)面积等效原理:只要正弦波与t坐标轴围起来阴影面积相同,不管哪种电压波形效果大概相同
二、功能需求
开发呼吸灯功能,即LED灯一亮一灭,亮灭交替,周而复始。亮灭时长约为1s。
三、设计思路
将PA5配置为TIM2的CH1输出。采用定时器TIM2产生PWM波形,周期为2s且占空比为50%,即1s时长的低电平、1s时长的高电平。
四、软件流程图
五、程序设计
1、PWM输出端口初始化
采用PwmOutInit函数实现PA5复用为TIM2的CH1输出。代码如下:
void PwmOutInit(void)
{
RCC->AHB1ENR|=1<<0; //使能GPIOA
GPIOA->MODER=(GPIOA->MODER&~(0x3<<10))|(0x2<<10); //设置PA5为AF复用、推挽输出、无上拉、无下拉、中速
GPIOA->OTYPER&=~(1<<5);
GPIOA->PUPDR&=~(0x3<<10);
GPIOA->OSPEEDR=(GPIOA->OSPEEDR&~(0x3<<10))|(1<<10);
GPIOA->AFR[0]=(GPIOA->AFR[0]&~(0xF<<20))|(1<<20); //设置AFRL寄存器,将PA5复用为TIM2的CH1输出
}
2、定时器初始化函数
采用TimerInit函数实现定时器2的参数配置。
时钟源TIMCLK的频率为16MHz,设计预分频系数N=2000,计数器分频系数M=16000,那么共320万个分频,定时时长为M*N/TIMCLK = 2s。因此预分频寄存器PSC的值为N-1 = 1999,自动重载寄存器ARR的值为M-1 = 15999.比较寄存器为计数器自动重载值的一半,即8000.具体代码如下:
void TimerInit(void)
{
RCC->APB1ENR |=1<<0; //使能TIM2
TIM2->CR1 =1<<7; //配置为自重载预载使能、边沿对齐、向上计数工作模式
TIM2->PSC =1999; //16MHz/2000 = 8KHz
TIM2->ARR =15999; //8KHz/16000=0.5Hz,PWM周期为2s
TIM2-CCMR1 = (TIM2->CCMR1&~(0x00FF))|0x68; //配置CH1为PWM1输出模式
TIM2->CCER |=1; //使能比较通道1作为输出
TIM2->CCR1 8000; //占空比50%
TIM->CR1 |=1; //开启TIM2
}