STM32定时器输出PWM
我们设置ARR值,就是设置CNT的上限,设置CCRX的值就是设置了一个临界点,CNT是一直随时间变化而变化的,当CNT>CCRX的时候输出 高/低电平 当CNT<CCRX的时候输出相反的电平,当CNT达到上限时,下一刻就变成0了。又开始CNT小于或者大于两种状态。
CNT从0到ARR是一个周期
CNT<CCRX输出高/低
CNT>CCRX输出低/高
只要TIM不关闭,CNT就一直循环上面两个状态。这样就形成了PWM
PWM周期:ARR决定
PWM占空比:CCRX决定
STM32定时器TIM3使用PWM模式
代码中相关寄存器和一些时钟的配置:
1:打开TIM3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
2:因为想使用PB5作为输出脚所以打开复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
3:设置TIM3 CH2的部分映射
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
AFIO->MAPR&=0XFFFFF3FF;
AFIO->MAPR|=1<<11;PA7-->>PB5
4:使能GPIOB,设置GPIO_PB5为复用推挽输出设置GPIO的速率为最大50MHZ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_INIT;
GPIO_INIT.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_INIT.GPIO_Pin=GPIO_Pin_5;
GPIO_INIT.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_INIT);
5:设定计数器自动重装值,预分频器值,设置TIM CH2为PWM模式,预装载使能,输出使能,计数使能
TIM3->ARR=25; //设定计数器自动重装值
TIM3->PSC=72; //预分频器不分频
TIM3->CCMR1|=7<<12; //CH2 PWM2 模式
TIM3->CCMR1|=1<<11; //CH2 预装载使能
TIM3->CCER|=1<<4; //OC2 输出使能
TIM3->CR1=0x0080; //ARPE 使能
TIM3->CR1|=0x01; //使能定时器 3
6:我们可以通过改变CCR2的值设置PWM占空比
TIM3->CCR2=8;
7:可以通过改变ARR值改变PWM周期
TIM3->ARR=25; //设定计数器自动重装值
总结:这个可以把之前的用延迟做的PWM改成用通用定时器做的。因为定时器做的PWM不占用主循环,硬件自动输出。我们只要改变寄存器的值就可以控制PWM。软件延迟做的话,需要占用主循环,不能做别的事情。交流学习的可以+2197358160一起学习。