mokongking

pwm输出和输出比较

stm32cubemx配置f103zet6定时器中断,pwm波输出模式,输出捕获模式 慢慢更新 - 百叶集 - 博客园

stm32cubemx配置f103zet6定时器中断,pwm波输出模式,输出捕获模式 慢慢更新

 

定时器详细介绍(基于标准库的,原理部分可参考): STM32-定时器详解_KevinFlyn的博客-CSDN博客_stm32定时器

1. 定时器中断配置 配置参考 STM32CubeMX配置定时器中断_小哥。的博客-CSDN博客_stm32cubemx配置定时器中断

使用内部时钟:internal clock,其它默认

 

定时器计数值更新时间:

 

 

 T为定时时间,Psc为预分频数,Arr为自动重装载寄存器的值,Tclk为定时器的输入时钟。
这里为T为1s,Tclk为72MHz,设置Psc为7200-1,Arr为10000-1。

自动重载值。

 

 

打开中断:(在高级定时器中,选择为:TIMX update interrupt)

 

 

 代码部分:

开启定时器:

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);

中断回调函数:

复制代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 1 */

  if (htim->Instance == TIM3) { //获取触发中断的定时器号
    printf("tim3! \r\n");
  }

  /* USER CODE END Callback 1 */
}
复制代码

2. 定时器PWM波输出模式

参考:(15条消息) STM32CubeMX—PWM波输出实验_FlyDremever的博客-CSDN博客_cube pwm

 

 

 

 内部时钟,配置CH1,CH2通道pwm输出模式,注意自动配置的GPIO口是否是自己想要的,若不是,且目标io口未被占用,可先将该通道disable,再直接点击目标口主动选择,如下图,选择后再在上图进行配置

 

 

 参数配置:

 

 

 

 内部时钟为 72Mhz,72分频后到定时器时钟1Mhz,1us定时器计数一次,从0计数到99,定时器溢出,重装载值,进行下一次计数。

pwm波频率计算:

(图源: PWM波输出实验_FlyDremever的博客-CSDN博客_cube pwm

 

 

 其中:TIMf定时器时基频率,这里为72Mhz,ARR为自动重载值,即Counter Period(AutoReload Register)

由计数比较值控制占空比 Pluse,pwm模式控制极性(输出电平高低):

PWM模式1,在向上计数时,一旦TIMx_CNT < TIMx_CCR1(上面那个pulse) 时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

PWM模式2- 在向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT > TIMx_CCR1时通道1为有效电平,否则为无效电平。

生成代码:

手动开启PWM波输出通道:使用定时器PWM函数组,阻塞模式开启(没用中断和dma配置)

    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);

修改占空比推荐使用寄存器的方式: TIMx->CCRx = NUM;   (x为数字。 NUM 范围0 - ARR)

或者调用函数:_HAL_TIM_SetCompare(&htimx,TIM_CHANNEL_X,X);

__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,50);

建议先关闭定时器在修改值。

3.定时器输出比较模式

参考: STM32CubeMX定时器输出比较模式——输出相位可调矩形波_qq_37405067的博客-CSDN博客_stm32定时器输出比较模式

与pwm波输出方式只能调制占空比相比,输出比较模式只能调整相位,注意这里的频率由于要通过两次比较后电平翻转得到,自动重载值减半。

 

 

 使能通道输出:

    HAL_TIM_OC_Start(&htim3,TIM_CHANNEL_1);
    HAL_TIM_OC_Start(&htim3,TIM_CHANNEL_2);

 

 
 

本期我们介绍剩下其他配置:输入捕获,输出比较,强制输出。

 

2

 

输入捕获

Input Capture顾名思义是输入捕获,它的作用有点类似于外部中断+定时器。其基本作用是捕获外部信号或事件,并记录下该事件发生时定时器的计数值。

利用这个功能我们就可以实现测脉宽(上升沿和下降沿之间的时间),周期,频率等参数。

当我们配置一个通道为输入捕获时,会有四个设置,主要需要关心的是:Polarity Selection捕获模式,Rising Edge即信号上升沿(0->1)触发捕获。

Falling Edge为下降沿触发捕获,BothEdges为双向捕获。

Input Filter为输入滤波器,当我们的输入信号有比较大的噪声或者波动的时候,增加这个值,可以让定时器在延时一段时钟之后再触发捕获(按键消抖)。

 

4

 

强制输出

之前无论是PWM模式也好,输入捕获8模式也好,都需要依赖于定时器的计数值,而不能直接修改引脚的高低电平状态。

而强制输出模式可以强制控制定时器的输出引脚的状态,而不依赖于定时器的正常计数或比较操作,允许你通过软件直接控制定时器的输出引脚,无论定时器的计数器状态或比较寄存器如何。

这在需要强制输出特定信号(如强制输出高电平或低电平)的时候非常有用,特别是在某些控制系统中,要求在特定情况下强制设置输出状态以实现精确控制。

例如我们在点击控制过程中,如果检测到了电机出现故障,此时无论是停止定时器,还是停止PWM功能输出,如果引脚此时处于高电平状态,那么我们是无法让引脚置低的。必须等定时器计数到另一个状态的时候才能让引脚变低。

如果我们采用Force OutPut,就可以通过软件使得手动拉低引脚,防止电机继续工作在故障状态。

 

 

并且模式选择中有着强制拉高和强制拉低两个功能,它的作用是当计数值(CNT)到达设定值时,强制拉高或拉低输出引脚。

它的主要用途包括 紧急停止、同步控制、外部事件处理 等特殊场景,能够提供直接、立即的信号输出控制。

 

3

 

比较输出

比较输出无论是输出引脚配置还是参数配置都和PWM输出都比较接近,这里我们着重介绍一下二者的区别。

PWM模式本身并不复杂,是利用CCR和计数值(CNT)的值来实现输出高低电平。主要用于生成周期性信号,控制信号的占空比,通过调节占空比来控制输出的功率或强度。

 

 

 

而输出比较模式则不一样。通道设置为输出比较模式之后,定时器通过比较计数值与预设值,当两者相等时触发输出信号的改变,定时器会触发一个事件,这个事件后面会说。通常用在占空比比较固定,常用于生成定时脉冲或在特定时刻产生事件。

虽然二者在使用定时器的比较机制上有很多相似性,但它们的核心区别在于占空比控制和输出信号的应用目标。

 

 

可以看到比较输出的模式比较多,但是仔细分析其功能。他是一个功能非常强大功能。Frozen是冻结引脚输出,引脚不输出高低电平。但是当计数值到达比较值时会触发比较输出的中断回调函数

Active Level on match是到达比较值时将引脚设置为高电平(不会主动拉低)。Inactive 则是拉低。

Toggle on match 则是翻转引脚电平,利用这个功能我们可以实现方波输出,但是需要注意的是,每次到达比较值时实现电平翻转,因此方波的频率是我们定时器频率的一半,并且占空比没有PWM那么容易控制。

Froced Active顾名思义就是强制高电平。

因此输出比较更像是一个集大成者,既可以实现PWM模式的方波输出,也可以实现强制输出的强制功能

 
 

posted on 2024-12-30 22:18  虎啸岳林  阅读(8)  评论(0编辑  收藏  举报

导航