STM32F103ZET6 PWM输出

1、通用定时器的PWM功能

  STM32F103ZET6有4个通用定时器,分别是TIM2、TIM3、TIM4、TIM5。

  通用定时器由一个可编程预分频器驱动的16位自动装载计数器构成。

  通用定时器的很多功能与基本定时器是一样的,但是每个通用定时器都有4个IO口,可以用来测量输入信号的脉冲长度(输入捕获)或产生输出波形(输出比较和PWM)。

  通用定时器可以用来输出PWM信号,每个通用定时器可以输出4路PWM信号。

2、通用定时器的输入/输出脚

  每个通用定时器都具有4个输入/输出通道,即4个IO口,它们的对应关系如下图:

3、通用定时器的计数方式

   通用定时器的框图如下:

  图中TIMx_CH1、TIMx_CH2、TIMx_CH3、TIMx_CH4就是用来输出PWM的脚位,对应定时器的4个通道。

  通用定时器的功能是在基本定时器功能上的扩展,定时部分跟基本定时器是差不多的,只是基本定时器只能是向上计数,而通用定时器既可以设置成向上计数、也可以设置成向下计数、或是设置成向上/向下计数。

  通用定时器的向上计数模式跟基本定时器是一样的。

  通用定时器的向下计数模式:

  在向下计数模式中,计数器先从TIMx_ARR自动装载寄存器中获取计数初值,然后开始向下计数,当计数到0时产生中断并重新从TIMx_ARR自动装载寄存器中获取初值。

通用定时器的向上/向下计数模式:  

  在向上/向下计数模式中,计数器从0开始计数到TIMx_ARR-1的值后产生中断,然后向下计数到1并产生中断;然后再从0开始重新计数。

  在向上/向下计数模式中,不能对TIMx_CR1寄存器中的DIR位赋值,DIR位由硬件更新,可以通过读取DIR位来确认当前是向上计数还是向下计数。

    在向上/向下计数模式中,如果内部时钟分频因子为1,TIMx_ARR自动装载寄存器的值为0x06,那么定时器的的时序图如下:

  从图中可以看到,计数器向上计数到0x05的时候产生了溢出中断,计数器向下计数到1的时候产生了溢出中断。

  通用定时器通过TIMx_CR1控制寄存器的CMS[1:0]位和DIR位来控制定时器的计数方向。

4、通用定时器PWM输出的工作原理

  通用定时器PWM输出的频率由TIMx_ARR自动重装载寄存器和TIMx_PSC预分频器寄存器确定、占空比由TIMx_CCRx捕获/比较寄存器决定。

  通用定时器PWM的工作模式:

  通用定时器的PWM可以设置为两种模式:PWM模式1和PWM模式2,模式的选择是根据TIMx_CCMRx捕获/比较模式寄存器OCxM[2:0](x范围是1~4,表示4个通道)这三个位的设置决定的。

  这里需要特别注意的是每个定时器的PWM输出通道有4个,但是捕获/比较模式寄存器只有2个:TIMx_CCMR1和TIMx_CCMR2,TIMx_CCMR1寄存器的低16位为有效位,低8位用来配置通道1,高8位用来配置通道2;TIMx_CCMR2寄存器也是低16位为有效位,低8位用来配置通道3,高8位用来配置通道4。也就是说每8个位配置一个通道,这8个位的配置参数是一样的,不一样的只是配置的通道不一样。

  PWM模式1:

  当OCxM[2:0] = 110时,PWM处于模式1下。

  当定时器的计数器的值小于捕获/比较寄存器的值时(TIMx_CNT < TIMx_CCRx),输出通道输出有效电平。

  当定时器的计数器的值大于等于捕获/比较寄存器的值时(TIMx_CNT >= TIMx_CCRx),输出通道输出无效电平。

  PWM模式2:

  当OCxM[2:0] = 111时,PWM处于模式2下。

  当定时器的计数器的值小于捕获/比较寄存器的值时(TIMx_CNT < TIMx_CCRx),输出通道输出无效电平。

  当定时器的计数器的值大于等于捕获/比较寄存器的值时(TIMx_CNT >= TIMx_CCRx),输出通道输出有效电平。

    通过对比可以看出,PWM模式1和PWM模式2的输出电平刚好是相反的。

  有效电平和无效电平:

  在PWM模式1和PWM模式2的介绍中可以看到PWM输出通道输出分为有效电平和无效电平两种状态。有效和无效电平是根据TIMx_CCER捕获/比较使能寄存器的bit1位CCxP来决定是什么状态的。

  当CCxP = 0时,输出通道的有效电平为高电平,无效电平为低电平。

  当CCxP = 1时,输出通道的有效电平为低电平,无效电平为高电平。

  当CCxP = 0时,如果PWM处于模式1的状态下,当TIMx_CNT < TIMx_CCRx时,输出通道输出高电平,当TIMx_CNT >= TIMx_CCRx时,输出通道输出低电平;如果PWM处于模式2的状态下,当TIMx_CNT < TIMx_CCRx时,输出通道输出低电平,当TIMx_CNT >= TIMx_CCRx时,输出通道输出高电平。模式1和模式2刚好相反。

  当CCxP = 1时,如果PWM处于模式1的状态下,当TIMx_CNT < TIMx_CCRx时,输出通道输出低电平,当TIMx_CNT >= TIMx_CCRx时,输出通道输出高电平。如果PWM处于模式2的状态下,当TIMx_CNT < TIMx_CCRx时,输出通道输出高电平,当TIMx_CNT >= TIMx_CCRx时,输出通道输出低电平。模式1和模式2刚好相反。

  在PWM模式1或2下,TIMxCNT寄存器和TIMx_CCRx寄存器始终在进行比较(一句计数器的计数方向)以确定是否符合TIMx_CCRx <= TIMx_CNT或者TIMx_CNT <= TIMx_CCRx。         

  当使能定时器后,计数器开始计数,可以将定时器设置为向上计数、向下计数、向上/向上计数。

  在STM3参考手册中,用边沿对齐模式来指示计数器向上计数、计数器向下计数这两种模式,具体是向上还是向下,需要根据TIMx_CR1寄存器的DIR位来设置,当DIR=0时是向上计数模式;当DIR=1时是向下计数模式。用中央对齐模式来指示计数器向上和向下同时计数的模式。

  通过TIMx_CR1控制寄存器的bit6~bit5位CMS[1:0]来选择是边沿对齐模式还是中央对齐模式。

  PWM边沿对齐模式:

  定时器向上计数:

  当TIMx_CR1寄存器的bit4位DIR为0时,定时器向上计数。

  下图是PWM选择为模式1,有效电平为高电平,OCXREF指示输出的电平状态,TIMx_ARR的值为8,也就是计数器TIMx_CNT递增到8后清0从新计数。

  从图中可以看,当CCRx = 4,若TIMx_CNT < 4,则OCXREF输出的是高电平;若TIMx_CNT >= 4,则OCXREF输出的是低电平。

  当CCRx = 8,若TIMx_CNT < 8,则OCXREF输出高电平;若TIMx_CNT >= 8,则OCXREF输出低电平。

  当CCRx > 8,则TIMx_CNT一直小于CCRx,则OCXREF一直保持高电平。

  当CCRx = 0,则TIMx_CNT一直不小于CCRx,则OCXREF一直保持低电平。

  从图中还可以看到,CCxIF中断状态位的变化,CCRx与TIMx_CNT每比较成功一次就会置位CCxIF,当CCRx > TIMx_CNT或CCRx = 0时,在定时器计数器溢出时,CCxIF会被置位。 

  定时器向下计数: 

  当TIMx_CR1寄存器的bit4位DIR为1时,定时器向下计数。

  这个跟向上计数模式是差不多的,只是计数方向不一样。  

PWM中央对齐模式:

  当TIMx_CR1寄存器中的CMS位不为'00'时,定时器的计数方式为中央对齐模式。

  根据不同的CMS位设置,比较标志可以在计数器向上计数时被置1、在计数器向下计数时被置1、或是在计数器向上和向下计数时被置1。

  当定时器工作在中央对齐模式时,TIMx_CR1寄存器中的计数方向位DIR由硬件更新,DIR变为只读位,不能软件修改。

  如下图是定时器工作在中央对齐模式时的PWM图形:

  进入中央对齐模式时,软件不能同时修改TIMx_CR1寄存器中的DIR位和CMS位。

  使用中央对齐模式最保险的方法,就是在启动计数器之前产生一个软件更新(设置TIMx_EGR寄存器中的UG位),不要在计数器工作的过程中修改计数器的值。

5、通用定时器PWM的配置流程

  1、开启使用到的通用定时器的时钟,配置相应的输出通道的脚位为复用输出,如果脚位需要重映射,还需要根据具体需求进行重映射配置。

  2、通过TIMx_CR1寄存器的bit6~bit5位CMS[1:0]来选择定时器的计数模式,如果设置的是边沿对齐模式,还需要设置TIMx_CR1寄存器的bit4位DIR来选择计数器是向上计数还是向下计数;若选择的是中央对齐模式,则不需要设置DIR位。

  3、通过设置TIMx_ARR寄存器和TIMx_PSC寄存器来决定PWM输出的频率,如果TIMx_ARR寄存器需要使用缓冲功能,还需要将TIMx_CR1的bit7位ARPE位置1。

  4、通过设置TIMx_CCRx捕获/比较寄存器来决定PWM输出的占空比。

  5、通过捕获/比较模式寄存器TIMx_CCMRx配置相应的通道为输出和PWM的模式。这里需要注意的是每个定时器的捕获/比较模式寄存器只有两个,而通道有4个,这是应为TIMx_CCMR1配置的是CH1和CH2;而TIMx_CCMR2配置的CH3和CH4。TIMx_CCMR1寄存器的低8位配置的是CH1,高8位配置的是CH2;而TIMx_CCMR2寄存器的低8位配置的是CH3,高8位配置的是CH4。每8个位配置一个通道,每个通道配置的位都是相同的。通过TIMx_CCMRx寄存器的OCxM[2:0]位选择PWM的工作模式,OCxM[2:0]只有“110”和“111”这两个数值是配置为PWM模式。TIMx_CCMRx寄存器的CCxS[1:0]位用来配置通道是输出还是输入,这里将CCxS[1:0]设置为“00”,将通道配置为输出。

  6、通过捕获/比较使能寄存器TIMx_CCER来配置输出通道的有效电平和使能相应的通道输出PWM。TIMx_CCER寄存器可以配置4个通道,每个通道占的bit位置不同。使用TIMx_CCER寄存器的CCxP位选择输出通道的有效电平的状态。通过置位TIMx_CCER寄存器的CCxE位来开启PWM信号输出到对应的脚位,也可以通过清零CCxE位来禁止PWM输出。

  7、最后置位TIMx_CR1寄存器的bit0位CEN来启动定时器开始计数。

  8、因为这里是配置PWM的输出功能,没有用到中断,所以不需要配置中断。

6、HAL库操作PWM输出

  初始化代码如下:

 1 TIM_HandleTypeDef TIM5_Handler_Init;
 2 TIM_OC_InitTypeDef PWM_Handler_Init;
 3 
 4 void PWM_Init(void)
 5 {
 6     GPIO_InitTypeDef GPIO_InitStruct;
 7 
 8     __HAL_RCC_GPIOA_CLK_ENABLE();
 9     __HAL_RCC_TIM5_CLK_ENABLE();
10     
11     GPIO_InitStruct.Pin = GPIO_PIN_0;
12     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
13     GPIO_InitStruct.Pull = GPIO_NOPULL;
14     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
15     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
16 
17   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);       
18 
19     TIM5_Handler_Init.Instance = TIM5;
20     TIM5_Handler_Init.Init.Prescaler = 7200-1;
21     TIM5_Handler_Init.Init.Period = 1000;
22     TIM5_Handler_Init.Init.CounterMode = TIM_COUNTERMODE_UP;
23     HAL_TIM_Base_Init(&TIM5_Handler_Init);
24     
25     PWM_Handler_Init.OCMode = TIM_OCMODE_PWM1;
26     PWM_Handler_Init.Pulse = 500;
27     PWM_Handler_Init.OCPolarity = TIM_OCPOLARITY_HIGH;
28     PWM_Handler_Init.OCFastMode = TIM_OCFAST_DISABLE;
29     
30     HAL_TIM_PWM_ConfigChannel(&TIM5_Handler_Init,&PWM_Handler_Init,TIM_CHANNEL_1);
31      
32     HAL_TIM_PWM_Start(&TIM5_Handler_Init,TIM_CHANNEL_1);  
33 }

  这里配置的是通用定时器TIM5的通道1来作为PWM输出,对应的IO为PA0。

  第1、2行定义两个结构体变量,TIM5_Handler_Init用来初始化通用定时器,PWM_Handler_Init用来初始化PWM输出通道。

  第8、9行是开启GPIA和TIM5定时器的时钟。

  第11到17行配置的是PA0口为复用输出功能。

  第19到23行配置的是TIM5定时器的自动重装值和预分频的值,还有TIM5定时器计数模式。

  第25到28行配置的是PWM功能,第25行是选择PWM的工作模式;第26行是设置PWM的占空比;第27行是选择通道的有效电平;

  第30行是对PWM输出通道进行初始化。

  第32行是使能PWM信号输出到对应的脚位和启动TIM5定时器。    

原文地址:https://www.cnblogs.com/h1019384803/p/11266546.html